{"version":3,"file":"default/js/int_braintree.js","mappings":";;;;;;;;;;AAAa;;AAEb,kBAAkB,mBAAO,CAAC,2GAAc;AACxC,oBAAoB,mBAAO,CAAC,+HAA6B;AACzD,8BAA8B,mBAAO,CAAC,uIAAiC;AACvE;AACA;AACA;;AAEA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC9Ia;;AAEb,oBAAoB,mBAAO,CAAC,+HAA6B;;AAEzD;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA,uDAAuD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACjCa;;AAEb;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;AAEA;AACA;;;;;;;;;;;;ACVa;;AAEb;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;;;;;;;;;;;ACVa;;AAEb,oCAAoC,mBAAO,CAAC,6KAA8C;;AAE1F,gCAAgC,mBAAO,CAAC,iKAAwC;;AAEhF;AACA,6BAA6B,mBAAO,CAAC,+JAAuC;AAC5E,iCAAiC,mBAAO,CAAC,uKAA2C;;AAEpF,4BAA4B,mBAAO,CAAC,uIAA2B;;AAE/D;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChEa;;AAEb;;AAEA,4BAA4B,mBAAO,CAAC,wIAA4B;;AAEhE,2BAA2B,mBAAO,CAAC,8IAAwB;AAC3D,uBAAuB,mBAAO,CAAC,oHAAwB;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;;AAGjC;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;AACA,kEAAkE;AAClE,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjOa;;AAEb,qBAAqB,mBAAO,CAAC,sIAA2B;AACxD,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,6BAA6B,mBAAO,CAAC,kJAA0B;;AAE/D,4BAA4B,mBAAO,CAAC,wIAA4B;;AAEhE;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC5Ca;;AAEb;;AAEA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,kBAAkB;AAC7B,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC/Ea;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,2BAA2B,mBAAO,CAAC,4HAA4B;;AAE/D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;;AAEA;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;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+CAA+C,6DAA6D,EAAE,qCAAqC;AACnJ;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA,2CAA2C,MAAM;AACjD,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACrKa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC9Ba;;AAEb;;AAEA;AACA,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,qBAAqB,mBAAO,CAAC,sIAA2B;AACxD,sCAAsC,mBAAO,CAAC,wKAA4C;AAC1F,aAAa,mBAAO,CAAC,gGAAc;;AAEnC,yCAAyC,mBAAO,CAAC,kLAAiD;;AAElG;AACA,mBAAmB,mBAAO,CAAC,4HAAgB;AAC3C,uBAAuB,mBAAO,CAAC,oIAAoB;;AAEnD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;;;AAIjC;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;;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;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;;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,0BAA0B;AAC1B;;AAEA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,iBAAiB;AACjB,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AClRa;;AAEb;AACA;AACA;AACA;;;;;;;;;;;;ACLa;;AAEb;AACA;AACA;AACA;;;;;;;;;;;;ACLa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;;;;;;;;;;;ACzEa;;AAEb,6BAA6B,mBAAO,CAAC,kJAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnCa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClHa;;AAEb,yCAAyC,mBAAO,CAAC,kLAAiD;;AAElG;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACrGa;;AAEb;AACA;AACA;AACA;;AAEA,qBAAqB,mBAAO,CAAC,wGAAgB;;AAE7C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACjGa;;AAEb;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACrDa;;AAEb;AACA;AACA,+BAA+B,mBAAO,CAAC,wHAAwB;AAC/D,iBAAiB,mBAAO,CAAC,4FAAU;;AAEnC;AACA;AACA;;AAEA;AACA,iCAAiC,mBAAO,CAAC,gHAAoB;AAC7D;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,mBAAO,CAAC,0HAAyB;;AAEnE;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA8B,mBAAO,CAAC,0GAAiB;AACvD,sCAAsC,mBAAO,CAAC,sJAAuC;;AAErF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kCAAkC,mBAAO,CAAC,sHAAuB;;AAEjE;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gCAAgC,mBAAO,CAAC,kHAAqB;;AAE7D;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,6BAA6B,mBAAO,CAAC,sGAAe;;AAEpD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,2BAA2B,mBAAO,CAAC,8FAAW;;AAE9C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,2BAA2B,mBAAO,CAAC,kGAAa;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;AACd;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;;;;;;;;;;;AC9La;;AAEb;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF,gBAAgB;AAChB,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL,gBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;;;;;;;;;;;;;ACnJa;;AAEb,6BAA6B,mBAAO,CAAC,oJAA0B;AAC/D,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,gCAAgC,mBAAO,CAAC,gKAAuC;;AAE/E,mCAAmC,mBAAO,CAAC,oKAAyC;;AAEpF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,SAAS,eAAe,4BAA4B;AACjE,KAAK,aAAa;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;AChVa;AACb,+BAA+B,mBAAO,CAAC,wJAA4B;AACnE,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,uBAAuB,mBAAO,CAAC,4IAA6B;;AAE5D;AACA;AACA,aAAa,QAAQ;AACrB;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;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACjDa;;AAEb;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;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,qBAAqB;AACrB;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,cAAc;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC1Ga;;AAEb,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,6BAA6B,mBAAO,CAAC,kJAA0B;;AAE/D;AACA;;AAEA;AACA,8BAA8B,mBAAO,CAAC,0JAAoC;;AAE1E;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,6BAA6B;AAC7B,qBAAqB;AACrB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,aAAa;AACxB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC7Ia;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,aAAa;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;;;;;;;;;;;ACrFa;;AAEb,gCAAgC,mBAAO,CAAC,gKAAuC;AAC/E,sCAAsC,mBAAO,CAAC,kJAA0B;AACxE,wCAAwC,mBAAO,CAAC,8KAA8C;AAC9F,uBAAuB,mBAAO,CAAC,4IAA6B;;AAE5D;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA,kBAAkB,mBAAO,CAAC,gHAAsB;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;;;;;;;;;;AC7JA;AACa;;AAEb;;AAEA,aAAa,mBAAO,CAAC,gGAAc;AACnC,gCAAgC,mBAAO,CAAC,gKAAuC;AAC/E,wBAAwB,mBAAO,CAAC,sKAA0C;AAC1E,wCAAwC,mBAAO,CAAC,8KAA8C;AAC9F,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,2CAA2C,mBAAO,CAAC,wLAAmD;AACtG,6BAA6B,mBAAO,CAAC,kJAA0B;AAC/D,uBAAuB,mBAAO,CAAC,4IAA6B;;AAE5D;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB,UAAU;AACV;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;;;;;;;;;;;AC1La;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,wCAAwC,mBAAO,CAAC,8KAA8C;AAC9F,uBAAuB,mBAAO,CAAC,4IAA6B;AAC5D,gCAAgC,mBAAO,CAAC,gKAAuC;AAC/E,qCAAqC,mBAAO,CAAC,wKAA2C;;AAExF;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,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC7Ea;;AAEb,kCAAkC,mBAAO,CAAC,4JAA+B;;AAEzE;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC/Da;;AAEb,uBAAuB,mBAAO,CAAC,oHAAwB;;AAEvD;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,aAAa;;AAEb;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClIa;;AAEb;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;AACa;;AAEb;AACA;AACA,sCAAsC,mBAAO,CAAC,mLAAgD;;AAE9F;AACA,qBAAqB,mBAAO,CAAC,6IAA6B;AAC1D,uBAAuB,mBAAO,CAAC,iJAA+B;AAC9D,kCAAkC,mBAAO,CAAC,uKAA0C;AACpF,wBAAwB,mBAAO,CAAC,mJAAgC;;AAEhE;AACA,6BAA6B,mBAAO,CAAC,6KAAmD;AACxF,iCAAiC,mBAAO,CAAC,qLAAuD;;AAEhG;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC1Fa;AACb;AACA;;AAEA,iCAAiC,mBAAO,CAAC,gKAAuC;;AAEhF;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC5Ea;;AAEb,oCAAoC,mBAAO,CAAC,kKAAiC;;AAE7E;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;;ACvJa;;AAEb,6BAA6B,mBAAO,CAAC,oJAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpCa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;;;;;;;;;;AC/Ba;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACjBa;AACb;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjLa;;AAEb;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA,sCAAsC;;AAEtC;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA,sCAAsC;;AAEtC;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxDa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,uBAAuB,mBAAO,CAAC,mIAAoB;AACnD,kCAAkC,mBAAO,CAAC,wKAA2C;;AAErF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClPa;;AAEb,gCAAgC,mBAAO,CAAC,gKAAuC;;AAE/E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACzBa;;AAEb,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,4BAA4B,mBAAO,CAAC,+JAAuC;;AAE3E;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA,8DAA8D;AAC9D;AACA,KAAK;AACL;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpIa;;AAEb,8BAA8B,mBAAO,CAAC,qJAA2B;AACjE,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,sBAAsB,mBAAO,CAAC,yIAA4B;;AAE1D,6BAA6B,mBAAO,CAAC,yIAA4B;;AAEjE;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC5Ca;;AAEb;;AAEA,yBAAyB,mBAAO,CAAC,+IAA+B;;AAEhE;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,uBAAuB;AAClC,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,uBAAuB;AAClC,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvEa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,2BAA2B,mBAAO,CAAC,4HAA4B;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6HAA6H;AAC7H;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+CAA+C,6DAA6D,EAAE,oCAAoC;AAClJ;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;AACA,2CAA2C,MAAM;AACjD,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,aAAa;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC/Ha;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACjDa;;AAEb,sBAAsB,mBAAO,CAAC,yIAA4B;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACzBa;;AAEb;AACA,sBAAsB,mBAAO,CAAC,yIAA4B;AAC1D,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,uCAAuC,mBAAO,CAAC,2KAA6C;AAC5F,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA,oBAAoB,mBAAO,CAAC,2IAA6B;AACzD,wBAAwB,mBAAO,CAAC,mJAAiC;AACjE,8BAA8B,mBAAO,CAAC,+JAAuC;;AAE7E,0CAA0C,mBAAO,CAAC,qLAAkD;;AAEpG;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,0CAA0C;AAC1C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qEAAqE,uCAAuC;AAC5G;AACA;AACA,iBAAiB;AACjB,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACrJa;;AAEb;AACA;;AAEA;AACA,aAAa,mBAAO,CAAC,gGAAc;AACnC,sBAAsB,mBAAO,CAAC,yIAA4B;;AAE1D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC/Da;;AAEb;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNa;;AAEb;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iCAAiC,mBAAO,CAAC,yIAA4B;AACrE;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA,iCAAiC,mBAAO,CAAC,yIAA4B;;AAErE;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;;;;;;;;;;;;ACzFa;;AAEb,6BAA6B,mBAAO,CAAC,mJAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnCa;;AAEb,qCAAqC,mBAAO,CAAC,gLAA+C;;AAE5F,sBAAsB,mBAAO,CAAC,wIAA2B;;AAEzD;AACA,oBAAoB,mBAAO,CAAC,0IAA4B;AACxD,iCAAiC,mBAAO,CAAC,oKAAyC;;AAElF;AACA,6BAA6B,mBAAO,CAAC,gKAAuC;AAC5E,iCAAiC,mBAAO,CAAC,wKAA2C;;AAEpF,6BAA6B,mBAAO,CAAC,wIAA2B;;AAEhE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACnFa;;AAEb;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA,iBAAiB,mBAAO,CAAC,gGAAc;AACvC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzEa;;AAEb,0CAA0C,mBAAO,CAAC,qLAAkD;;AAEpG;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChFa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACvBa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA,UAAU;AACV;AACA;AACA,aAAa;AACb;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,gCAAgC;AAC1F;AACA,qDAAqD,kBAAkB;AACvE;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS,IAAI;;AAEb;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,qDAAqD,OAAO;;AAE5D;;AAEA;AACA,0CAA0C,qBAAqB;AAC/D;AACA;AACA;AACA;;AAEA;AACA;;AAEA,qBAAqB,mBAAO,CAAC,wGAAgB;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA,6CAA6C;;AAE7C;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,gBAAgB,mBAAO,CAAC,4JAA0C;AAClE,eAAe,mBAAO,CAAC,wJAAwC;AAC/D,mBAAmB,mBAAO,CAAC,wKAAgD;AAC3E,qBAAqB,mBAAO,CAAC,4KAAkD;AAC/E,aAAa,mBAAO,CAAC,gJAAoC;AACzD,kBAAkB,mBAAO,CAAC,8IAAmC;AAC7D;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;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;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChBA;;AAEA,gBAAgB,mBAAO,CAAC,yHAAsB;;AAE9C,sBAAsB,mBAAO,CAAC,iIAAmB;;AAEjD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS,QAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC3Fa;;AAEb,gBAAgB,mBAAO,CAAC,yHAAsB;AAC9C,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,wBAAwB,mBAAO,CAAC,qIAAqB;;AAErD,uBAAuB,mBAAO,CAAC,qIAA4B;;AAE3D;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACzCa;;AAEb;;AAEA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5EA;;AAEA;AACA,gBAAgB,mBAAO,CAAC,yHAAsB;AAC9C,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,iCAAiC,mBAAO,CAAC,yJAAsC;;AAE/E,sBAAsB,mBAAO,CAAC,+IAAiC;;AAE/D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACtHa;;AAEb;AACA;AACA;AACA;;;;;;;;;;;;ACLa;;AAEb,uBAAuB,mBAAO,CAAC,qIAA4B;AAC3D,gBAAgB,mBAAO,CAAC,yHAAsB;;AAE9C;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpFa;;AAEb;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACpBa;;AAEb,eAAe,mBAAO,CAAC,mJAAmC;;AAE1D;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,mDAAmD;AAC5F,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxHa;;AAEb,+BAA+B,mBAAO,CAAC,gKAAyC;;AAEhF,sBAAsB,mBAAO,CAAC,8IAAgC;AAC9D,2BAA2B,mBAAO,CAAC,oJAAmC;;AAEtE;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACpBa;;AAEb,uBAAuB,mBAAO,CAAC,gHAAoB;;AAEnD;AACA,0CAA0C,mBAAO,CAAC,wKAAgD;;AAElG;AACA,iCAAiC,mBAAO,CAAC,oIAA8B;AACvE,aAAa,mBAAO,CAAC,4FAAU;AAC/B,sBAAsB,mBAAO,CAAC,kJAAqC;AACnE,gBAAgB,mBAAO,CAAC,0HAAyB;AACjD,kBAAkB,mBAAO,CAAC,kIAA6B;AACvD,qBAAqB,mBAAO,CAAC,8IAAmC;AAChE,uBAAuB,mBAAO,CAAC,8IAAmC;AAClE,sBAAsB,mBAAO,CAAC,mMAAwG;;AAEtI;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;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;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzQa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACzGa;;AAEb;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,SAAS;AACT;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,SAAS;AACT;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;;;;;;;;;;;ACvNa;;AAEb,yBAAyB,mBAAO,CAAC,0IAA8B;AAC/D,6BAA6B,mBAAO,CAAC,8JAAwC;AAC7E,8BAA8B,mBAAO,CAAC,sJAAoC;AAC1E,aAAa,mBAAO,CAAC,gGAAc;AACnC,qBAAqB,mBAAO,CAAC,4GAAoB;;AAEjD;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC7Ga;;AAEb;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,KAAK;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACnJa;;AAEb,sBAAsB,mBAAO,CAAC,oIAA2B;AACzD,6BAA6B,mBAAO,CAAC,8JAAwC;;AAE7E;AACA;AACA,WAAW,SAAS;AACpB;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;;AAEA;AACA;AACA;;;;;;;;;;;;ACzCa;;AAEb,0BAA0B,mBAAO,CAAC,4IAA+B;AACjE,iCAAiC,mBAAO,CAAC,sKAA4C;AACrF,wBAAwB,mBAAO,CAAC,sHAAc;AAC9C,qBAAqB,mBAAO,CAAC,4JAAuC;;AAEpE;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,KAAK;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC3Ga;;AAEb,oCAAoC,mBAAO,CAAC,0IAAwB;AACpE,0CAA0C,mBAAO,CAAC,sJAA8B;AAChF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,EAAE,mBAAO,CAAC,wIAA6B;AACzC,wBAAwB,mBAAO,CAAC,kKAA0C;;AAE1E;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC7Ga;;AAEb,yBAAyB,mBAAO,CAAC,0IAA8B;AAC/D,iCAAiC,mBAAO,CAAC,sKAA4C;AACrF,2BAA2B,mBAAO,CAAC,4HAA4B;AAC/D,kCAAkC,mBAAO,CAAC,oIAAqB;AAC/D,mCAAmC,mBAAO,CAAC,wJAA+B;;AAE1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb,SAAS;;AAET,6CAA6C,iBAAiB;AAC9D;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACtGa;;AAEb,6BAA6B,mBAAO,CAAC,kJAAkC;AACvE,6BAA6B,mBAAO,CAAC,8JAAwC;;AAE7E,kCAAkC,mBAAO,CAAC,wJAA+B;;AAEzE;AACA;AACA,WAAW,SAAS;AACpB;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;;;;;;;;;;;;AC7Ca;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,iCAAiC,mBAAO,CAAC,4JAAuC;;AAEhF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACnCa;;AAEb,8BAA8B,mBAAO,CAAC,sJAAoC;AAC1E,kCAAkC,mBAAO,CAAC,wJAA+B;AACzE,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,6BAA6B,mBAAO,CAAC,8JAAwC;AAC7E,6BAA6B,mBAAO,CAAC,8JAAwC;AAC7E,iCAAiC,mBAAO,CAAC,sKAA4C;AACrF,wBAAwB,mBAAO,CAAC,kKAA0C;AAC1E,qBAAqB,mBAAO,CAAC,4JAAuC;AACpE,+BAA+B,mBAAO,CAAC,wJAAqC;;AAE5E;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8EAA8E;AAC9E;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjJa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0EAA0E;AAC1E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB,yBAAyB,gBAAgB,yBAAyB;AACnF,UAAU;AACV;AACA,iBAAiB,yBAAyB,gBAAgB,eAAe;AACzE;;AAEA,aAAa,yBAAyB;AACtC;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AChHa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACzEa;;AAEb,6BAA6B,mBAAO,CAAC,gJAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;;;;;;;;;;;AClDa;;AAEb,6BAA6B,mBAAO,CAAC,gJAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;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;;;AAGA;;;;;;;;;;;;ACpDa;;AAEb,6BAA6B,mBAAO,CAAC,gJAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,cAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACzCa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC7Ea;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;ACda;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,UAAU;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC1Pa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChFa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC5Fa;;AAEb,wBAAwB,mBAAO,CAAC,yJAAiC;AACjE,gCAAgC,mBAAO,CAAC,iJAA6B;;AAErE;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC7La;;AAEb,wBAAwB,mBAAO,CAAC,yJAAiC;;AAEjE;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;;;;;;;;;;;;AClBa;;AAEb;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2CAA2C,6DAA6D,EAAE,qCAAqC;AAC/I;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,uCAAuC,MAAM;AAC7C,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACjJa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvEa;;AAEb;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACtBa;;AAEb,sBAAsB,mBAAO,CAAC,4HAAmB;AACjD,aAAa,mBAAO,CAAC,gGAAc;AACnC,+BAA+B,mBAAO,CAAC,wJAAqC;AAC5E,wBAAwB,mBAAO,CAAC,kKAA0C;;AAE1E;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;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB,SAAS;AACT;AACA;;AAEA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpHa;;AAEb;;AAEA,yBAAyB,mBAAO,CAAC,sJAAoC;AACrE,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,qBAAqB,mBAAO,CAAC,4JAAuC;;AAEpE,qBAAqB,mBAAO,CAAC,4GAAoB;;AAEjD;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,mCAAmC;;AAEjF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,GAAG;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnPa;;AAEb,yBAAyB,mBAAO,CAAC,kIAAsB;;AAEvD;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;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;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxDa;;AAEb,sBAAsB,mBAAO,CAAC,4HAAmB;AACjD,aAAa,mBAAO,CAAC,gGAAc;AACnC,gCAAgC,mBAAO,CAAC,0JAAsC;AAC9E,wBAAwB,mBAAO,CAAC,kKAA0C;AAC1E,uBAAuB,mBAAO,CAAC,wIAA6B;;AAE5D;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;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;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;;;;;;;;;;;;AC3Ja;;AAEb,sBAAsB,mBAAO,CAAC,4HAAmB;AACjD,+BAA+B,mBAAO,CAAC,wJAAqC;AAC5E,wBAAwB,mBAAO,CAAC,kKAA0C;AAC1E,oBAAoB,mBAAO,CAAC,4JAAuC;;AAEnE;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;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;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;;;;;;;;;;;;ACvHa;;AAEb,sBAAsB,mBAAO,CAAC,4HAAmB;AACjD,yBAAyB,mBAAO,CAAC,kIAAsB;AACvD,mCAAmC,mBAAO,CAAC,gKAAyC;AACpF,qBAAqB,mBAAO,CAAC,4JAAuC;;AAEpE;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;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;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjFa;;AAEb,wBAAwB,mBAAO,CAAC,+IAAgC;AAChE,yBAAyB,mBAAO,CAAC,iJAAiC;AAClE,qBAAqB,mBAAO,CAAC,yIAA6B;AAC1D,wBAAwB,mBAAO,CAAC,+IAAgC;AAChE,yBAAyB,mBAAO,CAAC,iJAAiC;;AAElE;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC/Da;AACb;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;;;;;;;;;;;;ACrDa;;AAEb,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,gBAAgB,mBAAO,CAAC,uHAAsB;AAC9C,6BAA6B,mBAAO,CAAC,4KAAoD;;AAEzF;AACA,6BAA6B,mBAAO,CAAC,2JAAwC;AAC7E,sBAAsB,mBAAO,CAAC,iIAA2B;;AAEzD;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACxCa;;AAEb,gBAAgB,mBAAO,CAAC,uHAAsB;AAC9C,qBAAqB,mBAAO,CAAC,4GAAoB;;AAEjD;AACA,mBAAmB,mBAAO,CAAC,2HAAwB;AACnD,6BAA6B,mBAAO,CAAC,2JAAwC;;AAE7E;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AC1Ca;;AAEb,gBAAgB,mBAAO,CAAC,uHAAsB;AAC9C,qBAAqB,mBAAO,CAAC,4GAAoB;;AAEjD;AACA,uBAAuB,mBAAO,CAAC,mIAA4B;AAC3D,iCAAiC,mBAAO,CAAC,mKAA4C;;AAErF;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACrDa;;AAEb,gBAAgB,mBAAO,CAAC,uHAAsB;AAC9C,oBAAoB,mBAAO,CAAC,+HAA0B;;AAEtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACvBa;;AAEb;AACA,aAAa,mBAAO,CAAC,gGAAc;AACnC,oBAAoB,mBAAO,CAAC,+HAA0B;AACtD,gBAAgB,mBAAO,CAAC,uHAAsB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC3Da;;AAEb;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;;;;;;;;;;;AC9Ea;;AAEb,6BAA6B,mBAAO,CAAC,6IAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mCAAmC,6DAA6D,EAAE,qCAAqC;AACvI;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA,+BAA+B,MAAM;AACrC,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClFa;;AAEb,6BAA6B,mBAAO,CAAC,6IAA0B;;AAE/D;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7Ca;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,YAAY;AACvB;AACA;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC9Ea;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,oBAAoB,mBAAO,CAAC,sHAAiB;AAC7C,sBAAsB,mBAAO,CAAC,0HAAmB;;AAEjD;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AChNA,aAAa,mBAAO,CAAC,gGAAc;;AAEnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC7Ha;;AAEb,mBAAmB,mBAAO,CAAC,iIAA2B;AACtD,2BAA2B,mBAAO,CAAC,4HAA4B;;AAE/D;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACnEa;;AAEb,mBAAmB,mBAAO,CAAC,mHAAgB;AAC3C,6BAA6B,mBAAO,CAAC,4KAAoD;;AAEzF;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,iBAAiB;AACjB,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;;;;;;;;;;;AC3Fa;;AAEb,sBAAsB,mBAAO,CAAC,6IAAiC;AAC/D,uBAAuB,mBAAO,CAAC,oHAAwB;;AAEvD;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA,mCAAmC;AACnC;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,SAAS;AACT;AACA;AACA,SAAS;AACT;;AAEA;;;;;;;;;;;;ACvHa;;AAEb,mBAAmB,mBAAO,CAAC,mHAAgB;AAC3C,gBAAgB,mBAAO,CAAC,uHAAsB;AAC9C,iCAAiC,mBAAO,CAAC,yJAAuC;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;;;;;;;;;;;ACzCa;;AAEb,mBAAmB,mBAAO,CAAC,mHAAgB;;AAE3C;AACA,gBAAgB,mBAAO,CAAC,uHAAsB;AAC9C,aAAa,mBAAO,CAAC,gGAAc;;AAEnC,iCAAiC,mBAAO,CAAC,6IAAiC;;AAE1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACxDa;;AAEb,uBAAuB,mBAAO,CAAC,iHAAqB;AACpD,gBAAgB,mBAAO,CAAC,sHAAqB;;AAE7C;AACA,iBAAiB,mBAAO,CAAC,8HAAyB;AAClD,kBAAkB,mBAAO,CAAC,wHAAsB;AAChD,wBAAwB,mBAAO,CAAC,gIAA0B;AAC1D,oBAAoB,mBAAO,CAAC,wHAAsB;;;AAGlD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACtDa;;AAEb,wBAAwB,mBAAO,CAAC,qIAAqB;AACrD,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,sBAAsB,mBAAO,CAAC,2IAA+B;AAC7D,kBAAkB,mBAAO,CAAC,6HAAwB;AAClD,wBAAwB,mBAAO,CAAC,mJAAmC;;AAEnE;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,UAAU;AACrB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClFa;;AAEb,0BAA0B,mBAAO,CAAC,yIAAuB;AACzD,uBAAuB,mBAAO,CAAC,oHAAwB;AACvD,kBAAkB,mBAAO,CAAC,6HAAwB;;AAElD;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACvCa;;AAEb;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA,oCAAoC,yBAAyB;AAC7D;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC1Da;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,kBAAkB,mBAAO,CAAC,mIAA2B;AACrD,kBAAkB,mBAAO,CAAC,6HAAwB;AAClD,wBAAwB,mBAAO,CAAC,mJAAmC;;AAEnE;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,SAAS;AACT,iBAAiB,cAAc;AAC/B;;AAEA;AACA,SAAS;AACT;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACrIa;;AAEb,wBAAwB,mBAAO,CAAC,mJAAmC;AACnE,kBAAkB,mBAAO,CAAC,6HAAwB;;AAElD;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,aAAa;;AAEb;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACxEa;;AAEb,qBAAqB,mBAAO,CAAC,4GAAoB;AACjD,kBAAkB,mBAAO,CAAC,uHAAe;AACzC,gBAAgB,mBAAO,CAAC,mHAAa;AACrC,kBAAkB,mBAAO,CAAC,6HAAwB;AAClD,0BAA0B,mBAAO,CAAC,uIAAuB;AACzD,wBAAwB,mBAAO,CAAC,mJAAmC;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,mEAAmE,yBAAyB;;AAE5F;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AClGa;;AAEb,kBAAkB,mBAAO,CAAC,6HAAwB;;AAElD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AClCa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,mBAAmB,mBAAO,CAAC,yHAAgB;AAC3C,oBAAoB,mBAAO,CAAC,2HAAiB;AAC7C,qBAAqB,mBAAO,CAAC,uIAA6B;AAC1D,4BAA4B,mBAAO,CAAC,iJAAkC;AACtE,wBAAwB,mBAAO,CAAC,mJAAmC;;AAEnE;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACpCa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,kBAAkB,mBAAO,CAAC,6HAAwB;;AAElD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACnDa;;AAEb;AACA;AACA;AACA;;;;;;;;;;;;ACLa;;AAEb;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,uHAAuH;AACvH;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC7Fa;;AAEb,aAAa,mBAAO,CAAC,gGAAc;AACnC,wBAAwB,mBAAO,CAAC,mJAAmC;;AAEnE;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,MAAM;AAChC,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpLa;;AAEb,qBAAqB,mBAAO,CAAC,uIAA6B;;AAE1D;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACxBa;;AAEb;AACA;AACA,iCAAiC,mBAAO,CAAC,oKAA2C;;AAEpF;AACA,mBAAmB,mBAAO,CAAC,oIAA2B;AACtD,oBAAoB,mBAAO,CAAC,sIAA4B;;AAExD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrCA;AACA,IAAI,KAAyC;AAC7C,IAAI,iCAAO,EAAE,mCAAE;AACf;AACA,KAAK;AAAA,kGAAC,GAAG,CAGsD;AAC/D,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,yBAAyB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA,6BAA6B,gEAAgE;AAC7F;AACA;AACA;AACA,CAAC;;;;;;UCzGD;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;;;;;ACtBA,mBAAO,CAAC,oHAA2B;;;;;;;;ACAnC,mBAAO,CAAC,yEAAe,IAAI","sources":["webpack://sfra-startup-kit/./cartridges/app_custom_fraserhart/cartridge/client/default/js/checkout/customer.js","webpack://sfra-startup-kit/./cartridges/app_custom_fraserhart/cartridge/client/default/js/checkout/formErrors.js","webpack://sfra-startup-kit/./cartridges/app_custom_fraserhart/cartridge/client/default/js/components/errorNotification.js","webpack://sfra-startup-kit/./cartridges/app_custom_fraserhart/cartridge/client/default/js/components/scrollAnimate.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/applePay.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/braintreesdk/braintreeApplePayModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/braintreesdk/braintreeApplePayModelBuilder.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/braintreesdk/braintreeApplePaySDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/components/applePayCart.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/components/applePayCheckout.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/components/applePayPaymentProcessing.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/constants/applePayPaymentProcessingConstants.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/constants/errorMessages.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/errorhandler/errorHandlingBaseModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/errorhandler/errorHandlingCheckoutModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/helpers/applePayHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/applepay/helpers/applePayPaymentProcessingHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/braintreeAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/braintreeGeneral.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/braintreeSFRA.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/braintreeUtils.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/braintreesdk/braintreeCreditCardModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/braintreesdk/braintreeCreditCardModelBuilder.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/braintreesdk/braintreeCreditCardSDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardFields.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardList.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardPaymentProcessing.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardVaultManager.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/components/creditCardVaultManagerModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/constants/creditCardPaymentProcessingConstants.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/creditCard.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/errorhandler/creditCardFormFieldsValidator.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/errorhandler/errorHandlingBaseModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/errorhandler/errorHandlingCheckoutModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/braintreeCreditCardSdkHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardAccountHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardFormFieldsHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardPaymentProcessingHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/creditcard/helpers/creditCardSessionAccountHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/braintreesdk/braintreeGooglePayModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/braintreesdk/braintreeGooglePayModelBuilder.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/braintreesdk/braintreeGooglePaySDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/components/googlePayCart.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/components/googlePayCheckout.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/components/googlePayList.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/components/googlePayPaymentProcessing.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/components/googlePaySessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/constants/errorMessages.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/constants/googlePayPaymentProcessingConstants.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/errorhandler/errorHandlingBaseModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/errorhandler/errorHandlingCheckoutModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/googlePay.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/helpers/googlePayHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/helpers/googlePayPaymentProcessingHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/googlepay/helpers/googlePaySDKHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/helper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/loaderHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/braintreesdk/braintreeLpmModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/braintreesdk/braintreeLpmModelBuilder.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/braintreesdk/braintreeLpmSDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/components/lpmPaymentProcessing.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/constants/errorMessages.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/errorhandler/lpmErrorHandler.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/helpers/lpmHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/helpers/lpmPaymentProcessorHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/local/lpm.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paymentMethodGeneral.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paymentMethodGeneralHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/braintreesdk/braintreePayPalSDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalAccountPage.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalButtonDisplayBehavior.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalCartPage.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalCheckoutPage.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalList.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalMiniCartPage.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalProductPage.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalStaticImage.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/components/payPalStoredBillingAddress.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/errorhandler/errorHandlingBaseModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/errorhandler/errorHandlingCartModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/errorhandler/errorHandlingCheckoutModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/errorhandler/errorHandlingMiniCartModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalAccountModelHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalAccountPageHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalBillingFormHelperGlobal.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalCheckoutModelHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalExpressModelHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalListHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalProductPageModelHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalRequestsHelperGlobal.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalSessionAccountHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/helpers/payPalStaticImageHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/models/payPalAccountModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/models/payPalBaseModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/models/payPalCartModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/models/payPalCheckoutModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/models/payPalExpressModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/models/payPalProductPageModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/paypal/payPal.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/braintreesdk/braintreeSrcSDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/components/srcAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/components/srcCart.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/components/srcCheckout.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/components/srcList.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/components/srcSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/constants/srcConstants.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/errorhandler/errorHandlingBaseModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/errorhandler/errorHandlingCartModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/errorhandler/errorHandlingCheckoutModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/helpers/srcButtonHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/helpers/srcHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/helpers/srcListHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/helpers/srcPaymentProcessingHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/models/srcAccountModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/models/srcBaseModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/models/srcCartModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/models/srcCheckoutModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/src/src.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/braintreesdk/braintreeVenmoModel.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/braintreesdk/braintreeVenmoModelBuilder.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/braintreesdk/braintreeVenmoSDK.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/components/venmoAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/components/venmoButton.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/components/venmoCheckout.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/components/venmoList.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/components/venmoProcessing.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/components/venmoSessionAccount.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/constants/venmoConstants.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/errorhandler/venmoErrorHandler.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/helpers/venmoHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/helpers/venmoProcessingHelper.js","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/braintree/venmo/venmo.js","webpack://sfra-startup-kit/./node_modules/svg4everybody/dist/svg4everybody.js","webpack://sfra-startup-kit/webpack/bootstrap","webpack://sfra-startup-kit/./cartridges/int_braintree/cartridge/client/default/js/int_braintree.js","webpack://sfra-startup-kit/./node_modules/svg-spritemap-webpack-plugin/svg4everybody-helper.js"],"sourcesContent":["'use strict';\n\nvar formHelpers = require('./formErrors');\nvar scrollAnimate = require('../components/scrollAnimate');\nvar createErrorNotification = require('../components/errorNotification');\nvar GUEST_FORM = '#guest-customer';\nvar REGISTERED_FORM = '#registered-customer';\nvar ERROR_SECTION = '.customer-error';\n\n/**\n * @returns {boolean} If guest is active, registered is not visible\n */\nfunction isGuestFormActive() {\n return $(REGISTERED_FORM).hasClass('d-none');\n}\n\n/**\n * Clear any previous errors in the customer form.\n */\nfunction clearErrors() {\n $(ERROR_SECTION).children().remove();\n formHelpers.clearPreviousErrors('.customer-information-block');\n}\n\n/**\n * @param {Object} customerData - data includes checkout related customer information\n * @param {Object} orderData - data includes checkout related order information\n */\nfunction updateCustomerInformation(customerData, orderData) {\n var $container = $('.customer-summary');\n var $summaryDetails = $container.find('.summary-details');\n var email = customerData.profile && customerData.profile.email ? customerData.profile.email : orderData.orderEmail;\n $summaryDetails.find('.customer-summary-email').text(email);\n if (customerData.registeredUser) {\n $container.find('.edit-button').hide();\n } else {\n $container.find('.edit-button').show();\n }\n}\n\n\n/**\n * Handle response from the server for valid or invalid form fields.\n * @param {Object} defer - the deferred object which will resolve on success or reject.\n * @param {Object} data - the response data with the invalid form fields or\n * valid model data.\n */\nfunction customerFormResponse(defer, data) {\n var parentForm = isGuestFormActive() ? GUEST_FORM : REGISTERED_FORM;\n var formSelector = '.customer-section ' + parentForm;\n\n // highlight fields with errors\n if (data.error) {\n if (data.fieldErrors.length) {\n data.fieldErrors.forEach(function (error) {\n if (Object.keys(error).length) {\n formHelpers.loadFormErrors(formSelector, error);\n }\n });\n }\n\n if (data.customerErrorMessage) {\n createErrorNotification(ERROR_SECTION, data.customerErrorMessage);\n }\n\n if (data.fieldErrors.length || data.customerErrorMessage || (data.serverErrors && data.serverErrors.length)) {\n defer.reject(data);\n }\n\n if (data.cartError) {\n window.location.href = data.redirectUrl;\n defer.reject();\n }\n } else {\n // Populate the Address Summary\n\n $('body').trigger('checkout:updateCheckoutView', {\n order: data.order,\n customer: data.customer,\n csrfToken: data.csrfToken\n });\n scrollAnimate($('.shipping-form'));\n defer.resolve(data);\n }\n}\n\n/**\n *\n * @param {boolean} registered - wether a registered login block will be used\n */\nfunction chooseLoginBlock(registered) {\n $(ERROR_SECTION).find('.alert').remove();\n $('#password').val('');\n if (registered) {\n $(REGISTERED_FORM).removeClass('d-none');\n $(GUEST_FORM).addClass('d-none');\n $('#email').val($('#email-guest').val());\n } else {\n $(REGISTERED_FORM).addClass('d-none');\n $(GUEST_FORM).removeClass('d-none');\n $('#email').val('');\n }\n}\n\nmodule.exports = {\n\n /**\n * Listeners for customer form\n */\n initListeners: function () {\n // 1. password\n var customerLogin = '.js-login-customer';\n var cancelLogin = '.js-cancel-login';\n var registered;\n if (customerLogin.length !== 0) {\n $('body').on('click', customerLogin, function (e) {\n registered = true;\n e.preventDefault();\n chooseLoginBlock(registered);\n });\n }\n if (cancelLogin.length !== 0) {\n $('body').on('click', cancelLogin, function (e) {\n registered = false;\n e.preventDefault();\n chooseLoginBlock(registered);\n });\n }\n },\n\n methods: {\n clearErrors: clearErrors,\n updateCustomerInformation: updateCustomerInformation,\n customerFormResponse: customerFormResponse,\n isGuestFormActive: isGuestFormActive\n },\n\n vars: {\n GUEST_FORM: GUEST_FORM,\n REGISTERED_FORM: REGISTERED_FORM\n }\n\n};\n","'use strict';\n\nvar scrollAnimate = require('../components/scrollAnimate');\n\n/**\n * Display error messages and highlight form fields with errors.\n * @param {string} parentSelector - the form which contains the fields\n * @param {Object} fieldErrors - the fields with errors\n */\nfunction loadFormErrors(parentSelector, fieldErrors) { // eslint-disable-line\n // Display error messages and highlight form fields with errors.\n $.each(fieldErrors, function (attr) {\n $('*[name=' + attr + ']', parentSelector)\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n .html(fieldErrors[attr]);\n });\n // Animate to top of form that has errors\n scrollAnimate($(parentSelector));\n}\n\n/**\n * Clear the form errors.\n * @param {string} parentSelector - the parent form selector.\n */\nfunction clearPreviousErrors(parentSelector) {\n $(parentSelector).find('.form-control.is-invalid').removeClass('is-invalid');\n $('.error-message').hide();\n}\n\nmodule.exports = {\n loadFormErrors: loadFormErrors,\n clearPreviousErrors: clearPreviousErrors\n};\n","'use strict';\n\nmodule.exports = function (element, message) {\n var errorHtml = '
' +\n '' + message + '
';\n\n $(element).append(errorHtml);\n};\n","'use strict';\n\nmodule.exports = function (element) {\n var position = element && element.length ? element.offset().top + -100 : 0;\n $('html, body').animate({\n scrollTop: position\n }, 500);\n if (!element) {\n $('.logo-home').focus();\n }\n};\n","'use strict';\n\nvar braintreeApplePayModelBuilder = require('./braintreesdk/braintreeApplePayModelBuilder');\n\nvar applePayPaymentProcessing = require('./components/applePayPaymentProcessing');\n\n// Models\nvar ErrorHandlingBaseModel = require('./errorhandler/errorHandlingBaseModel');\nvar ErrorHandlingCheckoutModel = require('./errorhandler/errorHandlingCheckoutModel');\n\nvar applePayErrorMessages = require('./constants/errorMessages');\n\nvar braintreeApplePayModelResponse;\nvar applePayMessages;\n\n/**\n * Inits Apple Pay on the Checkout Page\n */\nfunction initCheckout() {\n var errorHandlingCheckoutModel = new ErrorHandlingCheckoutModel(applePayMessages);\n\n if (!braintreeApplePayModelResponse || braintreeApplePayModelResponse.error) {\n var error = braintreeApplePayModelResponse.error || applePayErrorMessages.NO_APPLE_PAY_BRAINTREE_CONFIGURATIONS;\n errorHandlingCheckoutModel.applePayErrorHandler(error);\n }\n\n applePayPaymentProcessing.init(\n braintreeApplePayModelResponse.btApplePayModel,\n errorHandlingCheckoutModel\n );\n}\n\n/**\n * Inits Apple Pay on the Cart Page\n */\nfunction initCart() {\n var errorHandlingBaseModel = new ErrorHandlingBaseModel(applePayMessages);\n\n if (!braintreeApplePayModelResponse || braintreeApplePayModelResponse.error) {\n var error = braintreeApplePayModelResponse.error || applePayErrorMessages.NO_APPLE_PAY_BRAINTREE_CONFIGURATIONS;\n errorHandlingBaseModel.applePayErrorHandler(error);\n }\n\n applePayPaymentProcessing.init(\n braintreeApplePayModelResponse.btApplePayModel,\n errorHandlingBaseModel\n );\n}\n\n/**\n * Inits Apple Pay on the Cart/Billing-Checkout Pages\n */\nfunction init() {\n braintreeApplePayModelResponse = braintreeApplePayModelBuilder.init();\n\n if (!braintreeApplePayModelResponse.error) {\n applePayMessages = braintreeApplePayModelResponse.btApplePayConfigs.messages;\n }\n}\n\nmodule.exports = {\n init,\n initCart,\n initCheckout\n};\n","'use strict';\n\n/* global Promise braintree $ */\n\nvar applePayErrorMessages = require('../constants/errorMessages');\n\nvar braintreeApplePaySDK = require('./braintreeApplePaySDK');\nvar braintreeGeneral = require('../../braintreeGeneral');\n\n// Global variables\n// Is Froud tools enabled\nvar isFtEnabled;\nvar btClientInstancePromise;\nvar apInstance;\nvar amount;\nvar billingContact;\nvar shippingContact;\nvar config = window.dw.applepay;\nvar action = config.action;\n/** Latest Apple Pay request data to use to create a session. */\nvar request;\n/** Request object that gets updated with new data from server responses. */\nvar updatedRequest;\n// set updatedRequest to request\nupdatedRequest = Object.assign({}, request);\n\n\n/**\n * Init braintree Apple Pay model\n * @param {Promise} braintreeClientInstancePromise Braintreee client instance promise\n * @param {boolean} isFraudToolsEnabled Is fraud tools enabled value\n */\nfunction init(braintreeClientInstancePromise, isFraudToolsEnabled) {\n braintreeApplePaySDK.init(braintreeClientInstancePromise);\n\n btClientInstancePromise = braintreeClientInstancePromise;\n isFtEnabled = isFraudToolsEnabled;\n}\n\n/**\n * Returns fraud data from dataCollector payload\n * @returns {Object} Payload with fraud data\n */\nfunction collectFraudData() {\n var response;\n\n if (isFtEnabled) {\n response = braintreeGeneral.collectFraudData(btClientInstancePromise);\n } else {\n response = Promise.resolve({\n customMessage: applePayErrorMessages.FRAUD_DATA_CELLECTION_ISNOT_ENABLED\n });\n }\n\n return response;\n}\n\n/**\n * Preparing Apple Pay payment\n * @param {Object} ApplePaySession Apple Pay session\n * @returns {Promise} Promise with 'canMakePayments' boolean value\n */\nfunction initApplePay(ApplePaySession) {\n return braintreeApplePaySDK.createApplePayPayment()\n .then(function (applePayInstance) {\n apInstance = applePayInstance;\n\n return ApplePaySession.canMakePaymentsWithActiveCard(applePayInstance.merchantIdentifier);\n });\n}\n\n/**\n * Merges a payment request with Braintree defaults to return an {external:ApplePayPaymentRequest}\n * @param {Object} applePayConfigs Apple Pay config object\n * @returns {Object} Payment request object\n */\nfunction createPaymentDataRequest(applePayConfigs) {\n return braintreeApplePaySDK.createPaymentDataRequest(apInstance, applePayConfigs, amount, billingContact, shippingContact);\n}\n\n/**\n * Validates merchant website, as required by ApplePaySession before payment can be authorized\n * @param {Object} sessionEvent Apple Pay session event\n * @param {Object} applePayConfigs Apple Pay config object\n * @returns {Promise} Promise with merchant session\n */\nfunction onValidateMerchant(sessionEvent, applePayConfigs) {\n return braintreeApplePaySDK.performValidation(apInstance, sessionEvent, applePayConfigs);\n}\n\n/**\n * Tokenizes an Apple Pay payment\n * @param {Object} sessionEvent Apple Pay session event\n * @returns {Promise} Promise with tokenized payload\n */\nfunction onPaymentAuthorized(sessionEvent) {\n return braintreeApplePaySDK.tokenize(apInstance, sessionEvent);\n}\n\n/**\n * Update order amount\n * @param {Object} applePayConfigs Apple Pay config object\n */\nfunction updateApplePayAmount(applePayConfigs) {\n $.ajax({\n url: applePayConfigs.getOrderInfoUrl,\n async: false,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n amount = data.amount;\n },\n error: function () {\n window.location.reload();\n }\n });\n}\n\n/**\n * Update order addresses\n * @param {Object} applePayConfigs Apple Pay config object\n */\nfunction updateApplePayAddresses(applePayConfigs) {\n $.ajax({\n url: applePayConfigs.getOrderInfoUrl,\n async: false,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n var shippingAddress = data.shippingAddress;\n\n if (shippingAddress) {\n shippingContact = {\n familyName: shippingAddress.lastName,\n givenName: shippingAddress.firstName,\n phoneNumber: shippingAddress.phone,\n addressLines: [\n shippingAddress.line1,\n shippingAddress.line2\n ],\n countryCode: shippingAddress.countryCode,\n postalCode: shippingAddress.postalCode,\n locality: shippingAddress.state\n };\n }\n },\n error: function () {\n window.location.reload();\n }\n });\n}\n\nfunction onShippingContactSelected (e) {\n return postJson(action.onshippingcontactselected, filterEvent(e));\n}\n\nfunction onPaymentAuthorizedDwApplepay (e) {\n return postJson(action.onpaymentauthorized, filterEvent(e));\n}\n\nfunction onShippingMethodSelected (e) {\n return postJson(action.onshippingmethodselected, filterEvent(e));\n}\n\nfunction postJson (url, data) {\n var json = data;\n if (typeof data === 'object') {\n json = JSON.stringify(data);\n } else if (typeof data !== 'string') {\n throw new Error('Data must be an object or a JSON string.');\n }\n return fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: json\n }).then(handleResponse);\n}\n\n/** Filter out properties that are not from Event prototype,\n * and include all others as ownProperty to a new object.\n * @param {Event} e\n * @return {Object} object with relevant properties as ownProperty\n */\nfunction filterEvent (e) {\n var filteredEvent = {};\n for (var prop in e) {\n /* global Event */\n if (!Event.prototype.hasOwnProperty(prop)) {\n filteredEvent[prop] = e[prop];\n }\n }\n return filteredEvent;\n}\n\nfunction handleResponse (response) {\n return response.json()\n .then(function (json) {\n if (response.status >= 200 && response.status < 300) {\n // Return success JSON response\n return json;\n }\n\n // Throw error with response status\n var err = new Error(json ? json.status : 'Request error');\n err.response = json;\n throw err;\n });\n}\n\nmodule.exports = {\n init,\n collectFraudData,\n initApplePay,\n createPaymentDataRequest,\n onValidateMerchant,\n onPaymentAuthorized,\n updateApplePayAmount,\n updateApplePayAddresses,\n onShippingContactSelected,\n onShippingMethodSelected,\n onPaymentAuthorizedDwApplepay\n};\n","'use strict';\n\nvar applePayHelper = require('../helpers/applePayHelper');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar braintreeApplePayModel = require('./braintreeApplePayModel');\n\nvar applePayErrorMessages = require('../constants/errorMessages');\n\n/**\n * Initialize Braintree Apple Pay Model. Pattern Builder is used\n * @returns {Object} Object with booleam \"error\" flag and \"message\" attribute with error message\n */\nfunction init() {\n var braintreeApplePayConfigs = applePayHelper.getBraintreeApplePayConfigs();\n var clientToken;\n var btClientInstancePromise;\n var response = {\n error: false,\n message: '',\n btApplePayModel: null,\n btApplePayConfigs: null\n };\n\n if (braintreeApplePayConfigs) {\n clientToken = braintreeApplePayConfigs.clientToken;\n btClientInstancePromise = braintreeGeneral.createClientInstance(clientToken);\n\n braintreeApplePayModel.init(\n btClientInstancePromise,\n braintreeApplePayConfigs.isFraudToolsEnabled\n );\n\n response.btApplePayModel = braintreeApplePayModel;\n response.btApplePayConfigs = braintreeApplePayConfigs;\n } else {\n response.error = true;\n response.message = applePayErrorMessages.NO_APPLE_PAY_BRAINTREE_CONFIGURATIONS;\n }\n\n return response;\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n/* global braintreeUtils braintree $ */\n\nvar btClientInstancePromise;\n\n/**\n * Creates Apple Pay payment instance\n * @returns {Promise} A promise resolve with the Apple Pay instance\n */\n\nfunction createApplePayPayment() {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.applePay.create({\n client: btClientInstance\n });\n });\n}\n\n/**\n * Creates a configuration object for creation an Apple Pay session\n * @param {applePayInstance} applePayInstance Apple Pay instance\n * @param {Object} applePayConfigs Apple Pay configs object\n * @param {number} amount Order total amount\n * @returns {Object} Configuration object\n */\nfunction createPaymentDataRequest(applePayInstance, applePayConfigs, amount, billingContact, shippingContact) {\n return applePayInstance.createPaymentRequest({\n total: {\n label: applePayConfigs.options.displayName,\n amount: amount\n },\n billingContact: billingContact,\n shippingContact: shippingContact\n });\n}\n\n/**\n * Validates merchant website, as required by Apple Pay Session before payment can be authorized\n * @param {applePayInstance} applePayInstance Apple Pay instance\n * @param {Object} sessionEvent Apple Pay session event\n * @param {Object} applePayConfigs Apple Pay configs object\n * @returns {Promise} Promise that resolve with 'merchantSession'\n */\nfunction performValidation(applePayInstance, sessionEvent, applePayConfigs) {\n return applePayInstance.performValidation({\n validationURL: sessionEvent.validationURL,\n displayName: applePayConfigs.options.displayName\n });\n}\n\n/**\n * Tokenizes an Apple Pay payment\n * @param {applePayInstance} applePayInstance Apple pay instance\n * @param {Object} sessionEvent Apple pay session event\n * @returns {Promise} Promise that resolve with 'tokenizePayload'\n */\nfunction tokenize(applePayInstance, sessionEvent) {\n return applePayInstance.tokenize({\n token: sessionEvent.payment.token\n });\n}\n\n/**\n * Inits braintreeApplePaySDK with client instance promise\n * @param {Promise} braintreeClientInstancePromise Braintree client instance promise\n */\n\nfunction init(braintreeClientInstancePromise) {\n btClientInstancePromise = braintreeClientInstancePromise;\n}\n\nmodule.exports = {\n createApplePayPayment,\n createPaymentDataRequest,\n performValidation,\n tokenize,\n init\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar paymentMethodGeneral = require('../../paymentMethodGeneral');\n\nvar $applePayButton = document.querySelector('.js_braintree_applepay_button');\n\nvar paymentData;\nvar $braintreeCartButtons;\nvar applePayCheckoutFormData;\nvar errHandlingModel;\n\n/**\n * Expends Apple Pay Checkout Form with required data\n */\nfunction expandApplePayCheckoutFormData() {\n var csrfToken = document.querySelector('.braintree-cart-buttons-wrap #csrf_token');\n\n applePayCheckoutFormData.append(csrfToken.name, csrfToken.value);\n applePayCheckoutFormData.append('braintreeApplePayNonce', paymentData.nonce);\n applePayCheckoutFormData.append('braintreeApplePayDeviceDataInput', paymentData.deviceData);\n applePayCheckoutFormData.append('braintreeApplePayShippingAddress',\n JSON.stringify(paymentData.shippingAddress) || '{}'\n );\n}\n\n/**\n * Process Apple Pay on the Cart Page\n */\nfunction processCartFlow() {\n var billingAddressData = paymentData.billingAddress;\n var paymentMethodName = JSON.parse($applePayButton.getAttribute('data-braintree-config')).paymentMethodName;\n var placeOrderUrl = $braintreeCartButtons.data('checkout-placeorder-url');\n var checkoutFromCartUrl = $braintreeCartButtons.data('checkout-from-cart-url');\n var checkoutFormFields = $braintreeCartButtons.data('checkout-form-fields');\n var paymentFieldData = helper.getPaymentFieldsData(billingAddressData, paymentMethodName);\n if (paymentFieldData.stateCode === '') {\n paymentFieldData.stateCode = paymentFieldData.city.toLowerCase();\n }\n \n applePayCheckoutFormData = helper.createPaymentFormData(checkoutFormFields, paymentFieldData);\n expandApplePayCheckoutFormData();\n // submit customer form with email (CheckoutServices-SubmitCustomer)\n // as we skip step \"login via guest/registered user\" while express checkout\n // email is set only in case of guest checkout and if email is not already set\n paymentMethodGeneral.submitCustomerForm(billingAddressData.email);\n\n var defer = $.Deferred();\n\n $.ajax({\n type: 'POST',\n url: checkoutFromCartUrl,\n data: applePayCheckoutFormData,\n contentType: false,\n processData: false,\n success: function (data) {\n if (data.error) {\n var errorMessage = '';\n\n if (data.fieldErrors.length) {\n data.fieldErrors.forEach(function (error, index) {\n var keys = Object.keys(error);\n\n if (keys.length) {\n errorMessage += `${keys[index].replace('dwfrm_billing_', '').replace('_', ' ')} ${data.fieldErrors[index][keys[index]]}. `;\n }\n });\n errHandlingModel.applePayErrorHandler(errorMessage);\n }\n\n if (data.serverErrors.length) {\n data.serverErrors.forEach(function (error) {\n errorMessage += `${error}. `;\n });\n errHandlingModel.applePayErrorHandler(errorMessage);\n }\n\n if (data.cartError) {\n window.location.href = data.redirectUrl;\n }\n\n return;\n } else {\n defer.resolve(data);\n $.ajax({\n url: placeOrderUrl,\n data: '',\n method: 'POST',\n success: function (data) {\n if (data.error) {\n if (data.cartError) {\n window.location.href = data.redirectUrl;\n defer.reject();\n } else {\n var errorHtml = '
' +\n '' + data.errorMessage + '
';\n $('.cart-error').append(errorHtml);\n $('.cart-error').show();\n \n // if body page class does not have the cart-show class, then show the popover\n // this is to prevent the popover from showing when the cart page is loaded\n if (!$('body').hasClass('Cart-Show')) {\n $('.minicart .popover').show().addClass('show');\n }\n defer.reject();\n }\n } else {\n var redirect = $('
')\n .appendTo(document.body)\n .attr({\n class: 'd-none',\n method: 'POST',\n action: data.continueUrl\n });\n\n $('')\n .appendTo(redirect)\n .attr({\n name: 'orderID',\n value: data.orderID\n });\n\n $('')\n .appendTo(redirect)\n .attr({\n name: 'orderToken',\n value: data.orderToken\n });\n\n redirect.submit();\n }\n },\n error: function () {\n \n }\n });\n }\n },\n error: function (err) {\n if (err && err.redirectUrl) {\n window.location.href = err.redirectUrl;\n }\n }\n });\n}\n\n/**\n * Inits Apple Pay Cart components\n * @param {Object} data Apple Pay payment data\n * @param {Constructor} errorHandlingModel Error handling model\n */\nfunction init(data, errorHandlingModel) {\n paymentData = data;\n $braintreeCartButtons = $('.braintree-cart-buttons-wrap');\n $applePayButton.setAttribute('data-is-inited', true);\n errHandlingModel = errorHandlingModel;\n\n processCartFlow();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar helper = require('../../helper');\n\nvar paymentData;\n\n/**\n * Process Apple Pay on the Checkout page\n */\nfunction processCheckoutFlow() {\n document.querySelector(('#braintreeApplePayNonce')).value = paymentData.nonce;\n\n // Updating Storefront Billing Form data with ApplePay Billing\n var storeFrontBillingData = helper.getUpdatedStoreFrontBillingData(paymentData.billingAddress);\n\n helper.updateBillingFormValues(storeFrontBillingData);\n}\n\n/**\n * Inits Apple Pay checkout components\n * @param {Object} data Apple Pay payment data\n */\nfunction init(data) {\n paymentData = data;\n\n processCheckoutFlow();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n/* global braintreeUtils braintree $ ApplePaySession */\n\n// Helpers\nvar loaderInstance = require('../../loaderHelper');\nvar applePayHelper = require('../helpers/applePayHelper');\nvar applePayPaymentProcessingHelper = require('../helpers/applePayPaymentProcessingHelper');\nvar helper = require('../../helper');\n\nvar applePayPaymentProcessingConstants = require('../constants/applePayPaymentProcessingConstants');\n\n// Components\nvar applePayCart = require('./applePayCart');\nvar applePayCheckout = require('./applePayCheckout');\n\nvar $braintreeApplePayLoader = document.querySelector('.braintreeApplePayLoader');\nvar $applePayButton = $('.js_braintree_applepay_button');\nvar $continueButton = document.querySelector('button.submit-payment');\nvar applePayEnabledOnCheckout = Boolean(document.querySelector('.js_braintree_applepayContent'));\n\n// global variables\nvar loader;\nvar applePayModel;\nvar applePayConfigs;\nvar errHandlingModel;\n/** Latest Apple Pay request data to use to create a session. */\nvar request;\n/** Request object that gets updated with new data from server responses. */\nvar updatedRequest;\n// set updatedRequest to request\nupdatedRequest = Object.assign({}, request);\n\n\n\nvar STATUSES = null;\n\n/**\n * Functionality over tokenized payment\n * @param {Object} paymentData Apple Pay payment data\n */\nfunction onTokenizedPayment(paymentData) {\n var applePayFlow = applePayPaymentProcessingHelper.getApplePayFlowId();\n\n helper.removeActiveSessionPayment();\n\n switch (applePayFlow) {\n case applePayPaymentProcessingConstants.FLOW_CHECKOUT_NAME:\n applePayCheckout.init(paymentData);\n $continueButton.click();\n break;\n case applePayPaymentProcessingConstants.FLOW__CART_NAME:\n applePayCart.init(paymentData, errHandlingModel);\n break;\n default:\n break;\n }\n}\n/**\n * Creates Apple Pay session. Opens and processes Apple Pay payment window.\n */\nfunction createApplePaySession() {\n var applePayFlow = applePayPaymentProcessingHelper.getApplePayFlowId();\n applePayConfigs = JSON.parse($applePayButton.attr('data-braintree-config'));\n // Updates order amount for paymentDataRequest\n applePayModel.updateApplePayAmount(applePayConfigs);\n\n // Updates order shipping and billing addresses for paymentDataRequest\n if (applePayFlow !== 'cart') {\n applePayModel.updateApplePayAddresses(applePayConfigs);\n }\n\n // Creates a configuration object for creating Apple pay session\n var paymentDataRequest = applePayModel.createPaymentDataRequest(applePayConfigs);\n\n if (applePayConfigs.isRequiredBillingContactFields) {\n paymentDataRequest.requiredBillingContactFields = ['postalAddress', 'name'];\n if (applePayFlow === 'cart') {\n paymentDataRequest.requiredShippingContactFields = ['phone', 'email'];\n }\n }\n\n if (applePayConfigs.isRequiredShippingContactFields) {\n paymentDataRequest.requiredShippingContactFields = ['postalAddress', 'name','phone', 'email'];\n }\n\n /** Map of Demandware status names to Apple Pay status codes */\n STATUSES = {\n Failure: ApplePaySession.STATUS_FAILURE,\n InvalidBillingPostalAddress: ApplePaySession.STATUS_INVALID_BILLING_POSTAL_ADDRESS,\n InvalidShippingPostalAddress: ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS,\n InvalidShippingContact: ApplePaySession.STATUS_INVALID_SHIPPING_CONTACT,\n PINRequired: ApplePaySession.STATUS_PIN_REQUIRED,\n PINIncorrect: ApplePaySession.STATUS_PIN_INCORRECT,\n PINLockout: ApplePaySession.STATUS_PIN_LOCKOUT\n };\n\n // Creates new Apple Pay session\n var session = new ApplePaySession(3, paymentDataRequest);\n\n // Validates merchant website\n session.onvalidatemerchant = function (event) {\n $('.payment-information').attr('data-apple-pay-loaded', true);\n applePayModel.onValidateMerchant(event, applePayConfigs)\n .then(function (merchantSession) {\n session.completeMerchantValidation(merchantSession);\n })\n .catch(function (error) {\n errHandlingModel.applePayErrorHandler(error);\n session.abort();\n });\n };\n\n // Tokenizes an Apple Pay payment\n session.onpaymentauthorized = function (event) {\n loader.show();\n\n applePayModel.onPaymentAuthorized(event)\n .then(function (tokenizedPayload) {\n var validateAddressUrl = applePayConfigs.validateAddressUrl;\n var TokenizedPaymentData = applePayPaymentProcessingHelper.getTokenizedPaymentData(event, tokenizedPayload);\n \n var billingForm = new FormData();\n billingForm.append(\"dwfrm_billing_addressFields_address1\", TokenizedPaymentData.billingAddress.streetAddress);\n billingForm.append(\"dwfrm_billing_addressFields_address2\", TokenizedPaymentData.billingAddress.extendedAddress ? TokenizedPaymentData.billingAddress.extendedAddress : \"\");\n billingForm.append(\"dwfrm_billing_addressFields_states_stateCode\", TokenizedPaymentData.billingAddress.locality);\n billingForm.append(\"dwfrm_billing_addressFields_country\", TokenizedPaymentData.billingAddress.countryCodeAlpha2);\n billingForm.append(\"dwfrm_billing_addressFields_city\", TokenizedPaymentData.billingAddress.locality);\n billingForm.append(\"dwfrm_billing_addressFields_postalCode\", TokenizedPaymentData.billingAddress.postalCode);\n \n $.ajax({\n url: validateAddressUrl,\n type: 'post',\n data: billingForm,\n processData: false,\n contentType: false,\n success: function (data) {\n if(data.error) {\n session.completePayment(ApplePaySession.STATUS_INVALID_BILLING_POSTAL_ADDRESS);\n } else {\n var shippingAddress = TokenizedPaymentData.shippingAddress;\n\n if (data.shippingMethodId !== 'pickup-in-store' && shippingAddress && (!shippingAddress.firstName.trim() || !shippingAddress.lastName.trim() || !shippingAddress.streetAddress.trim() || !shippingAddress.locality.trim() || !shippingAddress.postalCode.trim())) {\n session.completePayment(ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS);\n } else {\n session.completePayment(ApplePaySession.STATUS_SUCCESS);\n if(data.shippingMethodId !== 'pickup-in-store') {\n applePayHelper.setApplePayShippingAddress(TokenizedPaymentData.shippingAddress ? TokenizedPaymentData.shippingAddress : TokenizedPaymentData.billingAddress);\n }\n onTokenizedPayment(TokenizedPaymentData);\n }\n }\n }\n });\n \n loader.hide();\n })\n .catch(function (error) {\n session.completePayment(ApplePaySession.STATUS_FAILURE);\n loader.hide();\n errHandlingModel.applePayErrorHandler(error);\n });\n };\n\n session.onshippingcontactselected = function (event) {\n loader.show();\n\n applePayModel.onShippingContactSelected(event)\n .then(function (response) {\n updatedRequest = Object.assign(updatedRequest, response);\n if (!event.shippingContact.countryCode.trim() || !event.shippingContact.locality.trim() || !event.shippingContact.administrativeArea.trim() || !event.shippingContact.postalCode.trim()) {\n session.completeShippingContactSelection(ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS,\n response.shippingMethods, response.total, response.lineItems);\n } else { \n if (response.shippingMethods.length > 0) {\n session.completeShippingContactSelection(ApplePaySession.STATUS_SUCCESS,\n response.shippingMethods, response.total, response.lineItems);\n } else {\n session.completeShippingContactSelection(ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS,\n response.shippingMethods, response.total, response.lineItems);\n }\n }\n loader.hide();\n })\n .catch(function (error) {\n session.completeShippingContactSelection(mapStatus(error.message),\n [], updatedRequest.total, updatedRequest.lineItems);\n loader.hide();\n errHandlingModel.applePayErrorHandler(error);\n });\n };\n\n session.oncancel = function (event) {\n $('.checkout-btn').removeClass('disabled');\n };\n\n session.begin();\n}\n\n/**\n * Call back function to be resolved when Apple Pay payment button is clicked\n */\nfunction onApplePayButtonClick() {\n errHandlingModel.hideError();\n\n // Billing flow\n if (applePayEnabledOnCheckout) {\n // Validates email and phone fields on the Billing page\n if (applePayHelper.isBilligFiledsValid()) {\n createApplePaySession();\n }\n // Cart flow\n } else {\n createApplePaySession();\n }\n}\n\n/**\n * Init and add Apple Pay on the Cart or Billing page\n */\nfunction initApplePay() {\n loader.show();\n\n var result = applePayModel.collectFraudData()\n .then(function (fraudDataPayload) {\n applePayHelper.setApplePayDeviceData(fraudDataPayload);\n loader.hide();\n\n return applePayModel.initApplePay(ApplePaySession)\n .then(function (canMakePayments) {\n loader.hide();\n applePayHelper.showApplePayButton();\n\n if (!canMakePayments) {\n applePayHelper.makeApplePayButtonDisabled();\n } else {\n $('body').on('click', '.js_braintree_applepay_button', onApplePayButtonClick);\n }\n });\n });\n result\n .catch(function (error) {\n loader.hide();\n errHandlingModel.applePayErrorHandler(error);\n });\n}\n\n/**\n * Inits Apple Pay payment processing components\n * @param {Object} braintreeApplePayModel Apple Pay model\n * @param {Constructor} errorHandlingModel Error handling model\n */\nfunction init(braintreeApplePayModel, errorHandlingModel) {\n loader = loaderInstance($braintreeApplePayLoader);\n applePayModel = braintreeApplePayModel;\n applePayConfigs = JSON.parse($applePayButton.attr('data-braintree-config'));\n errHandlingModel = errorHandlingModel;\n\n if (window.ApplePaySession) {\n initApplePay();\n } else {\n applePayHelper.hideApplePayTab();\n }\n}\n\nfunction mapStatus (status) {\n if (status && STATUSES[status]) {\n return STATUSES[status];\n }\n return ApplePaySession.STATUS_FAILURE;\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nmodule.exports = {\n FLOW_CHECKOUT_NAME: 'checkout',\n FLOW__CART_NAME: 'cart'\n};\n","'use strict';\n\nmodule.exports = {\n NO_APPLE_PAY_BRAINTREE_CONFIGURATIONS: 'No Apple Pay Braintree Configurations',\n FRAUD_DATA_CELLECTION_ISNOT_ENABLED: 'Fraud Data collection isn\\t enabled via Custom Site Preference'\n};\n","'use strict';\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages Braintree credit card error messages\n */\nfunction ErrorHandlingBaseModel(errorMessages) {\n this.$errorContainer = $('.cart-error-messaging');\n this.errorMessages = errorMessages;\n}\n\n// General method which should be used for cases when error came from Braintree\nErrorHandlingBaseModel.prototype.showErrorByObject = function (error) {\n var msg = error.message;\n var code = error.code;\n var errorMessage = this.errorMessages[code] || msg || this.errorMessages.CLIENT_GATEWAY_NETWORK;\n\n this.createErrorNotification(errorMessage);\n};\n\n/**\n * Shows error by message\n * @param {string} message Error message\n */\nErrorHandlingBaseModel.prototype.showErrorByMessage = function (message) {\n this.createErrorNotification(message);\n};\n\n/**\n * ---- Error container which will be used on Cart page ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Method responsible for Error Notification generation\n * @param {string} message message to display inside error notification\n */\nErrorHandlingBaseModel.prototype.createErrorNotification = function (message) {\n $('.checkout-btn').addClass('disabled');\n this.$errorContainer.append(\n `
\n \n ${message}\n
`\n );\n\n this.$errorContainer.show();\n window.scrollTo(0, 0);\n};\n\n/**\n * ---- Method which should hide error container and make it empty. On Cart we use this one ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Hide error notification\n */\nErrorHandlingBaseModel.prototype.hideError = function () {\n this.$errorContainer.hide();\n this.$errorContainer.empty();\n};\n\n/**\n * Handles Apple Pay error by types\n * @param {Object} error Error object or error message\n */\nErrorHandlingBaseModel.prototype.applePayErrorHandler = function (error) {\n if (error.name === 'BraintreeError') {\n this.showErrorByObject(error);\n } else {\n this.showErrorByMessage(error.message);\n }\n};\n\nmodule.exports = ErrorHandlingBaseModel;\n","'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages Braintree credit card error messages\n */\nfunction ErrorHandlingCheckoutModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.$topErrorMessageText = document.querySelector('.error-message-text');\n this.$topErrorMessageWrapper = document.querySelector('.error-message');\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingCheckoutModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.createErrorNotification = function (message) {\n this.$topErrorMessageText.textContent = '';\n this.$topErrorMessageText.append(message);\n this.$topErrorMessageWrapper.style.display = 'block';\n\n window.scrollTo(0, 0);\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.hideError = function () {\n this.$topErrorMessageWrapper.style.display = 'none';\n this.$topErrorMessageText.innerHTML = '';\n};\n\nmodule.exports = ErrorHandlingCheckoutModel;\n","'use strict';\n\nvar helper = require('../../helper');\n\nvar $applePayButton = document.querySelector('.js_braintree_applepay_button');\nvar $applepayDataMethod = document.querySelector('.payment-options[role=tablist] .nav-item[data-method-id=\"DW_APPLE_PAY\"]');\nvar $phoneField = document.querySelector('.contact-info-block [name=dwfrm_billing_contactInfoFields_phone]');\n\n/**\n * Returns Braintree Apple Pay configs\n * @returns {Object} Braintree Apple Pay configs\n */\nfunction getBraintreeApplePayConfigs() {\n var braintreeApplePayButtonConfigs = null;\n\n try {\n braintreeApplePayButtonConfigs = JSON.parse(document.querySelector('.js_braintree_applepay_button').getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeApplePayButtonConfigs;\n }\n\n return braintreeApplePayButtonConfigs;\n}\n\n/**\n * Sets device data from 'data collector' to corresponding input field\n * @param {Object} fraudDataPayload Froud payload data\n */\n\nfunction setApplePayDeviceData(fraudDataPayload) {\n var $braintreeApplePayDeviceData = document.querySelector('input[name=braintreeApplePayDeviceDataInput]');\n\n if (fraudDataPayload.deviceData) {\n $braintreeApplePayDeviceData.value = fraudDataPayload.deviceData;\n }\n}\n\n/**\n * Sets shipping data from 'data collector' to corresponding input field\n * @param {Object} shippingAddressPayload Shipping Address payload data\n */\n\nfunction setApplePayShippingAddress(shippingAddressPayload) {\n var $braintreeApplePayShippingAddress = $('input[name=braintreeApplePayShippingAddress]');\n\n if (shippingAddressPayload) {\n $braintreeApplePayShippingAddress.val(JSON.stringify(shippingAddressPayload));\n $braintreeApplePayShippingAddress.trigger('change');\n }\n}\n\n/**\n * Shows Apple Pay button\n */\nfunction showApplePayButton() {\n $applePayButton.style.display = 'block';\n\n if ($applepayDataMethod) {\n $applepayDataMethod.style.display = 'block';\n }\n}\n\n/**\n * Hides Apple Pay tab on the Checkout/Billing page\n */\nfunction hideApplePayTab() {\n $applePayButton.style.display = 'none';\n if ($applepayDataMethod) {\n $applepayDataMethod.style.display = 'none';\n }\n}\n\n/**\n * Marks Apple Pay button as disabled\n */\nfunction makeApplePayButtonDisabled() {\n $applePayButton.classList.add('js_braintree_applepay_button_disabled');\n}\n\n/**\n * Remove session Apple Pay nonce\n */\nfunction removeSessionNonce() {\n document.querySelector('#braintreeApplePayNonce').value = '';\n document.querySelector('#braintreeApplePayDeviceData').value = '';\n}\n\n/**\n * Validates required billing form fields\n * @returns {boolean} Whether billing form fields are valid\n */\nfunction isBilligFiledsValid() {\n return helper.isValidInputField($phoneField);\n}\n\n/**\n * Depends of the 'data-paypal-is-hide-continue-button' hides or shows continue button on the Billing Page\n */\nfunction toggleContinueButtonOnBillingPage() {\n var applePayContent = document.querySelector('.js_braintree_applepayContent');\n\n helper.continueButtonToggle(applePayContent.getAttribute('data-paypal-is-hide-continue-button'));\n}\n\nmodule.exports = {\n getBraintreeApplePayConfigs,\n setApplePayDeviceData,\n showApplePayButton,\n makeApplePayButtonDisabled,\n removeSessionNonce,\n isBilligFiledsValid,\n hideApplePayTab,\n toggleContinueButtonOnBillingPage,\n setApplePayShippingAddress\n};\n","'use strict';\n\nvar applePayPaymentProcessingConstants = require('../constants/applePayPaymentProcessingConstants');\n\n/**\n * Returns current Apple Pay flow\n * @returns {string} Flow id checkout/cart\n */\nfunction getApplePayFlowId() {\n var applePayEnabledOnCheckout = Boolean(document.querySelector('.js_braintree_applepayContent'));\n\n return applePayEnabledOnCheckout ? applePayPaymentProcessingConstants.FLOW_CHECKOUT_NAME : applePayPaymentProcessingConstants.FLOW__CART_NAME;\n}\n\n/**\n * Returns shipping address based on Apple Pay payment shipping contact\n * @param {Object} shippingContact Shipping address data\n * @returns {Object} Shipping address with required fields\n */\nfunction getShippingAddress(shippingContact) {\n return {\n streetAddress: shippingContact.addressLines[0],\n extendedAddress: shippingContact.addressLines[1],\n locality: shippingContact.locality,\n region: shippingContact.administrativeArea.toUpperCase(),\n postalCode: shippingContact.postalCode,\n countryCodeAlpha2: shippingContact.countryCode.toUpperCase(),\n firstName: shippingContact.givenName,\n lastName: shippingContact.familyName,\n phone: shippingContact.phoneNumber,\n email: shippingContact.emailAddress\n };\n}\n\n/**\n * Returns billing address based on Apple Pay payment billing contact\n * @param {Object} billingContact Billing address data\n * @param {string} email Email\n * @param {string} phone Phone number\n * @returns {Object} Billing address with required fields\n */\nfunction getBillingAddress(billingContact, email, phone) {\n return {\n streetAddress: billingContact.addressLines[0],\n extendedAddress: billingContact.addressLines[1],\n locality: billingContact.locality,\n region: billingContact.administrativeArea.toUpperCase(),\n postalCode: billingContact.postalCode,\n countryCodeAlpha2: billingContact.countryCode.toUpperCase(),\n firstName: billingContact.givenName,\n lastName: billingContact.familyName,\n email: email,\n phone: phone\n };\n}\n\n/**\n * Returns Apple Pay payment object with required data for backend\n * @param {Object} sessionEvent Apple Pay Session event\n * @param {Object} tokenizedPayload Apple Pay payment data\n * @returns {Object} Apple Pay payment object with required fileds\n */\nfunction getTokenizedPaymentData(sessionEvent, tokenizedPayload) {\n var data = {\n event: sessionEvent,\n payload: tokenizedPayload,\n nonce: tokenizedPayload.nonce,\n deviceData: document.querySelector('input[name=braintreeApplePayDeviceDataInput]').value\n };\n var shippingAddressData = sessionEvent.payment.shippingContact;\n \n if ($('.contact-info-block [name=dwfrm_billing_contactInfoFields_phone]').length) {\n phoneNumber = $('.contact-info-block [name=dwfrm_billing_contactInfoFields_phone]').val(); \n } else {\n var phoneNumber = shippingAddressData.phoneNumber;\n }\n\n if (shippingAddressData && shippingAddressData.addressLines) {\n data.shippingAddress = getShippingAddress(shippingAddressData);\n } else {\n shippingAddressData = {\n emailAddress: document.querySelector('.customer-summary-email') ? document.querySelector('.customer-summary-email').innerHTML : shippingAddressData.emailAddress,\n phoneNumber: $('.contact-info-block [name=dwfrm_billing_contactInfoFields_phone]').val() ? $('.contact-info-block [name=dwfrm_billing_contactInfoFields_phone]').val() : shippingAddressData.phoneNumber\n };\n }\n\n var billingAddressData = sessionEvent.payment.billingContact;\n\n if (billingAddressData) {\n data.billingAddress = getBillingAddress(billingAddressData, shippingAddressData.emailAddress, phoneNumber);\n }\n\n return data;\n}\n\n\nmodule.exports = {\n getApplePayFlowId,\n getShippingAddress,\n getBillingAddress,\n getTokenizedPaymentData\n};\n","'use strict';\n\n/**\n* This file was created to provide functionality and business logic for Credit and SRC payment methods. Do not expand this file!\n* Changes and additions to the code should be made to the appropriate files in the folders, depending on the payment method required, to maintain a clear code architecture.\n*/\n\nvar loaderInstance = require('./loaderHelper');\n\nvar creditCardListLoader;\n\n/**\n* Shows the new card block on the Account Page\n*/\nfunction showAddNewCardOptions() {\n var $addNewCardButton = document.querySelector('.braintreeAddNewCard');\n var $addNewCardBlock = document.querySelector('.braintreeAddNewCardBlock');\n\n // Hide \"Add New Card\" button\n $addNewCardButton.style.display = 'none';\n // Display \"Add New Card\" form\n $addNewCardBlock.style.display = 'block';\n}\n\n/**\n * Removes card from Credit/SRC Cards list\n * @param {Object} e Event object\n */\nfunction removeCard(e) {\n var target = e.target;\n\n creditCardListLoader.show();\n\n $.get(target.getAttribute('data-url') + '?UUID=' + target.getAttribute('data-id'))\n .then((data => {\n $('#uuid-' + data.UUID).remove();\n\n if (data.newDefaultAccount) {\n document.querySelector('#uuid-' + data.newDefaultAccount + ' span').style.fontWeight = 'bold';\n document.querySelector('#uuid-' + data.newDefaultAccount + ' button.braintree-make-default-card').style.display = 'none';\n }\n\n creditCardListLoader.hide();\n }))\n .fail(() => {\n location.reload();\n });\n}\n\n/**\n * Select default card in Credit/SRC Cards list\n * @param {Object} e Event object\n */\nfunction makeDefaultCard(e) {\n var target = e.target;\n var url = target.getAttribute('data-make-default-url');\n var id = target.getAttribute('data-id');\n var paymentMethodID = 'CARD';\n\n creditCardListLoader.show();\n\n $.get(url + '?UUID=' + id + '&pmID=' + paymentMethodID)\n .then((data) => {\n // New default Card changes\n document.querySelector('#uuid-' + data.newDefaultProperty + ' span').style.fontWeight = 'bold';\n document.querySelector('.braintree-make-default-card.uuid-' + data.newDefaultProperty).style.display = 'none';\n\n // Previous default Card changes\n document.querySelector('#uuid-' + data.toRemoveDefaultProperty + ' span').style.fontWeight = 'normal';\n document.querySelector('.braintree-make-default-card.uuid-' + data.toRemoveDefaultProperty).style.display = 'inline';\n\n creditCardListLoader.hide();\n })\n .catch(function () {\n creditCardListLoader.hide();\n });\n}\n\nfunction initAccount() {\n var $creditCardAccountBtLoader = document.querySelector('#creditCardAccountBtLoader');\n var creditCardListLoaderExists = Boolean($creditCardAccountBtLoader);\n\n if (creditCardListLoaderExists) {\n creditCardListLoader = loaderInstance($creditCardAccountBtLoader);\n }\n // \"Add new card\" area link functionality initiation\n $('.braintreeAddNewCard').click(showAddNewCardOptions);\n\n // \"Make default\" link functionality initiation\n $('.creditCard-accounts').on('click', '.braintree-make-default-card', makeDefaultCard);\n\n // \"Remove Card\" link functionality initiation\n $('.creditCard-accounts').on('click', '.remove-bt-payment', removeCard);\n}\n\nmodule.exports = {\n initAccount\n};\n","'use strict';\n\n/* global braintree $ */\n\n/**\n * Create Braintree Client Instance from Client Token\n * @param {string} clientToken Braintree client token\n * @returns {Promise} returns promise with Braintree Client Instance\n */\nfunction createClientInstance(clientToken) {\n return braintree.client.create({\n authorization: clientToken\n });\n}\n\n/**\n * Fraud data generation\n * @param {Promise} btClientInstancePromise Promise with Client Instance\n * @returns {Promise} returns promise with fraud data\n */\nfunction collectFraudData(btClientInstancePromise) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.dataCollector.create({\n client: btClientInstance,\n kount: true\n });\n });\n}\n\n/**\n * Get array with Braintree Customer Payment Mehtods by Personalized Client Instance\n * @param {Promise} btClientInstancePromise Promise with Client Instance\n * @returns {array} array with Braintree Customer Payment Mehtod (if any) in opposite case empty array will be returned\n */\nfunction getBtCustomerPaymentMethods(btClientInstancePromise) {\n return btClientInstancePromise\n .then(function (clientInstance) {\n return braintree.vaultManager.create({\n client: clientInstance\n });\n })\n .then(function (vaultManager) {\n return vaultManager.fetchPaymentMethods({\n defaultFirst: true\n });\n });\n}\n\nmodule.exports = {\n createClientInstance,\n collectFraudData,\n getBtCustomerPaymentMethods\n};\n","'use strict';\n\nmodule.exports = function () {\n // Used only for Paypal. In future \"client token\" generation approach will be refactored\n var paymentMethodGeneral = require('./paymentMethodGeneral');\n var helper = require('./helper');\n\n // General global variables\n var clientTokenPromise = paymentMethodGeneral.createGeneralClientInstancePromise();\n var isCheckoutPage = Boolean(document.querySelector('#checkout-main'));\n\n /* ------------------------General Account functionality------------------------ */\n var btAccountBusinessLogic = require('./braintreeAccount');\n // Common Credit Card and SRC Account functionality\n btAccountBusinessLogic.initAccount();\n\n /* ------------------------General Checkout functionality----------------------- */\n if (isCheckoutPage) {\n paymentMethodGeneral.fillPaymentSammaryContainer();\n paymentMethodGeneral.initPaymentMethodTabClickBehavior();\n }\n\n /* ------------------------Credit Card------------------------ */\n var creditCardBusinessLogic = require('./creditcard/creditCard');\n\n var creditCardOnAccountEnabled = Boolean(document.querySelector('.js_braintree_addCreditCardForm'));\n var creditCardEnabledOnCheckout = Boolean(document.querySelector('.js_braintree_creditCardContent'));\n\n creditCardBusinessLogic.init();\n\n if (creditCardOnAccountEnabled) {\n creditCardBusinessLogic.initAccount();\n }\n\n if (creditCardEnabledOnCheckout) {\n creditCardBusinessLogic.initCheckout();\n }\n\n /* --------------------------PayPal-------------------------- */\n var payPalBusinessLogic = require('./paypal/payPal');\n var payPalStaticButtonComponent = require('./paypal/components/payPalStaticImage');\n\n var payPalEnabledOnCheckout = Boolean(document.querySelector('.js_braintree_paypalContent'));\n var payPalEnabledOnProduct = Boolean(document.querySelector('.prices-add-to-cart-actions .js_braintree_paypal_cart_button'));\n var payPalEnabledOnCart = Boolean(document.querySelector('.cart-page .js_braintree_paypal_cart_button'));\n var payPalEnabledOnAccountPage = Boolean(document.querySelector('.paypal-accounts'));\n\n // PayPal Static Button. Static button on MiniCart will be inited inside MiniCart component\n var payPalStaticButtonEnabledOnProduct = Boolean(document.querySelector('.braintree_pdp_button .braintree-static-paypal-button'));\n var payPalStaticButtonEnabledOnCart = Boolean(document.querySelector('.cart-page .braintree-static-paypal-button'));\n\n payPalBusinessLogic.init(clientTokenPromise);\n\n if (payPalStaticButtonEnabledOnProduct) {\n payPalStaticButtonComponent.initOnPdp();\n }\n\n if (payPalStaticButtonEnabledOnCart) {\n payPalStaticButtonComponent.initOnCart();\n }\n\n if (payPalEnabledOnCheckout) {\n payPalBusinessLogic.initCheckout();\n }\n\n if (payPalEnabledOnProduct) {\n payPalBusinessLogic.initProduct();\n }\n\n // Validation on enabled/disabled PayPal button for MiniCart located isinside MiniCart component\n payPalBusinessLogic.initMiniCart();\n\n if (payPalEnabledOnCart) {\n payPalBusinessLogic.initCart();\n }\n\n if (payPalEnabledOnAccountPage) {\n payPalBusinessLogic.initAccount();\n }\n\n /* --------------------------GooglePay------------------------- */\n var googlePayBusinnessLogic = require('./googlepay/googlePay');\n\n var googlePayEnabledOnCheckout = Boolean(document.querySelector('.js_braintree_googlepayContent'));\n var googlePayEnabledOnCart = Boolean(document.querySelector('.braintree-cart-google-button'));\n\n googlePayBusinnessLogic.init();\n\n if (googlePayEnabledOnCheckout) {\n googlePayBusinnessLogic.initCheckout();\n }\n\n if (googlePayEnabledOnCart) {\n googlePayBusinnessLogic.initCart();\n }\n\n /* --------------------------ApplePay------------------------- */\n var applePayBusinessLogic = require('./applepay/applePay');\n\n var applePayEnabledOnCheckout = Boolean(document.querySelector('.js_braintree_applepayContent'));\n var applePayEnabledOnCart = Boolean(document.querySelector('.braintree-cart-apple-button'));\n\n applePayBusinessLogic.init();\n\n if (applePayEnabledOnCart) {\n applePayBusinessLogic.initCart();\n }\n\n if (applePayEnabledOnCheckout) {\n applePayBusinessLogic.initCheckout();\n }\n\n /* --------------------------Venmo---------------------------- */\n var venmoBusinessLogic = require('./venmo/venmo');\n\n var isVenmoEnabledOnAccountPage = Boolean(document.querySelector('.venmo-accounts'));\n var isVenmoEnabledOnBillingPage = Boolean(document.querySelector('.js_braintree_venmoContent'));\n\n venmoBusinessLogic.init();\n\n if (isVenmoEnabledOnAccountPage) {\n venmoBusinessLogic.initAccount();\n }\n\n if (isVenmoEnabledOnBillingPage) {\n venmoBusinessLogic.initBillingCheckout();\n }\n\n /* --------------------------SRC------------------------------ */\n var srcBusinessLogic = require('./src/src');\n\n var isSrcEnabledOnAccountPage = Boolean(document.querySelector('.js_braintree_addSrcAccountForm'));\n var isSrcEnabledOnCartPage = Boolean(document.querySelector('.braintree-cart-src-button'));\n var isSrcEnabledOnBillingPage = Boolean(document.querySelector('.js_braintree_srcContent'));\n\n srcBusinessLogic.init();\n\n if (isSrcEnabledOnAccountPage) {\n srcBusinessLogic.initAccount();\n }\n\n if (isSrcEnabledOnCartPage) {\n srcBusinessLogic.initCartCheckout();\n }\n\n if (isSrcEnabledOnBillingPage) {\n srcBusinessLogic.initBillingCheckout();\n }\n\n /* --------------------------LPM-------------------------- */\n var lpmBusinessLogic = require('./local/lpm');\n var isLpmEnebledOnBillingPage = Boolean(document.querySelector('.js_braintree-lpmContent'));\n\n if (isLpmEnebledOnBillingPage) {\n lpmBusinessLogic.init();\n }\n\n $('.payment-options[role=tablist] a[data-toggle=\"tab\"]').on('shown.bs.tab', function (e) {\n $( '.payment-options').find('.tab-pane').removeClass('active');\n var tabContent = $(e.currentTarget).next();\n tabContent.find('.tab-pane').addClass('active');\n helper.paymentMethodChangeHandle(e.target);\n const cardList = document.getElementById('braintreeCreditCardList');\n const paypalList = document.getElementById('braintreePaypalAccountsList');\n var changeEvent;\n\n if (e.target.hash === '#creditcard-content' && cardList) {\n if (typeof (Event) === 'function') {\n changeEvent = new Event('changeEvent');\n cardList.addEventListener('changeEvent', function () {\n 'change';\n }, false);\n } else {\n changeEvent = document.createEvent('Event');\n changeEvent.initEvent('changeEvent', true, true);\n }\n cardList.dispatchEvent(changeEvent);\n } else if (e.target.hash === '#paypal-content' && paypalList) {\n if (typeof (Event) === 'function') {\n changeEvent = new Event('changeEvent');\n paypalList.addEventListener('changeEvent', function () {\n 'change';\n }, false);\n } else {\n changeEvent = document.createEvent('Event');\n changeEvent.initEvent('changeEvent', true, true);\n }\n paypalList.dispatchEvent(changeEvent);\n }\n });\n};\n","'use strict';\n\n/* global braintree $ */\n/* eslint no-console: 'off' */\n\nvar isDebugMode = true;\n\nif (console && isDebugMode) {\n var consoleLog = console.log;\n var consoleError = console.error;\n console.log = function () {\n consoleLog.apply(console, arguments);\n };\n console.error = function () {\n consoleError.apply(console, arguments);\n };\n} else {\n console = { // eslint-disable-line no-global-assign\n log: function () { },\n error: function () { }\n };\n}\n\nvar bu = {\n pdpOnlickForAsignedPaypalPayment: function () {\n var $bundleItem = $('.bundle-item');\n function getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n }\n\n var pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n var $btn = $('.braintree_pdp_button');\n var $productContainer = $btn.closest('.product-detail');\n\n var form = {\n pid: pid,\n quantity: $('.quantity-select').val()\n };\n\n if (!$bundleItem.length) {\n form.options = getOptions($productContainer);\n } else {\n var items = $bundleItem.map(function () {\n return {\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n };\n });\n form.childProducts = JSON.stringify(items.toArray());\n }\n var response = $.ajax({\n url: $('.add-to-cart-url').val(),\n method: 'POST',\n async: false,\n data: form\n }).responseJSON;\n response.pid = pid;\n return response;\n },\n\n getSelectedData: function (selectEl) {\n if (!selectEl) {\n return null;\n }\n var options = selectEl.getElementsByTagName('option');\n var option = null;\n for (var i = 0; i < options.length; i++) {\n option = options[i];\n if (option.selected) {\n break;\n }\n }\n return option.attributes;\n },\n\n postData: function (url, data) {\n var formData = new FormData();\n\n for (var key in data) {\n formData.append(key, data[key]);\n }\n $.ajax({\n url: url,\n data: formData,\n processData: false,\n contentType: false,\n type: 'POST',\n success: function (res) {\n window.location.href = res.redirectUrl;\n },\n error: function () {\n location.reload();\n }\n });\n },\n\n messages: {},\n\n errorInstances: [],\n createErrorInstance: function (containerElement, callback) {\n if (!containerElement) {\n console.error('Braintree: No container for showing erros');\n }\n function Constructor(cb) {\n bu.errorInstances.push(this);\n this.containerEl = containerElement;\n this.cb = typeof cb === 'function' ? cb : function () { };\n }\n Constructor.prototype.show = function (error) {\n var text = '';\n if (typeof error === 'string') {\n text = error;\n }\n if (typeof error === 'object') {\n var msg = bu.messages[error.code];\n text = msg || error.message;\n this.cb(this, error);\n if (error.code === 'PAYPAL_POPUP_CLOSED') {\n return;\n }\n }\n this.containerEl.style.display = '';\n this.containerEl.innerHTML = text;\n };\n Constructor.prototype.hide = function () {\n this.containerEl.innerHTML = '';\n };\n return new Constructor(callback);\n },\n clientToken: null\n};\n\nbu.console = console;\n\nmodule.exports = bu;\n\n","'use strict';\n\nvar braintreeCreditCardSDK = require('./braintreeCreditCardSDK');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\n\nvar braintreeCreditCardSdkHelper = require('../helpers/braintreeCreditCardSdkHelper');\n\n/* global Promise braintree $ */\n\n// global variables\nvar hostedFieldsInstance;\nvar btClientInstancePromise;\nvar orderData;\nvar sitePrefs = {};\n\n/**\n * Init Braintree Credit Card model\n * @param {Promise} braintreeClientInstancePromise Braintreee client instance promise\n * @param {boolean} isSkip3dSecureLiabilityResult 'BRAINTREE_3DSecure_Skip_Client_Validation_Result' site preference value\n * @param {boolean} is3dSecureEnabled 'BRAINTREE_3DSecure_Enabled' site preference value\n * @param {bollean} isFraudToolsEnabled Is fraud tools enabled value\n */\nfunction init(braintreeClientInstancePromise, isSkip3dSecureLiabilityResult, is3dSecureEnabled, isFraudToolsEnabled) {\n braintreeCreditCardSDK.init(braintreeClientInstancePromise);\n\n btClientInstancePromise = braintreeClientInstancePromise;\n sitePrefs = {\n isSkip3dSecureLiabilityResult: isSkip3dSecureLiabilityResult,\n is3dSecureEnabled: is3dSecureEnabled,\n isFraudToolsEnabled: isFraudToolsEnabled\n };\n}\n\n\n/**\n * Gets required additional shipping info for 3ds\n *\n * @param {Object} orderAddress - User's shipping address\n * @returns {Object} an object with required fields\n */\n\nfunction getShippingAdditionalInfo(orderAddress) {\n var shippingData = {\n workPhoneNumber: orderAddress.phone,\n shippingGivenName: orderAddress.recipientName.split(' ').slice(0, -1).join(' '),\n shippingSurname: orderAddress.recipientName.split(' ').slice(-1).join(' '),\n shippingPhone: orderAddress.phone,\n shippingAddress: {\n streetAddress: orderAddress.line1,\n extendedAddress: orderAddress.line2,\n locality: orderAddress.city,\n region: orderAddress.state,\n postalCode: orderAddress.postalCode,\n countryCodeAlpha2: orderAddress.countryCode\n }\n };\n\n delete shippingData.shippingAddress.region;\n\n var address1 = shippingData.shippingAddress.streetAddress;\n if (address1.length > 50) {\n if (!shippingData.shippingAddress.extendedAddress) {\n shippingData.shippingAddress.streetAddress = address1.substr(0, 50);\n shippingData.shippingAddress.extendedAddress = address1.substr(50, 50);\n } else {\n var allAddress = shippingData.shippingAddress.streetAddress + ' ' + shippingData.shippingAddress.extendedAddress;\n shippingData.shippingAddress.streetAddress = allAddress.substr(0, 50);\n shippingData.shippingAddress.extendedAddress = allAddress.substr(50, 50);\n }\n }\n\n return shippingData;\n}\n\n/**\n * Updates Order data on Checkout\n */\nfunction updateOrderData() {\n return new Promise(function(resolve, reject) {\n $.ajax({\n url: document.querySelector('.js_braintree_getOrderInfoUrl').value + '?qwe=2344',\n type: 'get',\n dataType: 'json',\n success: function (data) {\n data.shippingAdditionalInfo = data.shippingAddress ? getShippingAdditionalInfo(data.shippingAddress) : null;\n orderData = data;\n resolve();\n },\n error: function () {\n window.location.reload();\n reject();\n }\n });\n });\n}\n\n/**\n * Returns fraud data from dataCollector payload\n * @returns {Object} Payload with fraud data\n */\nfunction collectFraudData() {\n var response;\n\n if (sitePrefs && sitePrefs.isFraudToolsEnabled) {\n response = braintreeGeneral.collectFraudData(btClientInstancePromise);\n } else {\n response = Promise.resolve({\n customMessage: 'Fraud Data collection isn\\t enabled via Custom Site Preference'\n });\n }\n\n return response;\n}\n\n/**\n * Inits Credit Card hosted fields\n * @returns {Object} Hosted Fields instance\n */\nfunction initCreditCardFields() {\n var hostedFieldsParams = null;\n var styles = creditCardFormFieldHelper.getHostedFieldsStyles();\n var configs = creditCardFormFieldHelper.getHostedFieldsConfig();\n\n hostedFieldsParams = {\n styles,\n configs\n };\n\n return braintreeCreditCardSDK.createHostedFields(hostedFieldsParams)\n .then(function (hfInstance) {\n // init hosted fields instance globaly\n hostedFieldsInstance = hfInstance;\n\n return hfInstance;\n });\n}\n\n/**\n * Creates Credit Card hosted fields\n */\nfunction clearHostedFields() {\n braintreeCreditCardSDK.clearHostedFields(hostedFieldsInstance);\n}\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * Tokenizes previouselly filled hosted Credit Card fields and returns a nonce payload\n * @returns {Promise} Promise with { error: false, result: 'ok'} inside in case of positive response and\n * { error: true} in case of negative (reject, case)\n */\nfunction tokenize(isCheckoutPage) {\n var tokenizationOptions;\n\n // \"Hosted Field Instance\" validation\n if (!hostedFieldsInstance) {\n return Promise.reject({\n customError: '\"hostedFieldsInstance\" is not define. Tokenization can\\'t be done'\n });\n }\n\n if (isCheckoutPage) {\n // Pull billing address from Storefront. Passed data will be tokenized and sent to Braintree\n tokenizationOptions = braintreeCreditCardSdkHelper.createTokenizationOptions();\n } else {\n tokenizationOptions = {};\n }\n\n return braintreeCreditCardSDK.tokenize(hostedFieldsInstance, tokenizationOptions)\n .then(function (payload) {\n return {\n btTokenizePayload: payload\n };\n });\n}\n\n/**\n * Launch the 3D Secure login flow, returning a nonce payload.\n * @param {string} nonce Payment method nonce\n * @param {string} bin Payment method bin\n * @param {number} amount Total amount\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {Object} shippingAdditionalInfo Object with shipping info\n * @param {Object} btTokenizePayload Tokenize payload\n * @returns {Object} Object with nonce payload or custom error\n */\nfunction apply3dSecureValidation(nonce, bin, amount, email, billingData, shippingAdditionalInfo, btTokenizePayload) {\n return braintreeCreditCardSDK.apply3dSecureValidation(nonce, bin, amount, email, billingData, shippingAdditionalInfo)\n .then(function (payload) {\n if (payload.liabilityShifted || sitePrefs.isSkip3dSecureLiabilityResult) {\n // \"Nonce\" is changed after successful 3DS validation. We need this line to store the last \"nonce\" value\n if (btTokenizePayload) {\n // For stored card use case we don't need this param\n btTokenizePayload.nonce = payload.nonce;\n }\n\n return {\n threeDSecureDataValidationPayload: payload,\n btTokenizePayload: btTokenizePayload\n };\n }\n\n // Case when buyer \"canceled\" 3DS window\n return Promise.reject({\n customError: '3DS popup was canceled by buyer'\n });\n });\n}\n\n/**\n * Process the new Credit Card\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {boolean} isCheckoutPage Is checkout flow flag\n * @returns {Object} Object with nonce payload or custom error\n */\nfunction processNewCard(email, billingData, isCheckoutPage) {\n var is3dSecureDisabled = sitePrefs && !sitePrefs.is3dSecureEnabled;\n var orderAmount = orderData.amount;\n var shippingAdditionalInfo = orderData.shippingAdditionalInfo;\n var nonce = null;\n var bin = null;\n var result = null;\n\n result = tokenize(isCheckoutPage);\n\n if (!is3dSecureDisabled) {\n result = result\n .then(function (payload) {\n nonce = payload.btTokenizePayload.nonce;\n bin = payload.btTokenizePayload.details ? payload.btTokenizePayload.details.bin : '';\n\n return apply3dSecureValidation(\n nonce,\n bin,\n orderAmount,\n email,\n billingData,\n shippingAdditionalInfo,\n payload.btTokenizePayload\n );\n });\n }\n\n return result;\n}\n\n/**\n * Process the stored Credit Card\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {string} nonce Payment method nonce\n * @param {string} bin Payment method bin\n * @returns {Object} Object with nonce payload or custom error\n */\nfunction processStoredCard(email, billingData, nonce, bin) {\n var orderAmount = orderData.amount;\n var shippingAdditionalInfo = orderData.shippingAdditionalInfo;\n var is3dSecureDisabled = sitePrefs && !sitePrefs.is3dSecureEnabled;\n var result = null;\n\n // Case when we have a nonce, it is the case when buyer use stored credit card\n // otherwise, it is the case when buyer use new credit card\n if (is3dSecureDisabled) {\n result = Promise.resolve({\n nonce,\n email,\n bin\n });\n } else {\n result = apply3dSecureValidation(\n nonce,\n bin,\n orderAmount,\n email,\n billingData,\n shippingAdditionalInfo\n );\n }\n\n return result;\n}\n\n/**\n * In case of session card we can do nothing since the nonce, 3ds, hosted fields validation already was passed\n * @returns {Promise} return Promise with success data\n */\nfunction processSessionCard() {\n return Promise.resolve({});\n}\n\n/**\n * Checks whether the basket is valid\n * @param {string} errorMessage Error message\n * @returns {Object} response object\n */\nfunction isBasketDataValid(errorMessage) {\n var response = {\n error: false,\n customErrorMessage: ''\n };\n\n if (!orderData || orderData.amount === 0) {\n response.error = true;\n response.customErrorMessage = errorMessage;\n }\n\n return response;\n}\n\n/**\n * Get BT client instance which is used currently in the model\n * @returns {Promise} BT client instance promise\n */\nfunction getClientInstancePromise() {\n return btClientInstancePromise;\n}\n\nmodule.exports = {\n init,\n // \"tokenize\" or \"processNewCard\", or \"processStoredCard\", or \"clearHostedFields\"\n // can be called only after excution of \"initCreditCardFields\"\n tokenize,\n initCreditCardFields,\n processNewCard,\n processStoredCard,\n processSessionCard,\n clearHostedFields,\n getClientInstancePromise,\n\n // \"isBasketDataValid\" can be called only after calling of \"updateOrderData\"\n isBasketDataValid,\n updateOrderData,\n\n collectFraudData\n};\n","'use strict';\nvar braintreeCreditCardModel = require('./braintreeCreditCardModel');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar creditCardHelper = require('../helpers/creditCardHelper');\n\n/**\n * Initialize Braintree Credit Card Model. Pattern Builder is used\n * @returns {Object} object with booleam \"error\" flag and \"message\" attribute with error message\n */\nfunction init() {\n var braintreeCreditCardConfigs = creditCardHelper.getCheckoutBraintreeCreditCardConfigs();\n var clientToken;\n var btClientInstancePromise;\n var isSkip3dSecureLiabilityResult;\n var is3dSecureEnabled;\n var isFraudToolsEnabled;\n var response = {\n error: false,\n message: '',\n btCreditCardModel: null,\n btCreditCardConfigs: null\n };\n\n if (braintreeCreditCardConfigs) {\n clientToken = braintreeCreditCardConfigs.clientToken;\n btClientInstancePromise = braintreeGeneral.createClientInstance(clientToken);\n isSkip3dSecureLiabilityResult = braintreeCreditCardConfigs.isSkip3dSecureLiabilityResult;\n is3dSecureEnabled = braintreeCreditCardConfigs.is3dSecureEnabled;\n isFraudToolsEnabled = braintreeCreditCardConfigs.isFraudToolsEnabled;\n\n braintreeCreditCardModel.init(\n btClientInstancePromise,\n isSkip3dSecureLiabilityResult,\n is3dSecureEnabled,\n isFraudToolsEnabled\n );\n\n response.btCreditCardModel = braintreeCreditCardModel;\n response.btCreditCardConfigs = braintreeCreditCardConfigs;\n } else {\n response.error = true;\n response.message = 'No Credit Card Braintree Configurations';\n }\n\n return response;\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n/* global braintreeUtils braintree $ */\n\nvar btClientInstancePromise;\n\n/**\n * Returns a promise that resolves with the HostedFields instance.\n * @param {Object} hostedFieldsParams Object of hosted fieds parameters\n * @returns {Object} Object with hosted field parameters\n */\nfunction createHostedFields(hostedFieldsParams) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.hostedFields.create({\n client: btClientInstance,\n styles: hostedFieldsParams.styles,\n fields: hostedFieldsParams.configs,\n options: {\n enableCORS: true\n }\n });\n });\n}\n\n/**\n * Launch the 3D Secure login flow, returning a nonce payload.\n * @param {string} nonce Payment method nonce\n * @param {string} bin Payment method bin\n * @param {number} amount Total amount\n * @param {string} email Email\n * @param {Object} billingData Object with Credit Card billing data\n * @param {Object} shippingAdditionalInfo Object with Credit Card shipping info\n * @returns {Object} 3DS instance\n */\nfunction apply3dSecureValidation(nonce, bin, amount, email, billingData, shippingAdditionalInfo) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.threeDSecure.create({\n client: btClientInstance,\n version: 2\n })\n .then(function (threeDSecure) {\n return threeDSecure.verifyCard({\n amount: amount,\n nonce: nonce,\n bin: bin || '',\n email: email,\n challengeRequested: true,\n billingAddress: {\n givenName: billingData.firstName,\n surname: billingData.lastName,\n phoneNumber: billingData.phone,\n streetAddress: billingData.address1,\n extendedAddress: billingData.address2,\n locality: billingData.city,\n region: billingData.stateCode,\n postalCode: billingData.postalCode,\n countryCodeAlpha2: billingData.country\n },\n additionalInformation: shippingAdditionalInfo,\n onLookupComplete: function (data, next) {\n next();\n }\n });\n });\n });\n}\n\n/**\n * Tokenizes a Credit Card and returns a nonce payload.\n * @param {HostedFileds} hfInstance Hosted fieled instance\n * @param {Object} tokenizationOptions Credit Card tokenization option\n * @returns {Promise} A promise that resolves with a tokenizePayload.\n */\nfunction tokenize(hfInstance, tokenizationOptions) {\n var tokenizeOption = tokenizationOptions || {};\n\n return hfInstance.tokenize(tokenizeOption);\n}\n\n/**\n * Clear the value of the field\n * @param {HostedFileds} hfInstance Hosted fieled instance\n */\nfunction clearHostedFields(hfInstance) {\n hfInstance.clear('cardholderName');\n hfInstance.clear('number');\n hfInstance.clear('cvv');\n hfInstance.clear('expirationDate');\n}\n\n/**\n *\n * @param {Promise} braintreeClientInstancePromise Braintree Credit Card instance promise\n */\nfunction init(braintreeClientInstancePromise) {\n btClientInstancePromise = braintreeClientInstancePromise;\n}\n\nmodule.exports = {\n init,\n createHostedFields,\n apply3dSecureValidation,\n tokenize,\n clearHostedFields\n};\n","'use strict';\n\nvar loaderInstance = require('../../loaderHelper');\nvar creditCardVaultManager = require('./creditCardVaultManager');\n\nvar braintreeCreditCardModel;\nvar addNewCreditCardLoader;\n\n// Helpers\nvar creditCardAccountHelper = require('../helpers/creditCardAccountHelper');\n\n// Loader selectors\nvar $braintreeCreditCardLoader = document.querySelector('#braintreeCreditCardLoader');\nvar $customCreditCardErrorContainer = document.querySelector('#customCreditCardErrorContainer');\n\nvar errHandlingModel;\nvar ccMessages;\n\n/**\n * Check whenever is new card is presented on Storefront and in VaultMgr. If yes - render error message.\n * @param {Promise} clientInstancePromise client instance promise\n * @param {Object} btPayload payload from Braintree\n * @param {Object} errorList object with errors\n * @returns {Promise} promise with reject status in case if new card already exists in VaultMgr and on Storefront (buyer's wallet)\n */\nfunction rejectIfCardExistsInVault(clientInstancePromise, btPayload, errorList) {\n var payloadDetails = btPayload.details;\n var lastFour = payloadDetails.lastFour.toString();\n var type = payloadDetails.cardType.toLowerCase();\n\n return creditCardVaultManager.isNewCardCanBeStored(clientInstancePromise, lastFour, type)\n .then(function (newCardCanBeStored) {\n if (!newCardCanBeStored) {\n // eslint-disable-next-line no-undef\n return Promise.reject(errorList.CARD_ALREADY_EXIST_ERROR_MESSAGE);\n }\n });\n}\n\n/**\n * Stores new Credit Card on account page\n * @param {Object} event Event object\n * @returns {void}\n */\nfunction storeNewCreditCard(event) {\n var isCheckoutPage = false;\n var customErrorList = JSON.parse($customCreditCardErrorContainer.getAttribute('data-errors'));\n\n // Clears error messages on the top of the Account Page\n errHandlingModel.hideError();\n\n try {\n if (!braintreeCreditCardModel) {\n throw ccMessages.CLIENT_MISSING_GATEWAY_CONFIGURATION;\n }\n\n addNewCreditCardLoader.show();\n\n var clientInstancePromise = braintreeCreditCardModel.getClientInstancePromise();\n\n braintreeCreditCardModel.tokenize(isCheckoutPage)\n .then(function (btModelPayload) {\n var tokenizePayload = btModelPayload.btTokenizePayload;\n var $addCreditCardForm = $('.js_braintree_addCreditCardForm');\n var addCreditCardFormUrl = $addCreditCardForm.attr('action');\n var formData;\n\n return rejectIfCardExistsInVault(clientInstancePromise, tokenizePayload, customErrorList)\n .then(function () {\n // Sets value of Credit Card hidden fields needed for server side\n creditCardAccountHelper.setCardHiddenFields(tokenizePayload);\n\n // Call to Braintree-AccountAddCreditCardHandle preparetion\n formData = $addCreditCardForm.serialize();\n\n return $.ajax({\n url: addCreditCardFormUrl,\n type: 'post',\n dataType: 'json',\n data: formData\n })\n .then(function (response) {\n if (!response.success) {\n errHandlingModel.creditCardErrorHandler(response.error);\n } else {\n location.href = response.redirectUrl;\n }\n });\n });\n })\n .catch(function (error) {\n errHandlingModel.creditCardErrorHandler(error);\n })\n .finally(function () {\n addNewCreditCardLoader.hide();\n });\n\n event.preventDefault();\n event.stopPropagation();\n } catch (err) {\n errHandlingModel.creditCardErrorHandler(err);\n }\n}\n\n/**\n * Inits Credit Card account loaders\n */\nfunction initCreditCartAccountLoaders() {\n var braintreeCreditCardLoaderExists = Boolean($braintreeCreditCardLoader);\n\n if (braintreeCreditCardLoaderExists) {\n addNewCreditCardLoader = loaderInstance($braintreeCreditCardLoader);\n }\n}\n\n/**\n * Init Credit Card Account functionality\n * @param {Object} btCreditCardModel Braintree Credit Card model\n * @param {Constructor} errorHandlingModel Error handling model\n * @param {Object} creditCardMessages List of Credit Card error messages\n */\nfunction init(btCreditCardModel, errorHandlingModel, creditCardMessages) {\n var addNewCreditCardFormExists = Boolean(document.querySelector('.js_braintree_addCreditCardForm'));\n errHandlingModel = errorHandlingModel;\n ccMessages = creditCardMessages;\n\n var clientInstancePromise = btCreditCardModel.getClientInstancePromise();\n\n initCreditCartAccountLoaders();\n creditCardVaultManager.removeFromDomCardsWhichAreNotInVaultMgr(clientInstancePromise);\n\n braintreeCreditCardModel = btCreditCardModel;\n\n // \"Store new Card\" button functionality initiation (works only when 3DS is disabled)\n if (addNewCreditCardFormExists) {\n $('.braintreeAddNewCardBlock').on('click', '.braintreeCreditCardBtn', storeNewCreditCard);\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n/**\n * General validation of params needed for initialization of hosted fields\n * @param {Object} $braintreeCreditCardFieldsContainer Braintree Credit Card fields container\n * @param {Object} braintreeCreditCardConfig Braintree Credit Card configurations (they came from server via data attr)\n * @returns {Object} object with \"error\" boolean flag and array of error messages from \"massages\" attr\n */\nfunction generalHfValidation($braintreeCreditCardFieldsContainer, braintreeCreditCardConfig) {\n var response = {\n error: false,\n messages: ''\n };\n\n try {\n var isHostedFieldsWasInited = JSON.parse($braintreeCreditCardFieldsContainer.getAttribute('data-is-inited'));\n var isBraintreeCreditCardConfigValid = typeof braintreeCreditCardConfig !== 'object' || braintreeCreditCardConfig !== null;\n\n if (isHostedFieldsWasInited) {\n // do not add error msg since this case is expected (hosted fields should be inited just once)\n response.error = true;\n }\n if (!isBraintreeCreditCardConfigValid) {\n response.error = true;\n response.messages = '.js_braintree_creditCardFields has not valid data-braintree-config';\n }\n } catch (error) {\n response.error = true;\n response.messages = error;\n }\n\n return response;\n}\n\n/**\n * Init Credit Card fields functionality\n * @param {Object} btCreditCardModel Braintree Credit Card model\n * @param {Object} $continueButton Continue button\n * @param {Constructor} errorHandlingModel Error handling model\n */\nfunction init(btCreditCardModel, $continueButton, errorHandlingModel) {\n errorHandlingModel.hideError();\n\n document.querySelectorAll('.js_braintree_creditCardFields').forEach(function (el) {\n try {\n var $braintreeCreditCardFieldsContainer = el;\n var braintreeCreditCardConfig = JSON.parse($braintreeCreditCardFieldsContainer.getAttribute('data-braintree-config'));\n var generalHostedFieldsValidation = generalHfValidation($braintreeCreditCardFieldsContainer, braintreeCreditCardConfig);\n\n if (generalHostedFieldsValidation.error) {\n if (generalHostedFieldsValidation.messages.length) {\n throw generalHostedFieldsValidation.messages;\n }\n }\n\n // Fraud Data will be only collected in case if corresponding Site Preference is enabled\n // For more details go inside \"btCreditCardModel.collectFraudData\" function logic\n btCreditCardModel.collectFraudData()\n .then(function (fraudDataPayload) {\n var $braintreeDeviceData = document.querySelector('#braintreeDeviceData');\n\n if (fraudDataPayload.deviceData) {\n $braintreeDeviceData.value = fraudDataPayload.deviceData;\n }\n\n // Init \"Credit Card Hosted Fields\"\n return btCreditCardModel.initCreditCardFields($continueButton);\n })\n .catch(function (err) {\n errorHandlingModel.creditCardErrorHandler(err);\n });\n\n // Update order data inside BT model each time when buyer update checkout view\n $('body').on('checkout:updateCheckoutView', btCreditCardModel.updateOrderData);\n\n // To prevent from repeatable Credit Card hosted fields initialization\n $braintreeCreditCardFieldsContainer.setAttribute('data-is-inited', true);\n } catch (err) {\n errorHandlingModel.creditCardErrorHandler(err);\n }\n });\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\nvar creditCardVaultManagerComponent = require('./creditCardVaultManager');\nvar creditCardPaymentProcessingHelper = require('../helpers/creditCardPaymentProcessingHelper');\nvar creditCardHelper = require('../helpers/creditCardHelper');\n\n/**\n * Makes the necessary setting for 'Save Credit Card block' on the Billing Page\n * @param {boolean} saveCreditCard true/false\n * @param {boolean} displaySaveCreditCardBlock true/false\n */\nfunction saveCreditCardBlockManipulation(saveCreditCard, displaySaveCreditCardBlock) {\n var $saveCreditCard = document.querySelector('#braintreeSaveCreditCard');\n var $braintreeSaveCardContainer = document.querySelector('#braintreeSaveCardContainer');\n\n if ($braintreeSaveCardContainer) {\n $braintreeSaveCardContainer.style.display = displaySaveCreditCardBlock ? 'block' : 'none';\n $saveCreditCard.checked = saveCreditCard;\n }\n}\n\n/**\n * Handles changing of Credit Card list on the Billing Page\n * @param {Constructor} errorHandlingModel Error handling model\n */\nfunction cardListChange(errorHandlingModel) {\n var btUtils = require('../../braintreeUtils');\n\n var $creditCardList = creditCardFormFieldHelper.getCreditCardListContainer();\n var $braintreeCreditCardNonce = creditCardFormFieldHelper.getCreditCardNonceFieldContainer();\n var $braintreeCardPaymentMethod = document.querySelector('#braintreeCardPaymentMethod');\n\n var creditCardOption = $creditCardList.selectedOptions[0];\n var creditCardOptionID = creditCardOption.id;\n var creditCardFieldsToDisplayArray = creditCardFormFieldHelper.getCCFieldsToDisplay().asArray;\n var creditCardHostedFieldsArray = creditCardFormFieldHelper.getCCFields().asArray;\n var creditCardFiledsToDisplayObject = creditCardFormFieldHelper.getCCFieldsToDisplay().asObject;\n\n // Variables only for \"braintreeSessionCreditAccount\" case\n var selectedCreditCard;\n var nonce = '';\n var saveCreditCard = true;\n var showSaveCreditCardBlock = true;\n\n if (creditCardOptionID !== 'newCardAccount') {\n // Clear error messages on the Billing Page\n errorHandlingModel.hideError();\n }\n\n switch (creditCardOptionID) {\n // When buyer selected \"new cc\"\n case 'newCardAccount':\n // Hide 'toDisplay' fields\n creditCardFormFieldHelper.hideCardElements(creditCardFieldsToDisplayArray);\n\n creditCardFormFieldHelper.showCardElements(creditCardHostedFieldsArray);\n\n // Display \"Save Credit Card\" block, and mark it as checked\n saveCreditCardBlockManipulation(saveCreditCard, showSaveCreditCardBlock);\n\n $braintreeCreditCardNonce.value = '';\n $braintreeCardPaymentMethod.value = 'CREDIT';\n break;\n\n case 'braintreeSessionCreditAccount':\n selectedCreditCard = btUtils.getSelectedData($creditCardList);\n nonce = selectedCreditCard['data-nonce'].value;\n saveCreditCard = selectedCreditCard['data-save-card'].value;\n\n // Display \"Save Credit Card\" block, and mark it as checked\n saveCreditCardBlockManipulation(saveCreditCard, showSaveCreditCardBlock);\n\n // Add values to the \"toDisplay\" and hidden input fields.\n creditCardFormFieldHelper.setCardFields(selectedCreditCard, creditCardFiledsToDisplayObject);\n\n creditCardFormFieldHelper.hideCardElements(creditCardHostedFieldsArray);\n creditCardFormFieldHelper.showCardElements(creditCardFieldsToDisplayArray);\n\n $braintreeCreditCardNonce.value = nonce;\n $braintreeCardPaymentMethod.value = selectedCreditCard['data-payment-method'].value.toUpperCase();\n break;\n\n // Case for saved credit cards\n default:\n saveCreditCard = false;\n showSaveCreditCardBlock = false;\n selectedCreditCard = btUtils.getSelectedData($creditCardList);\n\n // Add values to the 'toDisplay' and hidden input fields\n creditCardFormFieldHelper.setCardFields(selectedCreditCard, creditCardFiledsToDisplayObject);\n\n // Show these fields to the buyer\n creditCardFormFieldHelper.showCardElements(creditCardFieldsToDisplayArray);\n\n // Hide hosted fields (since we don't need them)\n creditCardFormFieldHelper.hideCardElements(creditCardHostedFieldsArray);\n\n // Display \"Save Credit Card\" block, and uncheck it\n saveCreditCardBlockManipulation(saveCreditCard, showSaveCreditCardBlock);\n\n $braintreeCreditCardNonce.value = nonce;\n $braintreeCardPaymentMethod.value = selectedCreditCard['data-payment-method'].value.toUpperCase();\n break;\n }\n}\n\n/**\n * Hide stored card if the new card is the same as already stored\n */\nfunction hideStoredCardAsSessionCard() {\n var $sessionCreditCard = $('#braintreeSessionCreditAccount');\n var isSessionCardVisible = $sessionCreditCard.css('display') !== 'none';\n var sessionCardType = $sessionCreditCard.data('type');\n var sessionCardLastFour = $sessionCreditCard.data('last-four');\n\n if (isSessionCardVisible && sessionCardType && sessionCardLastFour) {\n sessionCardType = sessionCardType.toLowerCase();\n sessionCardLastFour = sessionCardLastFour.toString();\n var storedAsSessionCardExists;\n\n storedAsSessionCardExists = creditCardPaymentProcessingHelper.hideAlreadyStoredCard(sessionCardLastFour, sessionCardType);\n\n if (storedAsSessionCardExists) {\n // Hide CC save block and unclick \"save\" checkbox\n creditCardHelper.hideSaveCreditCardBlock(true);\n creditCardHelper.saveCreditCard(false);\n }\n }\n}\n\n/**\n * Inits Credit Card list functionality\n * @param {Object} btCreditCardModel BT Credit Card model\n * @param {Constructor} errorHandlingModel errorHandlingModel Error handling model\n */\nfunction init(btCreditCardModel, errorHandlingModel) {\n var $creditCardList = document.querySelector('#braintreeCreditCardList');\n var creditCardListExist = Boolean($creditCardList);\n var clientInstancePromise = btCreditCardModel.getClientInstancePromise();\n\n if (creditCardListExist) {\n $creditCardList.addEventListener('change', function () {\n cardListChange(errorHandlingModel);\n });\n }\n\n cardListChange(errorHandlingModel);\n // Only for logged in buyer with stored cards in wallet\n creditCardVaultManagerComponent.removeFromDomCardsWhichAreNotInVaultMgr(clientInstancePromise);\n hideStoredCardAsSessionCard();\n}\n\n\nmodule.exports = {\n init,\n cardListChange\n};\n","/* eslint-disable no-console */\n'use strict';\n\n/* global Promise braintree $ */\n\nvar helper = require('../../helper');\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\nvar btCreditCardModel = require('../braintreesdk/braintreeCreditCardModel');\nvar creditCardPaymentProcessingHelper = require('../helpers/creditCardPaymentProcessingHelper');\nvar loaderInstance = require('../../loaderHelper');\nvar creditCardPaymentProcessingConstants = require('../constants/creditCardPaymentProcessingConstants');\nvar creditCardVaultManager = require('./creditCardVaultManager');\nvar creditCardHelper = require('../helpers/creditCardHelper');\n\nvar $continueButton = document.querySelector('button.submit-payment');\nvar $creditCardList = document.querySelector('#braintreeCreditCardList');\nvar $braintreeCreditCardLoader = document.querySelector('#braintreeCreditCardLoader');\nvar $customCreditCardErrorContainer = document.querySelector('#customCreditCardErrorContainer');\n\nvar loader;\nvar errHandlingModel;\n\n/**\n * Process Credit Card on the Billing Page\n * @param {Object} event Event object\n * @returns {void}\n */\nfunction processCreditCard(event) {\n event.preventDefault();\n event.stopPropagation();\n\n // Removes error messages on the Billing Page\n errHandlingModel.hideError();\n\n btCreditCardModel.updateOrderData().then(function() {\n try {\n var customErrorMessages = JSON.parse($customCreditCardErrorContainer.getAttribute('data-errors'));\n var basketDataValidResponse = btCreditCardModel.isBasketDataValid(customErrorMessages.TOTAL_BASKET_AMOUNT_INVALID);\n \n if (basketDataValidResponse.error) {\n throw basketDataValidResponse.customErrorMessage;\n }\n \n var clientInstancePromise = btCreditCardModel.getClientInstancePromise();\n\n // Data passed inside \"braintreeCreditCardModel\"\n var billingData = helper.getBillingAddressFormValues();\n var email = document.querySelector('.customer-summary-email').textContent;\n var isCheckoutFlow = true;\n\n var creditCardFlow = creditCardPaymentProcessingHelper.getCreditCardFlowID($creditCardList);\n var result;\n\n loader.show();\n\n switch (creditCardFlow) {\n // Case for new card\n case creditCardPaymentProcessingConstants.FLOW_NEW_CARD_NAME:\n result = btCreditCardModel.processNewCard(email, billingData, isCheckoutFlow)\n .then(function (btPayload) {\n \n\n var btPayloadDetails = btPayload.btTokenizePayload.details;\n var newCardType = btPayloadDetails.cardType.toLowerCase();\n var newCardLastFour = btPayloadDetails.lastFour.toString();\n\n // Hide already stored card in case if new card is the same\n creditCardVaultManager.isNewCardCanBeStored(\n clientInstancePromise,\n newCardLastFour,\n newCardType\n )\n .then(function (newCardCanBeStored) {\n if (!newCardCanBeStored) {\n creditCardPaymentProcessingHelper.hideAlreadyStoredCard(newCardLastFour, newCardType);\n // Hide CC save block and unclick \"save\" checkbox\n creditCardHelper.hideSaveCreditCardBlock(true);\n creditCardHelper.saveCreditCard(false);\n }\n });\n\n // Fill hidden inputs CreditCard fields and Session CreditCard div fields\n creditCardPaymentProcessingHelper.fillCreditCardFormWithPayloadData(btPayload);\n\n // Filling of session card attributes for using them in business logic (client/server)\n creditCardPaymentProcessingHelper.setSessionCreditCardDataAttributes(btPayload);\n\n // Fill 'toDisplay' fields with data to display them for buyer\n // creditCardPaymentProcessingHelper.fillSessionCreditCardFormWithPayloadData(btPayload);\n\n // Display \"Stored Accounts\" list\n creditCardPaymentProcessingHelper.displayStoredCreditCardList();\n\n // Select \"Session Account Option\" in \"Account List\"\n creditCardPaymentProcessingHelper.markAsSelectedSessionAccount();\n\n // Clear \"Hosted Fields\" (from iframe)\n //btCreditCardModel.clearHostedFields();\n\n // Show \"Session Credit Card\" fields (in div blocks)\n //creditCardFormFieldHelper.showCardElements(creditCardFormFieldHelper.getCCFieldsToDisplay().asArray);\n\n // Hide hosted fields (iframe fields)\n //creditCardFormFieldHelper.hideCardElements(creditCardFormFieldHelper.getCCFields().asArray);\n helper.continueButtonToggle(false);\n });\n break;\n\n // Case for session card\n case creditCardPaymentProcessingConstants.FLOW__SESSION_CARD_NAME:\n result = btCreditCardModel.processSessionCard();\n break;\n\n // Case for stored card\n case creditCardPaymentProcessingConstants.FLOW_JS_STORED_CARD_NAME:\n result = creditCardPaymentProcessingHelper.getNonceFromStoredCard(clientInstancePromise, $creditCardList)\n .then(function (response) {\n var nonce = response.nonce;\n var bin = response.details ? response.details.bin : '';\n\n return btCreditCardModel.processStoredCard(email, billingData, nonce, bin)\n .then(function (btStoredCardPayload) {\n var basketDataValidResponse = btCreditCardModel.isBasketDataValid(customErrorMessages.TOTAL_BASKET_AMOUNT_INVALID);\n \n if (basketDataValidResponse.error) {\n throw basketDataValidResponse.customErrorMessage;\n }\n\n var threeDSecureDataValidationPayload = btStoredCardPayload.threeDSecureInfo;\n\n if (threeDSecureDataValidationPayload) {\n creditCardPaymentProcessingHelper.fill3DsData(threeDSecureDataValidationPayload);\n }\n });\n });\n break;\n\n default:\n // Handle error with wrong checkout flow\n result = Promise.reject(customErrorMessages.WROND_CHECKOUT_FLOW);\n break;\n }\n\n result\n .then(function () {\n loader.hide();\n // Trigger \"Submit Payment\" button\n event.target.click();\n })\n .catch(function (error) {\n loader.hide();\n\n // Braintree Errors\n errHandlingModel.creditCardErrorHandler(error);\n });\n } catch (error) {\n loader.hide();\n errHandlingModel.creditCardErrorHandler(error);\n }\n });\n}\n\n/**\n * Inits Credit Card process on the Billing Page\n * @param {Constructor} errorHandlingModel Error handling constructor\n */\nfunction init(errorHandlingModel) {\n loader = loaderInstance($braintreeCreditCardLoader);\n errHandlingModel = errorHandlingModel;\n\n $continueButton.addEventListener('click', function (event) {\n var isCreditCardTabActive = creditCardPaymentProcessingHelper.isActiveCreditCardTab();\n\n // Removes active session payment method once 'Next: Place order' button clicked\n helper.removeActiveSessionPayment();\n\n if (!event.isTrusted || !isCreditCardTabActive) {\n return;\n }\n \n processCreditCard(event);\n });\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar creditCardPaymentProcessingHelper = require('../helpers/creditCardPaymentProcessingHelper');\nvar creditCardHelper = require('../helpers/creditCardHelper');\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\nvar creditCardSessionAccountHelper = require('../helpers/creditCardSessionAccountHelper');\n\n/*\n Update Session account\n**/\nfunction clearSessionAccount(sessionOption) {\n sessionOption.selected = false;\n sessionOption.classList.add('used-creditcard-account-hide');\n sessionOption.classList.remove('used-creditcard-account');\n sessionOption.text = '';\n sessionOption.setAttribute('data-session-account', false);\n sessionOption.setAttribute('data-owner', false);\n sessionOption.setAttribute('data-expiration', false);\n sessionOption.setAttribute('data-number', false);\n sessionOption.setAttribute('data-nonce', false);\n sessionOption.setAttribute('data-type', false);\n sessionOption.setAttribute('data-save-card', false);\n}\n\n/**\n * Remove Credit Card session account\n */\nfunction removeSessionNonce() {\n var defaultCreditCard = helper.getOptionByDataDefault('#braintreeCreditCardList');\n var creditCardFieldstoDisplay = creditCardFormFieldHelper.getCCFieldsToDisplay();\n var creditCardFieldsAsArray = creditCardFormFieldHelper.getCCFields().asArray;\n var sessionOption = helper.getSessionAccountOption({\n querySelector: '#braintreeCreditCardList',\n id: 'braintreeSessionCreditAccount'\n });\n\n if (!sessionOption) {\n return;\n }\n\n var sessionLastFour = sessionOption.getAttribute('data-last-four');\n var sessionType = sessionOption.getAttribute('data-type').toLowerCase();\n\n clearSessionAccount(sessionOption);\n\n // Handles case when stored and session credit card have the same type and last four digest\n // Makes visable already stored Credit Card in Credit Card List\n creditCardPaymentProcessingHelper.showAlreadyStoredCard(\n sessionLastFour,\n sessionType\n );\n\n creditCardSessionAccountHelper.clearCreditCardFields();\n creditCardSessionAccountHelper.clearCreditCardNonceField();\n\n if (defaultCreditCard) {\n defaultCreditCard.selected = true;\n\n creditCardFormFieldHelper.setCreditCardFieldsToDisplay(defaultCreditCard, creditCardFieldstoDisplay.asObject);\n\n // Uncheck Save Credit Card checkbox\n creditCardHelper.saveCreditCard(false);\n creditCardHelper.hideSaveCreditCardBlock(true);\n } else {\n creditCardFormFieldHelper.hideCardElements(creditCardFieldstoDisplay.asArray);\n creditCardFormFieldHelper.showCardElements(creditCardFieldsAsArray);\n\n // Hides 'Select a Credit Card block' on the Billing Page\n var ccAccount = document.querySelector('.form-group.braintree_used_creditcard_account');\n ccAccount.classList.remove('used-creditcard-account');\n ccAccount.classList.add('used-creditcard-account-hide');\n }\n}\n\nmodule.exports = {\n removeSessionNonce\n};\n","'use strict';\n\nvar CreditCardVaultManagerModel = require('./creditCardVaultManagerModel');\n\n/**\n * Function which hide all stored CC which are not presented in VaultMgr\n * @param {Promise} clientInstancePromise BT client instance promise\n */\nfunction removeFromDomCardsWhichAreNotInVaultMgr(clientInstancePromise) {\n var CreditCardVaultManagerModelInstance = new CreditCardVaultManagerModel(clientInstancePromise);\n var storefrontCardArray = [];\n\n $('.js_stored_card').each(function (i, el) {\n var $card = $(el);\n\n storefrontCardArray.push({\n cardType: $card.data('type'),\n lastFour: $card.data('last-four'),\n $card: $card\n });\n });\n\n if (storefrontCardArray.length) {\n CreditCardVaultManagerModelInstance.getCardsWhichAreNotInVault(storefrontCardArray)\n .then(function (cardsWhichAreNotInVault) {\n cardsWhichAreNotInVault.forEach(function (card) {\n card.$card.remove();\n });\n });\n }\n}\n\n/**\n * Return true in case if passed card can be stored on the Storefront and in the Vault\n * @param {Promise} clientInstancePromise BT client instance promise\n * @param {string} lastFour last four digits of the new card\n * @param {string} cardType type of new card\n * @returns {Promise} Promise with true or false\n */\nfunction isNewCardCanBeStored(clientInstancePromise, lastFour, cardType) {\n var CreditCardVaultManagerModelInstance = new CreditCardVaultManagerModel(clientInstancePromise);\n var storefrontCardArray = [];\n\n $('.js_stored_card').each(function (i, el) {\n var $card = $(el);\n\n storefrontCardArray.push({\n cardType: $card.data('type').toLowerCase(),\n lastFour: $card.data('last-four'),\n $card: $card\n });\n });\n\n // Return \"false\" in case if new card exists on the Storefront and in the VaultMgr\n return CreditCardVaultManagerModelInstance.isCreditCardExistOnStorefrontAndVault(storefrontCardArray, lastFour, cardType)\n .then(function (isCardExists) {\n return !isCardExists;\n });\n}\n\nmodule.exports = {\n removeFromDomCardsWhichAreNotInVaultMgr,\n isNewCardCanBeStored\n};\n","'use strict';\n\nvar braintreeGeneral = require('../../braintreeGeneral');\n\n/**\n * Constructor of VaultMgr model\n * @param {Promise} personalizedClientTokenPromise BT clietn instance promise\n */\nfunction CreditCardVaultManagerModel(personalizedClientTokenPromise) {\n this.customerPaymentMethodsFromVaultPromise = braintreeGeneral.getBtCustomerPaymentMethods(personalizedClientTokenPromise);\n}\n\n/**\n * Ger specific payment methods from VaultMgr (both CC and VisaCheckout cards)\n * @param {Promise} customerPaymentMethodsFromVaultPromise Promise with payment methods of buyer taken from VaultMgr\n * @returns {Promise} Promise with array of Cards\n */\nfunction getCardsFromVaultMgrPromise(customerPaymentMethodsFromVaultPromise) {\n return customerPaymentMethodsFromVaultPromise\n .then(function (vaultMgrPaymentMethods) {\n var cardPmArray = [];\n\n vaultMgrPaymentMethods.forEach(function (paymentMethod) {\n var isCardType = paymentMethod.type === 'CreditCard' || paymentMethod.type === 'VisaCheckoutCard';\n\n if (isCardType) {\n cardPmArray.push(paymentMethod);\n }\n });\n\n return cardPmArray;\n });\n}\n\n/**\n * Find CC by data within VaultMgr\n * @param {Promise} customerPaymentMethodsFromVaultPromise Array with Payment Methods from VaultMgr\n * @param {string} lastFour Last four credit card digits\n * @param {string} cardType Credit Card type (Visa, Mastercard)\n * @returns {Promise} Promise with found Credit Card\n */\nfunction getCardFromVaultMgrByData(customerPaymentMethodsFromVaultPromise, lastFour, cardType) {\n return customerPaymentMethodsFromVaultPromise\n .then(function (vaultMgrPaymentMethods) {\n return vaultMgrPaymentMethods.find(function (paymentMethod) {\n var isCardType = paymentMethod.type === 'CreditCard' || paymentMethod.type === 'VisaCheckoutCard';\n var pmDetails = paymentMethod.details;\n\n return isCardType && pmDetails.cardType.toLowerCase() === cardType && pmDetails.lastFour === lastFour;\n });\n });\n}\n\n/**\n * Function which look for CC by passed data inside Storefront CC list\n * @param {Array} storefrontCardList Array with CC from Storefront\n * @param {string} lastFour Last four credit card digits\n * @param {string} cardType Credit Card type (Visa, Mastercard)\n * @returns {Promise} Promise with found credit card\n */\nfunction getCardFromStorefrontByData(storefrontCardList, lastFour, cardType) {\n return storefrontCardList.find(function (storedStorefrontCard) {\n return storedStorefrontCard.lastFour.toString() === lastFour.toString() &&\n storedStorefrontCard.cardType.toLocaleLowerCase() === cardType.toLocaleLowerCase();\n });\n}\n\n/**\n * Check is CC exists on the Storefront but not in the Vault\n * @param {Array} storefrontCardList Array with CC from storefront\n * @returns {Promise} Promise with true/false. True in case if CC exists on the Storefront but not in the Vault\n */\nCreditCardVaultManagerModel.prototype.getCardsWhichAreNotInVault = function (storefrontCardList) {\n return getCardsFromVaultMgrPromise(this.customerPaymentMethodsFromVaultPromise)\n .then(function (cardPaymentMethods) {\n var arrayOfNotInVaultCards = [];\n\n storefrontCardList.forEach(function (storefrontCard) {\n var sfCardType = storefrontCard.cardType.toLocaleLowerCase();\n var sfLastFour = storefrontCard.lastFour.toString();\n var foundCard = cardPaymentMethods.find(function (vaultMgrCard) {\n var pmDetails = vaultMgrCard.details;\n\n return pmDetails.cardType.toLocaleLowerCase() === sfCardType && pmDetails.lastFour === sfLastFour;\n });\n\n if (!foundCard) {\n arrayOfNotInVaultCards.push(storefrontCard);\n }\n });\n\n return arrayOfNotInVaultCards;\n });\n};\n\n/**\n * Check is CC exists on the Storefront and in the Vault\n * @param {Array} storefrontCardList Array with CC from Storefront\n * @param {string} lastFour Last four credit card digits which buyer wants to add\n * @param {string} cardType Credit Card type (Visa, Mastercard) which buyer wants to add\n * @returns {Promise} Promise with true/fase. True in case if CC is exists in the Vault and on the Storefront\n */\nCreditCardVaultManagerModel.prototype.isCreditCardExistOnStorefrontAndVault = function (storefrontCardList, lastFour, cardType) {\n var storefrontCard = getCardFromStorefrontByData(storefrontCardList, lastFour, cardType);\n var vaultMgrCardPromise = getCardFromVaultMgrByData(\n this.customerPaymentMethodsFromVaultPromise,\n lastFour,\n cardType\n );\n\n return vaultMgrCardPromise\n .then(function (cardFromVaultMgr) {\n return cardFromVaultMgr && storefrontCard;\n });\n};\n\n/**\n * Return CC from VaultManager by passed data\n * @param {string} lastFour Last four credit card digits\n * @param {string} cardType Credit Card type (Visa, Mastercard)\n * @returns {Promise} Promise with nonce or empty string\n */\nCreditCardVaultManagerModel.prototype.getNonceByCardData = function (lastFour, cardType) {\n return getCardFromVaultMgrByData(\n this.customerPaymentMethodsFromVaultPromise,\n lastFour,\n cardType\n );\n};\n\nmodule.exports = CreditCardVaultManagerModel;\n","'use strict';\n\nmodule.exports = {\n FLOW_NEW_CARD_NAME: 'newcard',\n FLOW__SESSION_CARD_NAME: 'sessioncard',\n FLOW_JS_STORED_CARD_NAME: 'js_stored_card'\n};\n","/* eslint-disable no-console */\n/* eslint-disable block-scoped-var */\n'use strict';\n\n// Braintree SDK model builder, we need to init Braintree Credit Card model on this level, since we are using it on step of \"creditCardFields.init()\"\n// and on step of \"creditCardPayment.init()\".\nvar braintreeCreditCardModelBuilder = require('./braintreesdk/braintreeCreditCardModelBuilder');\n\n// Components\nvar creditCardList = require('./components/creditCardList');\nvar creditCardFields = require('./components/creditCardFields');\nvar creditCardPaymentProcessing = require('./components/creditCardPaymentProcessing');\nvar creditCardAccount = require('./components/creditCardAccount');\n\n// Modelds\nvar ErrorHandlingBaseModel = require('../creditcard/errorhandler/errorHandlingBaseModel');\nvar ErrorHandlingCheckoutModel = require('../creditcard/errorhandler/errorHandlingCheckoutModel');\n\nvar $continueButton = document.querySelector('button.submit-payment');\n\nvar btCreditCardModelResponse;\nvar creditCardMessages;\n\n/**\n * Inits Credit Card functionality on the Account Page\n * @returns {void}\n */\nfunction initAccount() {\n var errorHandlingBaseModel = new ErrorHandlingBaseModel(creditCardMessages);\n\n if (!btCreditCardModelResponse || btCreditCardModelResponse.error) {\n errorHandlingBaseModel.creditCardErrorHandler(btCreditCardModelResponse.message);\n }\n\n creditCardAccount.init(\n btCreditCardModelResponse.btCreditCardModel,\n errorHandlingBaseModel,\n creditCardMessages\n );\n\n creditCardFields.init(\n btCreditCardModelResponse.btCreditCardModel,\n $continueButton,\n errorHandlingBaseModel\n );\n}\n\n/**\n * Inits Credit Card functionality on the Checkout Page\n * @returns {void}\n */\nfunction initCheckout() {\n var errorHandlingCheckoutModel = new ErrorHandlingCheckoutModel(creditCardMessages);\n\n if (!btCreditCardModelResponse || btCreditCardModelResponse.error) {\n errorHandlingCheckoutModel.creditCardErrorHandler(btCreditCardModelResponse.message);\n }\n\n // Call server to update data from basket\n btCreditCardModelResponse.btCreditCardModel.updateOrderData();\n\n creditCardFields.init(\n btCreditCardModelResponse.btCreditCardModel,\n $continueButton,\n errorHandlingCheckoutModel\n );\n\n creditCardList.init(\n btCreditCardModelResponse.btCreditCardModel,\n errorHandlingCheckoutModel\n );\n\n creditCardPaymentProcessing.init(errorHandlingCheckoutModel);\n}\n\n/**\n * Inits 'braintreeCreditCardModelBuilder' on creditCard level\n */\nfunction init() {\n btCreditCardModelResponse = braintreeCreditCardModelBuilder.init();\n\n if (!btCreditCardModelResponse.error) {\n creditCardMessages = btCreditCardModelResponse.btCreditCardConfigs.messages;\n }\n}\n\nmodule.exports = {\n initAccount,\n initCheckout,\n init\n};\n","'use strict';\n// File for form fields validation (applying red, green, yellow frame)\n// This file is used ONLY for validation of Owner field (since Owner field isn't a Hosted Field provided by Braintree client SDK)\n\nvar creditCardFormFieldsHelper = require('../helpers/creditCardFormFieldsHelper');\n\nvar BRAINTREE_ERROR_SELECTOR = 'braintree-hosted-fields-invalid';\nvar BRAINTREE_VALID_SELECTOR = 'braintree-hosted-fields-valid';\nvar BRAINTREE_FOCUSED_SELECTOR = 'braintree-hosted-fields-focused';\n\n/**\n * Returns array of filed containers\n * @param {Array} arrayOfFormFields Array of invalid fields\n * @returns {Array} Array of filed containers\n */\nfunction getArrayOfFieldContainers(arrayOfFormFields) {\n var collectionOfCreditCardFields = creditCardFormFieldsHelper.getCCFields().asObject;\n var arrayOfFieldContainers = [];\n var fieldContainer;\n\n arrayOfFormFields.forEach(function (fieldName) {\n fieldContainer = collectionOfCreditCardFields[fieldName];\n\n if (fieldContainer) {\n arrayOfFieldContainers.push(fieldContainer);\n }\n });\n\n return arrayOfFieldContainers;\n}\n\n/**\n * Sets 'BRAINTREE_ERROR_SELECTOR' selector to the invalid form fields\n * @param {Array} arrayOfInvalidFieldsFrom Array of invalisd fields\n */\nfunction makeFormFieldsInvalid(arrayOfInvalidFieldsFrom) {\n var arrayOfInvalidFormFields = getArrayOfFieldContainers(arrayOfInvalidFieldsFrom);\n\n arrayOfInvalidFormFields.forEach(function ($field) {\n // remove \"field valid\" class\n $field.classList.remove(BRAINTREE_VALID_SELECTOR);\n // add \"field not valid\" class\n $field.classList.add(BRAINTREE_ERROR_SELECTOR);\n });\n}\n\n/**\n * Makes all fields invalid\n */\nfunction makeAllFormFieldsInvalid() {\n var collectionOfCreditCardFields = creditCardFormFieldsHelper.getCCFields().asObject;\n var arrayOfCreditCardFieldNames = Object.keys(collectionOfCreditCardFields);\n\n makeFormFieldsInvalid(arrayOfCreditCardFieldNames);\n}\n\n/**\n * Makes all form fields valid\n */\nfunction makeAllFormFieldsValid() {\n var arrayOfCreditCardFields = creditCardFormFieldsHelper.getCCFields().asArray;\n\n arrayOfCreditCardFields.forEach(function ($field) {\n // remove \"field in focuse\" class\n $field.classList.remove(BRAINTREE_FOCUSED_SELECTOR);\n // remove \"field not valid\" class\n $field.classList.remove(BRAINTREE_ERROR_SELECTOR);\n // add \"field valid\" class\n $field.classList.add(BRAINTREE_VALID_SELECTOR);\n });\n}\n\nmodule.exports = {\n makeFormFieldsInvalid,\n makeAllFormFieldsInvalid,\n makeAllFormFieldsValid\n};\n","'use strict';\n\nvar creditCardFormFieldValidation = require('./creditCardFormFieldsValidator');\n\nvar ALL_HOSTED_FIELDS_FIELDS_EMPTY = 'HOSTED_FIELDS_FIELDS_EMPTY';\nvar HOSTED_FIELDS_FIELDS_INVALID = 'HOSTED_FIELDS_FIELDS_INVALID';\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages Braintree Credit Card error messages\n */\nfunction ErrorHandlingBaseModel(errorMessages) {\n this.errorMessages = errorMessages;\n}\n\n// General method which should be used for cases when error came from Braintree\nErrorHandlingBaseModel.prototype.showErrorByObject = function (error) {\n var msg = error.message;\n var code = error.code;\n var errorMessage = this.errorMessages[code] || msg || this.errorMessages.CLIENT_GATEWAY_NETWORK;\n\n this.createErrorNotification(errorMessage);\n};\n\nErrorHandlingBaseModel.prototype.showErrorByMessage = function (message) {\n this.createErrorNotification(message);\n};\n\n/**\n * ---- Method which should hide error container and make it empty. On Account we use this one ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Hide error notification\n */\nErrorHandlingBaseModel.prototype.hideError = function () {\n var $errorContainer = $('.error-messaging');\n\n $errorContainer.hide();\n $errorContainer.empty();\n};\n\n/**\n * ---- Error container which will be used on Account ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Method responsible for Error Notification generation\n * @param {string} message Message to display inside error notification\n */\nErrorHandlingBaseModel.prototype.createErrorNotification = function (message) {\n var $errorContainer = $('.error-messaging');\n\n var errorHtml = '
' +\n '' + message + '
';\n\n $errorContainer.append(errorHtml);\n $errorContainer.show();\n window.scrollTo(0, 0);\n};\n\n/**\n * Converts Braintree fields\n * @param {Array} arrayOfBtFormFields Credit Cards hosted fileds in array\n * @returns {Array} Converted array\n */\nErrorHandlingBaseModel.prototype.convertBtFromFieldsToDw = function (arrayOfBtFormFields) {\n var creditCardFieldsMap = {\n cardholderName: 'braintreeCardOwner',\n number: 'braintreeCardNumber',\n cvv: 'braintreeCvv',\n expirationDate: 'braintreeExpirationDate'\n };\n var braintreeFieldName;\n var convertedFeeldArray = [];\n\n arrayOfBtFormFields.forEach(function (fieldName) {\n braintreeFieldName = creditCardFieldsMap[fieldName];\n convertedFeeldArray.push(braintreeFieldName);\n });\n\n return convertedFeeldArray;\n};\n\n/**\n * Handles all fields are empty behavior\n */\nErrorHandlingBaseModel.prototype.allFieldsAreEmptyErrorBehavior = function () {\n creditCardFormFieldValidation.makeAllFormFieldsInvalid();\n};\n\n/**\n * Handles some fileds are empty behavior\n * @param {Array} btInvalidHostedFields Invalid fileds\n */\nErrorHandlingBaseModel.prototype.someFieldsAreInvalidErrorBehavior = function (btInvalidHostedFields) {\n var convertedFormFields = this.convertBtFromFieldsToDw(btInvalidHostedFields);\n\n creditCardFormFieldValidation.makeFormFieldsInvalid(convertedFormFields);\n};\n\n/**\n * Process and validates case when buyer left hosted feieds empty\n * @param {Object} errorPayload Payload with error information\n * @param {string} braintreeErrorCode Error code\n */\nErrorHandlingBaseModel.prototype.processBraintreeHostedFiledsErrors = function (errorPayload, braintreeErrorCode) {\n switch (braintreeErrorCode) {\n case ALL_HOSTED_FIELDS_FIELDS_EMPTY:\n this.allFieldsAreEmptyErrorBehavior();\n break;\n\n case HOSTED_FIELDS_FIELDS_INVALID:\n var invalidFields = errorPayload.details.invalidFieldKeys;\n\n this.someFieldsAreInvalidErrorBehavior(invalidFields);\n break;\n default:\n break;\n }\n};\n\n/**\n * Handle \"Credit Card\" error cases.\n * Cases can be slpited on Custom (errors trigered via \"Promise.reject\" from our side)\n * and on Braintree (errors from Braintree Client SDK)\n * @param {Object} error Error payload from \".catch()\" block\n */\nErrorHandlingBaseModel.prototype.creditCardErrorHandler = function (error) {\n switch (error.name) {\n case 'BraintreeError':\n // Puts error on the top of the Credit Page\n this.showErrorByObject(error);\n this.processBraintreeHostedFiledsErrors(error, error.code);\n break;\n default:\n var errorMsg;\n\n // Handles the cases when 3ds secure failed\n if (error.customError) {\n errorMsg = this.errorMessages.secure3DFailed;\n // Not braintree errors\n } else {\n errorMsg = error.message ? error.message : error;\n }\n\n this.showErrorByMessage(errorMsg);\n break;\n }\n};\n\nmodule.exports = ErrorHandlingBaseModel;\n\n","\n'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages Braintree Credit Card error messages\n */\nfunction ErrorHandlingCheckoutModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.$topErrorMessageText = document.querySelector('.error-message-text');\n this.$topErrorMessageWrapper = document.querySelector('.error-message');\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingCheckoutModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.createErrorNotification = function (message) {\n this.$topErrorMessageText.textContent = '';\n this.$topErrorMessageText.append(message);\n this.$topErrorMessageWrapper.style.display = 'block';\n\n window.scrollTo(0, 0);\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.hideError = function () {\n this.$topErrorMessageWrapper.style.display = 'none';\n this.$topErrorMessageText.innerHTML = '';\n};\n\nmodule.exports = ErrorHandlingCheckoutModel;\n","'use strict';\n\nvar helper = require('../../helper');\n\n/**\n * Creates tokenization options for 'tokenize' function.\n * @returns {Object} Object with tokenization options.\n */\nfunction createTokenizationOptions() {\n var billingData = helper.getBillingAddressFormValues();\n\n return {\n billingAddress: {\n firstName: billingData.firstName,\n lastName: billingData.lastName,\n streetAddress: billingData.address1.split('%20').join(' '),\n extendedAddress: billingData.address2 ? billingData.address2.split('%20').join(' ') : billingData.address2,\n locality: billingData.city.includes('%20') ? billingData.city.split('%20').join(' ') : billingData.city,\n region: billingData.stateCode,\n postalCode: billingData.postalCode,\n countryCodeAlpha2: billingData.country.includes('$20') ? billingData.country.split('%20').join(' ') : billingData.country\n }\n },\n {\n cardholderName: document.querySelector('#braintreeCardOwner').value\n };\n}\n\n\nmodule.exports = {\n createTokenizationOptions\n};\n","'use strict';\n\n/**\n * Sets value of credit card hidden fields needed for server side\n * @param {Object} tokenizePayload Tokenize payload\n */\nfunction setCardHiddenFields(tokenizePayload) {\n var tokenizePayloadDetails = tokenizePayload.details;\n\n document.querySelector('#braintreeCreditCardNonce').value = tokenizePayload.nonce;\n document.querySelector('#braintreeCardType').value = tokenizePayloadDetails.cardType;\n document.querySelector('#braintreeCardMaskNumber').value = tokenizePayloadDetails.lastFour;\n document.querySelector('#braintreeCardHolder').value = tokenizePayloadDetails.cardholderName;\n}\n\nmodule.exports = {\n setCardHiddenFields\n};\n","'use strict';\n// This file is about form fields manipulations.\n\n/**\n * Returns an object contains an object and an array of credit card fields to Display\n * @returns {Object} Object\n */\nfunction getCCFieldsToDisplay() {\n var $cardOwnerToDisplay = document.querySelector('#braintreeCardOwnerToDisplay');\n var $cardNumberToDisplay = document.querySelector('#braintreeCardNumberToDisplay');\n var $cardCvvToDisplay = document.querySelector('#braintreeCvvToDisplay');\n var $cardExpirationToDisplay = document.querySelector('#braintreeExpirationToDisplay');\n\n var ccToDisplayFieldsAsObject = {\n cardOwnerToDisplay: $cardOwnerToDisplay,\n cardNumberToDisplay: $cardNumberToDisplay,\n cardCvvToDisplay: $cardCvvToDisplay,\n cardExpirationToDisplay: $cardExpirationToDisplay\n };\n var ccToDisplayFieldsAsArray = Object.values(ccToDisplayFieldsAsObject);\n\n return {\n asObject: ccToDisplayFieldsAsObject,\n asArray: ccToDisplayFieldsAsArray\n };\n}\n\n/**\n * Returns an object contains an object and an array of credit card fields\n * @returns {Object} Object\n */\nfunction getCCFields() {\n var $braintreeCardOwner = document.querySelector('#braintreeCardOwner');\n var $braintreeExpirationDate = document.querySelector('#braintreeExpirationDate');\n var $braintreeCardNumber = document.querySelector('#braintreeCardNumber');\n var $braintreeCvv = document.querySelector('#braintreeCvv');\n\n var ccFieldsAsObject = {\n braintreeCardOwner: $braintreeCardOwner,\n braintreeExpirationDate: $braintreeExpirationDate,\n braintreeCardNumber: $braintreeCardNumber,\n braintreeCvv: $braintreeCvv\n };\n var ccFieldsAsArray = Object.values(ccFieldsAsObject);\n\n return {\n asObject: ccFieldsAsObject,\n asArray: ccFieldsAsArray\n };\n}\n\n/**\n * Returns braintreeCreditCardNonce container\n * @returns {Object} Input element\n */\nfunction getCreditCardNonceFieldContainer() {\n return document.querySelector('#braintreeCreditCardNonce');\n}\n\n/**\n * Returns braintreeCreditCardList container\n * @returns {Object} Select element\n */\nfunction getCreditCardListContainer() {\n return document.querySelector('#braintreeCreditCardList');\n}\n\n/**\n * Sets Credit Card field to display\n * @param {Object} selectedCard The values of fields to be set\n * @param {Object} cacheCardFields Object of elements contain credit cards fields to display\n */\nfunction setCreditCardFieldsToDisplay(selectedCard, cacheCardFields) {\n var cartNumber = selectedCard.dataset.number;\n\n cacheCardFields.cardNumberToDisplay.innerHTML = cartNumber;\n cacheCardFields.cardCvvToDisplay.innerHTML = '***';\n cacheCardFields.cardExpirationToDisplay.innerHTML = selectedCard.dataset.expiration;\n cacheCardFields.cardOwnerToDisplay.innerHTML = selectedCard.dataset.owner;\n\n document.querySelector('#braintreeCardType').value = selectedCard.dataset.type;\n document.querySelector('#braintreeCardMaskNumber').value = cartNumber;\n}\n\n/**\n * Sets Credit Card fileds on the Billing Page\n * @param {Object} selectedCard The values of fields to be set\n * @param {Object} cacheCardFields Object of elements contain credit cards fields\n */\nfunction setCardFields(selectedCard, cacheCardFields) {\n cacheCardFields.cardNumberToDisplay.innerHTML = selectedCard['data-number'].value;\n cacheCardFields.cardCvvToDisplay.innerHTML = '***';\n cacheCardFields.cardExpirationToDisplay.innerHTML = selectedCard['data-expiration'].value;\n cacheCardFields.cardOwnerToDisplay.innerHTML = selectedCard['data-owner'].value;\n\n document.querySelector('#braintreeCardType').value = selectedCard['data-type'].value;\n document.querySelector('#braintreeCardMaskNumber').value = selectedCard['data-number'].value;\n}\n\n/**\n * Shows Credit Card fileds on the Billing Page\n * @param {Array} cardFields Array of credit card fileds\n */\nfunction showCardElements(cardFields) {\n cardFields.forEach(function (el) {\n el.style.display = '';\n });\n}\n\n/**\n * Hides Credit Card fileds on the Billing Page\n * @param {Array} cardFields Array of Credit Card fileds\n */\nfunction hideCardElements(cardFields) {\n cardFields.forEach(function (el) {\n el.style.display = 'none';\n });\n}\n\n/**\n * Returns Credit Card hosted fileds styles\n * @returns {Object} Object of styles\n */\nfunction getHostedFieldsStyles() {\n return {\n input: {\n 'font-size': 'inherit',\n color: '#b7802a',\n padding: '6px 15px'\n },\n ':focus': {\n color: 'blue'\n },\n '.valid': {\n color: 'green'\n },\n '.cardholderName.valid': {\n color: 'black'\n },\n '.invalid': {\n color: 'red'\n }\n };\n}\n\n/**\n * Returns Credit Card hosted fields configs\n * @returns {Object} Object of configs\n */\nfunction getHostedFieldsConfig() {\n return {\n cardholderName: {\n selector: '#braintreeCardOwner'\n },\n number: {\n selector: '#braintreeCardNumber'\n },\n cvv: {\n selector: '#braintreeCvv'\n },\n expirationDate: {\n selector: '#braintreeExpirationDate'\n }\n };\n}\n\nmodule.exports = {\n getCCFieldsToDisplay,\n getCCFields,\n getCreditCardNonceFieldContainer,\n getCreditCardListContainer,\n showCardElements,\n hideCardElements,\n setCreditCardFieldsToDisplay,\n setCardFields,\n getHostedFieldsStyles,\n getHostedFieldsConfig\n};\n","'use strict';\n\n/**\n * Uncheck Save Credit Card checkbox\n * @param {boolean} save true/false\n */\nfunction saveCreditCard(save) {\n var isSave = save ? true : false; // eslint-disable-line\n\n document.querySelector('#braintreeSaveCreditCard').checked = isSave;\n}\n\n/**\n * Hides or Display 'braintreeSaveCardContainer' container\n * @param {boolean} hide true/false\n */\nfunction hideSaveCreditCardBlock(hide) {\n var isHide = hide ? true : false; // eslint-disable-line\n\n document.querySelector('#braintreeSaveCardContainer').style.display = isHide ? 'none' : 'block';\n}\n\n/**\n * Returns Braintree Credit Card configs\n * @returns {Object} Braintree Credit Card configs\n */\nfunction getCheckoutBraintreeCreditCardConfigs() {\n var braintreeCreditCardFieldsConfigs = null;\n\n try {\n braintreeCreditCardFieldsConfigs = JSON.parse(document.querySelector('.js_braintree_creditCardFields').getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeCreditCardFieldsConfigs;\n }\n\n return braintreeCreditCardFieldsConfigs;\n}\n\n/**\n * Converts Credit Card type to one style: first letter in upper case\n * to make session card type look like saved CC type\n * ex: MasterCard -> Mastercard\n * @param {string} type Card type\n * @returns {string} Converted card type\n */\nfunction convertCreditCardType(type) {\n var cardType = type.toLowerCase();\n\n return cardType.replace(/_/g, ' ').replace(cardType.charAt(0), (cardType.charAt(0)).toUpperCase());\n}\n\nmodule.exports = {\n getCheckoutBraintreeCreditCardConfigs,\n saveCreditCard,\n hideSaveCreditCardBlock,\n convertCreditCardType\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar creditCardHelper = require('./creditCardHelper');\nvar CreditCardVaultManagerModel = require('../components/creditCardVaultManagerModel');\n\n/**\n * Displays stores Credit Cards list on the Billing Page\n */\nfunction displayStoredCreditCardList() {\n var $creditCardAccount = document.querySelector('.form-group.braintree_used_creditcard_account');\n\n $creditCardAccount.classList.remove('used-creditcard-account-hide');\n $creditCardAccount.classList.add('used-creditcard-account');\n}\n\n/**\n * Fills the Credit Card form hidden inputs with payload data\n * @param {Object} braintreeResponse Object contains the data of new payment method\n */\nfunction fillCreditCardFormWithPayloadData(braintreeResponse) {\n var btResponse = braintreeResponse.btTokenizePayload;\n var $creditCardFieldsCardNumber = document.querySelector('input[name=dwfrm_billing_creditCardFields_cardNumber]');\n\n if (btResponse) {\n var btResponseDetails = btResponse.details;\n\n document.querySelector('#braintreeCardType').value = creditCardHelper.convertCreditCardType(btResponseDetails.cardType);\n document.querySelector('#braintreeCardMaskNumber').value = '************' + btResponseDetails.lastFour;\n document.querySelector('#braintreeCardExpirationMonth').value = btResponseDetails.expirationMonth;\n document.querySelector('#braintreeCardExpirationYear').value = btResponseDetails.expirationYear.substr(2);\n document.querySelector('#braintreeCardHolder').value = btResponseDetails.cardholderName;\n\n if ($creditCardFieldsCardNumber) {\n $creditCardFieldsCardNumber.value = '************' + btResponseDetails.lastFour;\n }\n\n document.querySelector('input[name=braintreePaymentMethodNonce]').value = btResponse.nonce;\n }\n}\n\n/**\n * Fills the session Credit Card form inputs with payload data\n * @param {Object} braintreeResponse Object contains the data of new payment method\n */\nfunction fillSessionCreditCardFormWithPayloadData(braintreeResponse) {\n var btResponse = braintreeResponse.btTokenizePayload;\n var usedCreditCardAccount = Boolean(document.querySelector('.form-group.braintree_used_creditcard_account'));\n\n if (usedCreditCardAccount && btResponse) {\n var btResponseDetails = btResponse.details;\n var $sessionCreditCard = document.querySelector('#braintreeSessionCreditAccount');\n\n // Fields filling for displaying session card fields to the buyer\n document.querySelector('#braintreeCardOwnerToDisplay').textContent = btResponseDetails.cardholderName;\n document.querySelector('#braintreeCardNumberToDisplay').textContent = '************' + btResponseDetails.lastFour;\n document.querySelector('#braintreeCvvToDisplay').textContent = '***';\n document.querySelector('#braintreeExpirationToDisplay').textContent = btResponseDetails.expirationMonth + '/' + btResponseDetails.expirationYear.substr(2);\n\n // Fields filling for displaying session card option value\n $sessionCreditCard.textContent = $sessionCreditCard.getAttribute('data-type') + ' ' +\n $sessionCreditCard.getAttribute('data-number') + ' ' +\n $sessionCreditCard.getAttribute('data-expiration') + ' ' +\n $sessionCreditCard.getAttribute('data-owner');\n }\n}\n\n/**\n * Filling of session card attributes for using them in business logic (client/server)\n * @param {Object} braintreeResponse Tokenize payload from braintree\n */\nfunction setSessionCreditCardDataAttributes(braintreeResponse) {\n var btResponse = braintreeResponse.btTokenizePayload;\n var btResponseDetails = btResponse.details;\n var $sessionCreditCard = document.querySelector('#braintreeSessionCreditAccount');\n var isSavedCard = document.querySelector('#braintreeSaveCreditCard') ? document.querySelector('#braintreeSaveCreditCard').checked : false;\n\n $sessionCreditCard.classList.remove('used-creditcard-account-hide');\n $sessionCreditCard.setAttribute('data-number', '************' + btResponseDetails.lastFour);\n $sessionCreditCard.setAttribute('data-expiration', btResponseDetails.expirationMonth + '/' + btResponseDetails.expirationYear.substr(2));\n $sessionCreditCard.setAttribute('data-type', creditCardHelper.convertCreditCardType(btResponseDetails.cardType));\n $sessionCreditCard.setAttribute('data-last-four', btResponseDetails.lastFour);\n $sessionCreditCard.setAttribute('data-owner', btResponseDetails.cardholderName);\n $sessionCreditCard.setAttribute('data-nonce', btResponse.nonce);\n $sessionCreditCard.setAttribute('data-session-account', true);\n $sessionCreditCard.setAttribute('data-save-card', isSavedCard);\n}\n\n/**\n * Marks a session Credit Card account as selected\n */\nfunction markAsSelectedSessionAccount() {\n var $newCCAccount = document.getElementById('newCardAccount');\n var $sessionCreditCard = document.querySelector('#braintreeSessionCreditAccount');\n\n $newCCAccount.removeAttribute('selected');\n $sessionCreditCard.selected = true;\n}\n\n/**\n * Returns a Credit Card flow ID from selector\n * @param {Object} $creditCardList Selector contained the Credit Card flow ID\n * @returns {string} Credit Card flow ID\n */\nfunction getCreditCardFlowID($creditCardList) {\n var selectedOptionValue = $creditCardList.value;\n var selectedOption = null;\n var creditCardFlowID = null;\n\n var newCardID = 'newcard';\n var sessionCardID = 'sessioncard';\n var storedCardID = 'js_stored_card';\n\n switch (selectedOptionValue) {\n case newCardID:\n creditCardFlowID = newCardID;\n break;\n\n case sessionCardID:\n creditCardFlowID = sessionCardID;\n break;\n\n default:\n selectedOption = helper.getSelectedOption($creditCardList);\n\n if (selectedOption.classList.contains(storedCardID)) {\n creditCardFlowID = storedCardID;\n }\n break;\n }\n\n return creditCardFlowID;\n}\n\n/**\n * Returns object with nonce related to stored card\n * @param {Promise} clientInstancePromise Client instance promise\n * @param {Object} $creditCardList Selector with needed data\n * @returns {Object} Response object\n */\nfunction getNonceFromStoredCard(clientInstancePromise, $creditCardList) {\n var CreditCardVaultManagerModelInstance = new CreditCardVaultManagerModel(clientInstancePromise);\n var $selectedOption = helper.getSelectedOption($creditCardList);\n var cardType = $selectedOption.getAttribute('data-type').toLowerCase();\n var lastFour = $selectedOption.getAttribute('data-last-four').toString();\n\n return CreditCardVaultManagerModelInstance.getNonceByCardData(lastFour, cardType);\n}\n\n/**\n * Fills 3DS data\n * @param {Object} threeDSecureDataValidationPayload 3DS information about the card\n */\nfunction fill3DsData(threeDSecureDataValidationPayload) {\n var $braintreeIs3dSecureRequired = document.querySelector('#braintreeIs3dSecureRequired');\n\n if (threeDSecureDataValidationPayload && threeDSecureDataValidationPayload.liabilityShifted) {\n $braintreeIs3dSecureRequired.value = 'true';\n }\n}\n\n/**\n * Returns whether Credit Card tab is active on the Billing Page\n * @returns {boolean} true/false\n */\nfunction isActiveCreditCardTab() {\n return document\n .querySelector('.payment-options[role=tablist] a[data-toggle=\"tab\"][href=\"#creditcard-content\"]')\n .classList\n .contains('active');\n}\n\n/**\n * Get stored card by last four digits and card type\n * @param {string} lastFour Last four card digits\n * @param {string} cardType Card type\n * @returns {Object} Jquery object of found stored card\n */\nfunction getStoredCardByData(lastFour, cardType) {\n var $foundCard;\n\n $('.js_stored_card').each(function (_, $el) {\n var $card = $($el);\n var storedCardType = $card.data('type').toLowerCase();\n var storedCardLastFour = $card.data('last-four').toString();\n\n if (storedCardType === cardType && storedCardLastFour === lastFour) {\n $foundCard = $card;\n }\n });\n\n return $foundCard;\n}\n\n/**\n * Hide already stored card by last four digits and card type\n * @param {string} lastFour Last four card digits\n * @param {string} cardType Card type\n * @returns {boolean} true in case if stored card with provided params (lastFour, cardType) was found\n */\nfunction hideAlreadyStoredCard(lastFour, cardType) {\n var $storedCard = getStoredCardByData(lastFour, cardType);\n var flag = false;\n\n if ($storedCard) {\n $storedCard.hide();\n flag = true;\n }\n\n return flag;\n}\n\n/**\n * Shows already stored card by last four digits and card type\n * @param {string} lastFour Last four card digits\n * @param {string} cardType Card type\n * @returns {boolean} true in case if stored card with provided params (lastFour, cardType) was found\n */\nfunction showAlreadyStoredCard(lastFour, cardType) {\n var $storedCard = getStoredCardByData(lastFour, cardType);\n var flag = false;\n\n if ($storedCard) {\n $storedCard.show();\n flag = true;\n }\n\n return flag;\n}\n\nmodule.exports = {\n displayStoredCreditCardList,\n fillCreditCardFormWithPayloadData,\n fillSessionCreditCardFormWithPayloadData,\n setSessionCreditCardDataAttributes,\n markAsSelectedSessionAccount,\n getCreditCardFlowID,\n getNonceFromStoredCard,\n fill3DsData,\n isActiveCreditCardTab,\n hideAlreadyStoredCard,\n showAlreadyStoredCard\n};\n","'use strict';\n\nvar creditCardFormFieldHelper = require('../helpers/creditCardFormFieldsHelper');\n\n/**\n * Clears Credit Card fields of session account\n */\nfunction clearCreditCardFields() {\n var creditCardFieldsArray = creditCardFormFieldHelper.getCCFields().asArray;\n\n creditCardFieldsArray.forEach(function (el) {\n el.value = '';\n });\n}\n\n/**\n * Clears Credit Card nonce of session account\n */\nfunction clearCreditCardNonceField() {\n document.querySelector('#braintreeCreditCardNonce').value = '';\n}\n\nmodule.exports = {\n clearCreditCardFields,\n clearCreditCardNonceField\n};\n","'use strict';\n\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar braintreeGooglePaySDK = require('../braintreesdk/braintreeGooglePaySDK');\n\n/* global Promise braintree $ */\n\n// Global variables\n// Is Froud tools enabled\nvar isFtEnabled;\nvar btClientInstancePromise;\nvar googlePaymentInstance;\nvar paymentsClient;\n\nvar amount;\n\n/**\n * Init Baintree Credit Card model\n * @param {Promise} braintreeClientInstancePromise Braintreee client instance promise\n * @param {boolean} isFraudToolsEnabled Is fraud tools enabled value\n */\nfunction init(braintreeClientInstancePromise, isFraudToolsEnabled) {\n braintreeGooglePaySDK.init(braintreeClientInstancePromise);\n\n btClientInstancePromise = braintreeClientInstancePromise;\n isFtEnabled = isFraudToolsEnabled;\n}\n\n/**\n * Returns fraud data from dataCollector payload\n * @returns {Object} Payload with fraud data\n */\nfunction collectFraudData() {\n var response;\n\n if (isFtEnabled) {\n response = braintreeGeneral.collectFraudData(btClientInstancePromise);\n } else {\n response = Promise.resolve({\n customMessage: 'Fraud Data collection isn\\t enabled via Custom Site Preference'\n });\n }\n\n return response;\n}\n\n/**\n * Preparing googlePay payment\n * @param {string} googleMerchantId Google Pay merchant identifier\n * @returns {Promise} Promise with resolve 'true' if ready to pay\n */\nfunction initGooglePay(googleMerchantId) {\n return braintreeGooglePaySDK.createGooglePayment(googleMerchantId)\n .then(function (gpInstance) {\n var allowedPaymentMethods = gpInstance.createPaymentDataRequest().allowedPaymentMethods;\n googlePaymentInstance = gpInstance;\n\n return paymentsClient.isReadyToPay({\n // see https://developers.google.com/pay/api/web/reference/object#IsReadyToPayRequest\n apiVersion: 2,\n apiVersionMinor: 0,\n allowedPaymentMethods: allowedPaymentMethods\n });\n });\n}\n\n/**\n * Creates a configuration object for use in the loadPaymentData method.\n * @param {Object} options Object with payment options\n * @returns {Object} Configuration object\n */\nfunction createPaymentDataRequest(options) {\n return braintreeGooglePaySDK.createPaymentDataRequest(googlePaymentInstance, options, amount);\n}\n\n/**\n * Parse the response from the tokenization.\n * @param {Object} paymentData The response back from the Google Pay tokenization.\n * @returns {Promise} Promise that resolve with a tokenizePayload\n */\nfunction parseResponse(paymentData) {\n return braintreeGooglePaySDK.parseResponse(paymentData, googlePaymentInstance);\n}\n\n/**\n * Update order amount\n */\nfunction googlePayUpdateAmount() {\n var config = JSON.parse(document.querySelector('.js_braintree_googlepay_button').getAttribute('data-braintree-config'));\n\n $.ajax({\n url: config.getOrderInfoUrl,\n async: false,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n amount = data.amount;\n },\n error: function () {\n window.location.reload();\n }\n });\n}\n\n/**\n * Inits 'Google Pay' payment client object into braintreeGooglePayModel\n * @param {string} instanceType The type of the instance TEST/PRODUCTION\n */\nfunction initPaymentsClient(instanceType) {\n paymentsClient = new google.payments.api.PaymentsClient({ // eslint-disable-line no-undef\n environment: instanceType // TEST/PRODUCTION\n });\n}\n\n/**\n * Gets 'Google Pay' payment client object\n * @returns {Object}'Google Pay' payment client object\n */\nfunction getPaymentsClient() {\n return paymentsClient;\n}\n\nmodule.exports = {\n init,\n collectFraudData,\n initGooglePay,\n createPaymentDataRequest,\n parseResponse,\n googlePayUpdateAmount,\n // initialize a Google Pay 'PaymentsClient' object\n initPaymentsClient,\n getPaymentsClient\n};\n","'use strict';\n\nvar braintreeGooglePayModel = require('./braintreeGooglePayModel');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar googlePayHelper = require('../helpers/googlePayHelper');\n\nvar googlePayErrorMessages = require('../constants/errorMessages');\n\n/**\n * Initialize Braintree Google Pay Model. Pattern Builder is used\n * @returns {Object} Object with booleam \"error\" flag and \"message\" attribute with error message\n */\nfunction init() {\n var braintreeGooglePayConfigs = googlePayHelper.getBraintreeGooglePayConfigs();\n var clientToken;\n var btClientInstancePromise;\n var response = {\n error: false,\n message: '',\n btGooglePayModel: null,\n btGooglePayConfigs: null\n };\n\n if (braintreeGooglePayConfigs) {\n clientToken = braintreeGooglePayConfigs.clientToken;\n btClientInstancePromise = braintreeGeneral.createClientInstance(clientToken);\n\n braintreeGooglePayModel.init(\n btClientInstancePromise,\n braintreeGooglePayConfigs.isFraudToolsEnabled\n );\n\n response.btGooglePayModel = braintreeGooglePayModel;\n response.btGooglePayConfigs = braintreeGooglePayConfigs;\n } else {\n response.error = true;\n response.message = googlePayErrorMessages.NO_GOOGLE_PAY_BRAINTREE_CONFIGURATIONS;\n }\n\n return response;\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n/* global braintreeUtils braintree $ */\n\nvar googlePaySDKHelper = require('../helpers/googlePaySDKHelper');\n\nvar btClientInstancePromise;\n\n/**\n * Creates googlePayment instance\n * @param {string} googleMerchantId Google Pay merchant identifier\n * @returns {Promise} A promise resolve with with the GooglePaymnet instance\n */\nfunction createGooglePayment(googleMerchantId) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n var googlePayOptions = googlePaySDKHelper.createGooglePayOptions(\n btClientInstance,\n googleMerchantId\n );\n\n return braintree.googlePayment.create(googlePayOptions);\n });\n}\n\n/**\n * Creates a configuration object for use in the loadPaymentData method.\n * @param {googlePaymentInstance} googlePaymentInstance Google Pay instance\n * @param {Object} options Object with payment options\n * @param {number} amount Order total amount\n * @returns {Object} Configuration object\n */\nfunction createPaymentDataRequest(googlePaymentInstance, options, amount) {\n return googlePaymentInstance.createPaymentDataRequest({\n transactionInfo: {\n currencyCode: options.currency,\n totalPriceStatus: 'FINAL',\n totalPrice: String(amount)\n },\n shippingAddressRequired: options.isShippingAddressRequired,\n shippingAddressParameters: {\n allowedCountryCodes: ['US'],\n phoneNumberRequired: true\n },\n emailRequired: true\n });\n}\n\n/**\n * Parse the response from the tokenization.\n * @param {Object} paymentData The response back from the Google Pay tokenization.\n * @param {googlePaymentInstance} googlePaymentInstance Google Pay instance\n * @returns {Promise} Promise that resolve with a tokenizePayload\n */\nfunction parseResponse(paymentData, googlePaymentInstance) {\n return googlePaymentInstance.parseResponse(paymentData);\n}\n\n/**\n * Inits braintreeGooglePaySDK with client instance promise\n * @param {Promise} braintreeClientInstancePromise Braintree client instance promise\n */\nfunction init(braintreeClientInstancePromise) {\n btClientInstancePromise = braintreeClientInstancePromise;\n}\n\nmodule.exports = {\n createGooglePayment,\n createPaymentDataRequest,\n parseResponse,\n init\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar loaderInstance = require('../../loaderHelper');\nvar paymentMethodGeneral = require('../../paymentMethodGeneral');\n\n// Global variables\nvar googlePayConfigs;\nvar googlePayBillingAddressData;\nvar googlePayShippingAddressData;\nvar googlePayNonce;\nvar googlepayPaymentType;\nvar googlePayCardDescription;\nvar googlepayCheckoutFormData;\nvar errHandlerModel;\n\nvar $braintreeGooglePayLoader = document.querySelector('.braintreeGooglepayLoader');\n\nvar loader;\n\n/**\n * Expends Google Pay checkout form with required data\n */\nfunction expandGooglePayCheckoutFormData() {\n var deviceData = document.querySelector('input[name=braintreeGooglePayDeviceDataInput]').value;\n var csrfToken = document.querySelector('.braintree-cart-buttons-wrap #csrf_token');\n\n googlepayCheckoutFormData.append(csrfToken.name, csrfToken.value);\n googlepayCheckoutFormData.append('braintreeGooglePayNonce', googlePayNonce);\n googlepayCheckoutFormData.append('braintreeGooglePayDeviceData', deviceData);\n googlepayCheckoutFormData.append('braintreeGooglePayCardDescription', googlePayCardDescription);\n googlepayCheckoutFormData.append('braintreeGooglepayPaymentType', googlepayPaymentType);\n googlepayCheckoutFormData.append('braintreeGooglePayShippingAddress', JSON.stringify(googlePayShippingAddressData) || '{}');\n}\n\n/**\n * Process Google Pay on the Cart Page\n */\nfunction processCartFlow() {\n var $braintreeCartButtons = document.querySelector('.braintree-cart-buttons-wrap');\n var placeOrderUrl = $braintreeCartButtons.getAttribute('data-checkout-placeorder-url');\n var checkoutFromCartUrl = $braintreeCartButtons.getAttribute('data-checkout-from-cart-url');\n var checkoutFormFields = $braintreeCartButtons.getAttribute('data-checkout-form-fields');\n var paymentFieldsData = helper.getPaymentFieldsData(googlePayBillingAddressData, googlePayConfigs.paymentMethodName);\n\n // Creates and updates Google Pay checkout form for service side\n googlepayCheckoutFormData = helper.createPaymentFormData(checkoutFormFields, paymentFieldsData);\n expandGooglePayCheckoutFormData();\n // submit customer form with email (CheckoutServices-SubmitCustomer)\n // as we skip step \"login via guest/registered user\" while express checkout\n // email is set only in case of guest checkout and if email is not already set\n paymentMethodGeneral.submitCustomerForm(googlePayBillingAddressData.email);\n\n $.ajax({\n type: 'POST',\n url: checkoutFromCartUrl,\n data: googlepayCheckoutFormData,\n contentType: false,\n processData: false,\n success: function (res) {\n if (res.error) {\n var errorMessage = '';\n\n if (res.fieldErrors.length) {\n res.fieldErrors.forEach(function (error, index) {\n var keys = Object.keys(error);\n\n if (keys.length) {\n errorMessage += `${keys[index].replace('dwfrm_billing_', '').replace('_', ' ')} ${res.fieldErrors[index][keys[index]]}. `;\n }\n });\n\n errHandlerModel.showErrorByMessage(errorMessage);\n }\n\n if (res.serverErrors.length) {\n res.serverErrors.forEach(function (error) {\n errorMessage += `${error}. `;\n });\n errHandlerModel.showErrorByMessage(errorMessage);\n }\n\n if (res.cartError) {\n window.location.href = res.redirectUrl;\n }\n\n return;\n }\n\n sessionStorage.setItem('pageState', 'cart');\n loader.hide();\n window.location.href = placeOrderUrl;\n },\n error: function (err) {\n if (err && err.redirectUrl) {\n window.location.href = err.redirectUrl;\n }\n }\n });\n}\n\n/**\n * Inits Google Pay cart components\n * @param {Object} billingAddressData Billing address data object\n * @param {Object} shippingAddressData Shipping address data object\n * @param {string} nonce Payment method nonce\n * @param {string} paymentType Payment method type\n * @param {string} description Google Pay card description\n * @param {Constructor} errorHandlerModel Error handler Model\n */\nfunction init(billingAddressData, shippingAddressData, nonce, paymentType, description, errorHandlerModel) {\n var $googlepayButton = document.querySelector('.js_braintree_googlepay_button');\n\n googlePayConfigs = JSON.parse($googlepayButton.getAttribute('data-braintree-config'));\n googlePayBillingAddressData = billingAddressData;\n googlePayShippingAddressData = shippingAddressData;\n googlePayNonce = nonce;\n googlepayPaymentType = paymentType;\n googlePayCardDescription = description;\n loader = loaderInstance($braintreeGooglePayLoader);\n errHandlerModel = errorHandlerModel;\n\n processCartFlow();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar helper = require('../../helper');\n\n// Global variables\nvar googlePayBillingAddressData;\nvar googlePayNonce;\nvar googlepayPaymentType;\nvar googlePayCardDescription;\n\nvar $googlepayNonce = document.querySelector('#braintreeGooglePayNonce');\nvar $googlepayCardDescription = document.querySelector('#braintreeGooglePayCardDescription');\nvar $braintreeGooglepayPaymentType = document.querySelector('#braintreeGooglepayPaymentType');\nvar $googlePayBillingAddress = document.querySelector('#braintreeGooglePayBillingAddress');\n\n/**\n * Process Google Pay on the Checkout Page\n */\nfunction processCheckoutFlow() {\n $googlepayNonce.value = googlePayNonce;\n $googlepayCardDescription.value = googlePayCardDescription;\n $braintreeGooglepayPaymentType.value = googlepayPaymentType;\n\n // Updating Storefront Billing Form data with GooglePay Billing\n var storeFrontBillingData = helper.getUpdatedStoreFrontBillingData(googlePayBillingAddressData);\n\n $googlePayBillingAddress.value = JSON.stringify(googlePayBillingAddressData);\n\n helper.updateBillingFormValues(storeFrontBillingData);\n}\n\n/**\n * Inits Google Pay checkout components\n * @param {string} nonce Payment method nonce\n * @param {string} description Google Pay card description\n * @param {string} paymentType Payment method type\n * @param {Object} billingAddressData Billing address data object\n */\nfunction init(nonce, description, paymentType, billingAddressData) {\n googlePayBillingAddressData = billingAddressData;\n googlePayNonce = nonce;\n googlepayPaymentType = paymentType;\n googlePayCardDescription = description;\n\n processCheckoutFlow();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar googlePayHelper = require('../helpers/googlePayHelper');\n\n/**\n * Inits Google Pay list components\n */\nfunction init() {\n var $googlepayCardDescription = document.querySelector('#braintreeGooglePayCardDescription');\n var $btGooglepayAccountsList = document.querySelector('#braintreeGooglepayAccountsList');\n var googlePayAccountListExist = Boolean($btGooglepayAccountsList);\n\n if (googlePayAccountListExist) {\n $btGooglepayAccountsList.addEventListener('change', function () {\n googlePayHelper.googlePayContentTabHandler(true);\n });\n }\n\n if ($googlepayCardDescription.value === 'GooglePay') {\n $googlepayCardDescription.value = $btGooglepayAccountsList.selectedOptions[0].label;\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n// Helpers\nvar googlePayHelper = require('../helpers/googlePayHelper');\nvar loaderInstance = require('../../loaderHelper');\nvar googlePayPaymentProcessingHelper = require('../helpers/googlePayPaymentProcessingHelper');\nvar helper = require('../../helper');\n\n// Components\nvar googlePayCart = require('../components/googlePayCart');\nvar googlePayCheckout = require('../components/googlePayCheckout');\nvar googlePaySessionAccount = require('../components/googlePaySessionAccount');\n\nvar googlePayPaymentProcessingConstants = require('../constants/googlePayPaymentProcessingConstants');\n\n// Global varibales\nvar googlePayModel;\nvar paymentsClient;\nvar googlePayConfig;\nvar errHandlerModel;\n\nvar $googlepayButton = document.querySelector('.js_braintree_googlepay_button');\nvar $braintreeGooglePayLoader = document.querySelector('.braintreeGooglepayLoader');\nvar $continueButton = document.querySelector('button.submit-payment');\n\nvar loader;\n\n/**\n * Functionality over tokenized payment\n * @param {Objet} data data object\n * @param {Object} result data object\n */\nfunction onTokenizePayment(data, result) {\n // General functionality for Cart and Billing Page\n var googlepayNonce = result.nonce;\n var googlepayPaymentType = result.type;\n var gpCardDescription = result.details.cardType + ' ' + result.details.lastFour;\n var billingAddressData = googlePayPaymentProcessingHelper.createGooglepayBillingAddressData(data);\n var googlePayFlow = googlePayPaymentProcessingHelper.getGooglePayFlowId();\n\n helper.removeActiveSessionPayment();\n\n switch (googlePayFlow) {\n case googlePayPaymentProcessingConstants.FLOW__CART_NAME:\n var shippingAddressData = googlePayPaymentProcessingHelper.createGooglepayShippingAddressData(data.shippingAddress);\n\n googlePayCart.init(billingAddressData, shippingAddressData, googlepayNonce, googlepayPaymentType, gpCardDescription, errHandlerModel);\n break;\n case googlePayPaymentProcessingConstants.FLOW_CHECKOUT_NAME:\n googlePayCheckout.init(googlepayNonce, gpCardDescription, googlepayPaymentType, billingAddressData);\n googlePaySessionAccount.showGooglepayAccount(gpCardDescription);\n $continueButton.click();\n break;\n default:\n break;\n }\n}\n\n/**\n * Call back function to be resolved when on Google Pay payment button is clicked\n * @returns {void}\n */\nfunction onGooglePaymentButtonClicked() { // eslint-disable-line no-inner-declarations\n var options = googlePayConfig.options;\n var amount = options.amount;\n\n errHandlerModel.hideError();\n\n try {\n if (amount === 0) {\n errHandlerModel.showOrderTotalError();\n }\n\n loader.show();\n\n // Updates order amount for paymentDataRequest\n googlePayModel.googlePayUpdateAmount();\n\n // Create a configuration object for use in the loadPaymentData method.\n var paymentDataRequest = googlePayModel.createPaymentDataRequest(options);\n\n // Update card payment methods to require billing address\n var cardPaymentMethod = paymentDataRequest.allowedPaymentMethods[0];\n cardPaymentMethod.parameters.billingAddressRequired = true;\n cardPaymentMethod.parameters.billingAddressParameters = {\n format: 'FULL',\n phoneNumberRequired: true\n };\n\n return paymentsClient.loadPaymentData(paymentDataRequest)\n .then(function (paymentData) {\n googlePayModel.parseResponse(paymentData)\n .then(function (tokenizePayload) {\n onTokenizePayment(paymentData, tokenizePayload);\n });\n loader.hide();\n })\n .catch(function (error) {\n loader.hide();\n errHandlerModel.googlePayErrorHandler(error);\n });\n } catch (error) {\n errHandlerModel.googlePayErrorHandler(error);\n }\n}\n\n/**\n * Init and add Google Pay on the Cart or Billing Page\n */\nfunction initGooglePay() {\n var result = googlePayModel.collectFraudData()\n .then(function (fraudDataPayload) {\n googlePayHelper.setGooglePayDeviceData(fraudDataPayload);\n loader.hide();\n\n return googlePayModel.initGooglePay(googlePayConfig.googleMerchantId)\n .then(function (response) {\n if (response.result) {\n // Creates 'Google Pay Button' and append to the DOM\n const button = paymentsClient.createButton({ onClick: onGooglePaymentButtonClicked });\n $googlepayButton.appendChild(button);\n }\n });\n });\n\n result\n .catch(function (error) {\n loader.hide();\n errHandlerModel.googlePayErrorHandler(error);\n });\n}\n\n/**\n * Inits Google Pay payment processing components\n * @param {Obbject} braintreeGooglePayModel Google Pay model\n * @param {Constructor} errorHandlerModel Error handler model\n */\nfunction init(braintreeGooglePayModel, errorHandlerModel) {\n loader = loaderInstance($braintreeGooglePayLoader);\n googlePayModel = braintreeGooglePayModel;\n paymentsClient = braintreeGooglePayModel.getPaymentsClient();\n googlePayConfig = JSON.parse($googlepayButton.getAttribute('data-braintree-config'));\n errHandlerModel = errorHandlerModel;\n\n initGooglePay();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar $googlepayButton = document.querySelector('.js_braintree_googlepay_button');\nvar $googlepayContent = document.querySelector('.js_braintree_googlepayContent');\n\n// Helpers\nvar helper = require('../../helper');\nvar googlePayHelper = require('../helpers/googlePayHelper');\n\n/**\n * Shows session Google Pay account on the Billing Page\n * @param {string} cardDescription Session card description\n */\nfunction showGooglepayAccount(cardDescription) {\n var $newGPAccount = document.getElementById('newGPAccount');\n var $gpAccount = document.querySelector('.form-group.braintree_used_googlepay_account');\n var $sessionAccount = document.querySelector('#sessionGPAccount');\n\n $newGPAccount.removeAttribute('selected');\n\n // Sets new session account\n $sessionAccount.classList.remove('used-googlepay-account-hide');\n $sessionAccount.classList.add('used-googlepay-account');\n $sessionAccount.text = cardDescription;\n $sessionAccount.selected = true;\n $sessionAccount.setAttribute('data-session-account', 'true');\n\n $gpAccount.classList.remove('used-googlepay-account-hide');\n $gpAccount.classList.add('used-googlepay-account');\n\n $googlepayButton.style.display = 'none';\n $googlepayContent.setAttribute('data-paypal-is-hide-continue-button', false);\n helper.continueButtonToggle(false);\n}\n\n/*\n Remove method was used and change appearance of Google Pay tab\n**/\nfunction removeSessionNonce() {\n var $gpAccount = document.querySelector('.form-group.braintree_used_googlepay_account');\n $gpAccount.classList.remove('used-googlepay-account');\n $gpAccount.classList.add('used-googlepay-account-hide');\n\n var $sessionAccount = document.querySelector('#sessionGPAccount');\n $sessionAccount.classList.add('used-googlepay-account-hide');\n $sessionAccount.classList.remove('used-googlepay-account');\n $sessionAccount.value = '';\n $sessionAccount.text = '';\n $sessionAccount.setAttribute('data-session-account', false);\n $sessionAccount.setAttribute('data-save', false);\n\n document.querySelector('#braintreeGooglePayNonce').value = '';\n document.querySelector('#braintreeGooglePayBillingAddress').value = '';\n document.querySelector('#braintreeGooglepayPaymentType').value = '';\n document.querySelector('#braintreeGooglePayDeviceData').value = '';\n\n document.querySelector('#newGPAccount').selected = true;\n googlePayHelper.googlePayContentTabHandler(false);\n}\n\nmodule.exports = {\n showGooglepayAccount,\n removeSessionNonce\n};\n","'use strict';\n\nmodule.exports = {\n NO_GOOGLE_PAY_BRAINTREE_CONFIGURATIONS: 'No Google Pay Braintree Configurations',\n ORDER_TOTAL_0: 'Order total 0 is not allowed for GooglePay',\n GOOGLE_PAY_WINDOW_CLOSED: 'User closed the Payment Request UI.'\n};\n","'use strict';\n\nmodule.exports = {\n FLOW_CHECKOUT_NAME: 'checkout',\n FLOW__CART_NAME: 'cart',\n FLOW_NEW_GP_ACCOUNT_NAME: 'newGpAccount'\n};\n","'use strict';\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages Braintree credit card error messages\n */\nfunction ErrorHandlingBaseModel(errorMessages) {\n this.$errorContainer = $('.cart-error-messaging');\n this.errorMessages = errorMessages;\n}\n\n// General method which should be used for cases when error came from Braintree\nErrorHandlingBaseModel.prototype.showErrorByObject = function (error) {\n var msg = error.message;\n var code = error.code;\n var errorMessage = this.errorMessages[code] || msg || this.errorMessages.CLIENT_GATEWAY_NETWORK;\n\n this.createErrorNotification(errorMessage);\n};\n\n/**\n * Shows error by message\n * @param {string} message Error message\n */\nErrorHandlingBaseModel.prototype.showErrorByMessage = function (message) {\n this.createErrorNotification(message);\n};\n\n/**\n * ---- Error container which will be used on Cart page ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Method responsible for Error Notification generation\n * @param {string} message Message to display inside error notification\n */\nErrorHandlingBaseModel.prototype.createErrorNotification = function (message) {\n $('.checkout-btn').addClass('disabled');\n this.$errorContainer.append(\n `
\n \n ${message}\n
`\n );\n\n this.$errorContainer.show();\n window.scrollTo(0, 0);\n};\n\n/**\n * ---- Method which should hide error container and make it empty. On Cart we use this one ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Hide error notification\n */\nErrorHandlingBaseModel.prototype.hideError = function () {\n this.$errorContainer.hide();\n this.$errorContainer.empty();\n};\n\n/**\n * Shows order total equal 0 error\n */\nErrorHandlingBaseModel.prototype.showOrderTotalError = function () {\n var googlePayErrorMessages = require('../constants/errorMessages');\n var zeroAmountErrorMsg = googlePayErrorMessages.ORDER_TOTAL_0;\n\n this.showErrorByMessage(zeroAmountErrorMsg);\n\n throw zeroAmountErrorMsg;\n};\n\n/**\n * Handles Google Pay error by types\n * @param {Object} error Error object or error message\n */\nErrorHandlingBaseModel.prototype.googlePayErrorHandler = function (error) {\n var googlePayErrorMessages = require('../constants/errorMessages');\n\n if (error.name === 'BraintreeError') {\n this.showErrorByObject(error);\n } else if (error.statusCode === 'DEVELOPER_ERROR') {\n this.showErrorByMessage(error.statusMessage);\n } else if (error.message !== googlePayErrorMessages.GOOGLE_PAY_WINDOW_CLOSED) {\n this.showErrorByMessage(error.message);\n }\n};\n\nmodule.exports = ErrorHandlingBaseModel;\n","'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages Braintree credit card error messages\n */\nfunction ErrorHandlingCheckoutModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.$topErrorMessageText = document.querySelector('.error-message-text');\n this.$topErrorMessageWrapper = document.querySelector('.error-message');\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingCheckoutModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.createErrorNotification = function (message) {\n this.$topErrorMessageText.textContent = '';\n this.$topErrorMessageText.append(message);\n this.$topErrorMessageWrapper.style.display = 'block';\n\n window.scrollTo(0, 0);\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.hideError = function () {\n this.$topErrorMessageWrapper.style.display = 'none';\n this.$topErrorMessageText.innerHTML = '';\n};\n\nmodule.exports = ErrorHandlingCheckoutModel;\n","'use strict';\n\nvar braintreeGooglePayModelBuilder = require('./braintreesdk/braintreeGooglePayModelBuilder');\n\nvar googlePayHelper = require('./helpers/googlePayHelper');\n\n// Components\nvar googlePayList = require('./components/googlePayList');\nvar googlePayPaymentProcessing = require('./components/googlePayPaymentProcessing');\n\n// Models\nvar ErrorHandlingBaseModel = require('./errorhandler/errorHandlingBaseModel');\nvar ErrorHandlingCheckoutModel = require('./errorhandler/errorHandlingCheckoutModel');\n\nvar googlePayErrorMessages = require('./constants/errorMessages');\n\nvar braintreeGooglePayModelResponse;\nvar googlePayMessages;\n\n/**\n * Inits Google Pay on the Cart Page\n */\nfunction initCart() {\n var errorHandlerBaseModel = new ErrorHandlingBaseModel(googlePayMessages);\n\n if (!braintreeGooglePayModelResponse || braintreeGooglePayModelResponse.error) {\n var error = braintreeGooglePayModelResponse.error || googlePayErrorMessages.NO_GOOGLE_PAY_BRAINTREE_CONFIGURATIONS;\n errorHandlerBaseModel.googlePayErrorHandler(error);\n }\n\n // Initialize a Google Pay 'PaymentsClient' object\n braintreeGooglePayModelResponse.btGooglePayModel.initPaymentsClient(\n braintreeGooglePayModelResponse.btGooglePayConfigs.instanceType\n );\n\n googlePayPaymentProcessing.init(\n braintreeGooglePayModelResponse.btGooglePayModel,\n errorHandlerBaseModel\n );\n}\n\n/**\n * Inits Google Pay on the Checkout Page\n */\nfunction initCheckout() {\n var errorHandlerCheckoutModel = new ErrorHandlingCheckoutModel(googlePayMessages);\n\n if (!braintreeGooglePayModelResponse || braintreeGooglePayModelResponse.error) {\n var error = braintreeGooglePayModelResponse.error || googlePayErrorMessages.NO_GOOGLE_PAY_BRAINTREE_CONFIGURATIONS;\n errorHandlerCheckoutModel.googlePayErrorHandler(error);\n }\n\n // Triggers the Google Pay tab if Google Pay session account uses\n googlePayHelper.triggerGooglePayTab(braintreeGooglePayModelResponse.btGooglePayConfigs);\n\n // Initialize a Google Pay 'PaymentsClient' object\n braintreeGooglePayModelResponse.btGooglePayModel.initPaymentsClient(\n braintreeGooglePayModelResponse.btGooglePayConfigs.instanceType\n );\n\n googlePayPaymentProcessing.init(\n braintreeGooglePayModelResponse.btGooglePayModel,\n errorHandlerCheckoutModel\n );\n\n googlePayList.init();\n}\n\n/**\n * Inits Google Pay components\n */\nfunction init() {\n braintreeGooglePayModelResponse = braintreeGooglePayModelBuilder.init();\n\n if (!braintreeGooglePayModelResponse.error) {\n googlePayMessages = braintreeGooglePayModelResponse.btGooglePayConfigs.messages;\n }\n}\n\nmodule.exports = {\n init,\n initCart,\n initCheckout\n};\n","'use strict';\n\n/**\n * Returns Braintree Google Pay configs\n * @returns {Object} Braintree Google Pay configs\n */\nfunction getBraintreeGooglePayConfigs() {\n var braintreeGooglePayButtonConfigs = null;\n\n try {\n braintreeGooglePayButtonConfigs = JSON.parse(document.querySelector('.js_braintree_googlepay_button').getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeGooglePayButtonConfigs;\n }\n\n return braintreeGooglePayButtonConfigs;\n}\n\n/**\n * Sets device data from 'data collector' to corresponding input field\n * @param {Object} fraudDataPayload Froud payload data\n */\nfunction setGooglePayDeviceData(fraudDataPayload) {\n var $braintreeGooglePayDeviceData = document.querySelector('#braintreeGooglePayDeviceData');\n\n if (fraudDataPayload.deviceData) {\n $braintreeGooglePayDeviceData.value = fraudDataPayload.deviceData;\n }\n}\n\n/**\n * Handles all behavior related to the Google Pay content tab\n * @param {boolean} isActiveGooglePayTab Whether Google Pay tab is active\n */\nfunction googlePayContentTabHandler(isActiveGooglePayTab) {\n var helper = require('../../helper');\n var $btGooglepayAccountsList = document.querySelector('#braintreeGooglepayAccountsList');\n var $googlepayButton = document.querySelector('.js_braintree_googlepay_button');\n var $googlepayContent = document.querySelector('.js_braintree_googlepayContent');\n\n if ($btGooglepayAccountsList.value === 'newaccount') {\n $googlepayButton.style.display = 'block';\n\n if (isActiveGooglePayTab) {\n helper.continueButtonToggle(true);\n }\n\n $googlepayContent.setAttribute('data-paypal-is-hide-continue-button', true);\n } else {\n $googlepayButton.style.display = 'none';\n helper.continueButtonToggle(false);\n $googlepayContent.setAttribute('data-paypal-is-hide-continue-button', false);\n }\n}\n\n/**\n * Triggers the Google Pay tab if Google Pay session account uses\n * @param {Object} googlePayConfigs Google Pay config object\n */\nfunction triggerGooglePayTab(googlePayConfigs) {\n var sessionPaymentMethodId = googlePayConfigs.sessionPaymentMethodId;\n var $googlePayTab = $('.googlepay-tab');\n\n if (sessionPaymentMethodId === 'GooglePay') {\n $googlePayTab.click();\n }\n}\n\nmodule.exports = {\n getBraintreeGooglePayConfigs,\n setGooglePayDeviceData,\n googlePayContentTabHandler,\n triggerGooglePayTab\n};\n","'use strict';\n\nvar googlePayPaymentProcessingConstants = require('../constants/googlePayPaymentProcessingConstants');\n\n/**\n * Returns current Google Pay flow\n * @returns {string} Flow id checkout/cart/newGpAccount\n */\nfunction getGooglePayFlowId() {\n var googlePayEnabledOnCart = Boolean(document.querySelector('.braintree-cart-google-button'));\n var googlePayEnabledOnCheckout = Boolean(document.querySelector('.js_braintree_googlepayContent'));\n var googlePayFlowId = null;\n\n var flows = {\n checkout: googlePayPaymentProcessingConstants.FLOW_CHECKOUT_NAME,\n cart: googlePayPaymentProcessingConstants.FLOW__CART_NAME,\n newGpAccount: googlePayPaymentProcessingConstants.FLOW_NEW_GP_ACCOUNT_NAME\n };\n\n if (googlePayEnabledOnCart) {\n googlePayFlowId = flows.cart;\n } else if (googlePayEnabledOnCheckout) {\n googlePayFlowId = flows.checkout;\n } else {\n googlePayFlowId = flows.newGpAccount;\n }\n\n return googlePayFlowId;\n}\n\n/**\n * Creates Google Pay billing address from payload data\n * @param {Object} data Data object\n * @returns {Objcet} billing address data object\n */\nfunction createGooglepayBillingAddressData(data) {\n var billingData = data.paymentMethodData.info.billingAddress;\n var billingAddress = {};\n var recipientName = billingData.name.split(' ');\n\n billingAddress.firstName = recipientName[0];\n billingAddress.lastName = recipientName[1];\n billingAddress.phone = billingData.phoneNumber;\n billingAddress.countryCodeAlpha2 = billingData.countryCode;\n billingAddress.streetAddress = billingData.address1;\n billingAddress.extendedAddress = billingData.address2;\n billingAddress.locality = billingData.locality;\n billingAddress.stateCode = billingData.administrativeArea;\n billingAddress.postalCode = billingData.postalCode;\n billingAddress.email = data.email;\n\n return billingAddress;\n}\n\n/**\n * Creates shipping address object\n * @param {Object} shippingData Shipping data object\n * @returns {Object} Shipping data object in required format\n */\nfunction createGooglepayShippingAddressData(shippingData) {\n var shippingAddress = {};\n var recipientName = shippingData.name.split(' ');\n\n shippingAddress.firstName = recipientName[0];\n shippingAddress.lastName = recipientName[1];\n shippingAddress.phone = shippingData.phoneNumber;\n shippingAddress.countryCodeAlpha2 = shippingData.countryCode;\n shippingAddress.streetAddress = shippingData.address1;\n shippingAddress.extendedAddress = shippingData.address2;\n shippingAddress.locality = shippingData.locality;\n shippingAddress.region = shippingData.administrativeArea;\n shippingAddress.postalCode = shippingData.postalCode;\n\n return shippingAddress;\n}\n\nmodule.exports = {\n getGooglePayFlowId,\n createGooglepayBillingAddressData,\n createGooglepayShippingAddressData\n};\n","'use strict';\n\n/**\n * Creates an object of configuration for creating a Google Pay payment\n * @param {Client} btClientInstance A client instance\n * @param {string} googleMerchantId Google Pay merchant identifier\n * @returns {Object} Configuration object\n */\nfunction createGooglePayOptions(btClientInstance, googleMerchantId) {\n var gpOptions = {\n client: btClientInstance,\n googlePayVersion: 2\n };\n\n if (googleMerchantId !== '' && googleMerchantId !== null) {\n gpOptions.googleMerchantId = googleMerchantId;\n }\n\n return gpOptions;\n}\n\nmodule.exports = {\n createGooglePayOptions\n};\n","'use strict';\nvar $continueButton = document.querySelector('button.submit-payment');\n\n/**\n * Init the event in order to update the cart grant total price\n */\nfunction initCartUpdateEvent() {\n var $grantTotal = document.querySelector('.grand-total');\n\n if ($grantTotal) {\n var currentGrantTotalValue = $grantTotal.textContent;\n\n $('body').on('cart:update', function () {\n var newGrantTotalValue = $grantTotal.textContent;\n\n if (newGrantTotalValue !== '' && newGrantTotalValue !== currentGrantTotalValue) {\n currentGrantTotalValue = newGrantTotalValue;\n var updateCartTotals = document.createEvent('Event');\n updateCartTotals.initEvent('updateCartTotals', true, true);\n\n document.querySelector('body').addEventListener('updateCartTotals', function () {\n 'braintree:updateCartTotals';\n }, false);\n document.querySelector('body').dispatchEvent(updateCartTotals);\n }\n });\n }\n}\n\n/**\n * Depends on the value flag, sets style.display to the $continueButton\n * @param {boolean} flag Boolean value\n * @returns {void}\n */\nfunction continueButtonToggle(flag) {\n var stage = window.location.hash.substring(1);\n\n if (stage === 'placeOrder' || stage === 'shipping' || stage === null || stage === '') {\n return;\n }\n\n $continueButton.style.display = flag ? 'none' : '';\n}\n\n/**\n * Handles payment method tab changing\n * @param {Object} currentTab Choosen payment method tab\n */\nfunction paymentMethodChangeHandle(currentTab) {\n document.querySelectorAll('.payment-options[role=tablist] a[data-toggle=\"tab\"]').forEach(function (el) {\n var $tabContent = document.querySelector(el.getAttribute('href'));\n\n if (el === currentTab) {\n $tabContent.querySelectorAll('input, textarea, select').forEach(function (tab) {\n tab.removeAttribute('disabled', 'disabled');\n });\n $tabContent.querySelectorAll('select.no-disable').forEach(function (tab) {\n tab.setAttribute('disabled', 'disabled');\n });\n continueButtonToggle(JSON.parse($tabContent.getAttribute('data-paypal-is-hide-continue-button')));\n } else {\n $tabContent.querySelectorAll('input, textarea, select').forEach(function (tab) {\n tab.setAttribute('disabled', 'disabled');\n });\n }\n });\n}\n\n/**\n * Return payment method name in lovercase\n * @param {string} paymentMethodName Payment method name\n * @returns {string} Paymnet method name\n */\nfunction getPaymentMethodToLowerCase(paymentMethodName) {\n var paymentMethod = paymentMethodName.split('_');\n if (paymentMethod.length === 1) {\n return paymentMethodName;\n }\n paymentMethod.forEach(function (element, index) {\n paymentMethod[index] = element.charAt(0) + element.slice(1).toLocaleLowerCase();\n });\n return paymentMethod[1] ?\n paymentMethod[0] + ' ' + paymentMethod[1] :\n paymentMethod[0];\n}\n\n/**\n * Updates checkout view\n * @param {Object} e Event object\n * @param {Object} data Data object\n */\nfunction updateCheckoutView(e, data) {\n var $paymentSummary = document.querySelector('.summary-details .braintree-payment-details');\n var htmlToAppend = '';\n var order = data.order;\n var payment = order.billing.payment;\n\n if (payment && payment.selectedPaymentInstruments\n && payment.selectedPaymentInstruments.length > 0) {\n var selectedPaymentInstrument = payment.selectedPaymentInstruments[0];\n var paymnetMethodId = selectedPaymentInstrument.paymentMethod;\n\n if (paymnetMethodId === 'CREDIT_CARD') {\n htmlToAppend += '
' + selectedPaymentInstrument.type + '
';\n } else {\n htmlToAppend += '
' + getPaymentMethodToLowerCase(paymnetMethodId) + '
';\n }\n\n if (selectedPaymentInstrument.maskedCreditCardNumber) {\n htmlToAppend += '
' + selectedPaymentInstrument.maskedCreditCardNumber + '
';\n var text = $('.js-expiration-text').val();\n htmlToAppend += '
' + text + \" \" + selectedPaymentInstrument.expirationMonth+'/'+selectedPaymentInstrument.expirationYear + '
';\n }\n if (paymnetMethodId === 'PayPal') {\n htmlToAppend += '
' + selectedPaymentInstrument.braintreePaypalEmail + '
';\n }\n if (paymnetMethodId === 'Venmo') {\n htmlToAppend += '
' + selectedPaymentInstrument.braintreeVenmoUserId + '
';\n }\n if (selectedPaymentInstrument.type && selectedPaymentInstrument.paymentMethod !== 'CREDIT_CARD') {\n htmlToAppend += '
' + selectedPaymentInstrument.type + '
';\n }\n htmlToAppend += '
' + order.priceTotal.charAt(0) + selectedPaymentInstrument.amount + '
';\n }\n\n if ($paymentSummary) {\n $paymentSummary.innerHTML = htmlToAppend;\n }\n}\n\n/**\n * Validates whether input field is valid\n * @param {Object} field Input filed\n * @returns {boolean} true/false\n */\nfunction isValidInputField(field) {\n if (!field.checkValidity()) {\n if (!field.classList.contains('is-invalid')) {\n field.classList.add('is-invalid');\n }\n return false;\n }\n if (field.checkValidity() && field.classList.contains('is-invalid')) {\n field.classList.remove('is-invalid');\n }\n return true;\n}\n/*\n Adding *active* line to the tab-content class in a case if it isn't already active\n Use case: customer checkout from Cart (page) and\n (under the place Order page) hit the 'edit' button\n**/\nfunction updatePaymentMethodTab() {\n let paymentMethodName = document.querySelectorAll('[data-braintree-payment-method]')[0].dataset.braintreePaymentMethod;\n let content = document.querySelector(`.js_braintree_${paymentMethodName.toLowerCase()}Content`).classList.contains('active');\n if (!content) {\n document.querySelectorAll(`[data-method-id=${paymentMethodName}]`)[0].children[0].click();\n }\n}\n\n/**\n * Gets Billing Address Form Values\n *\n * @returns {Object} with Billing Address\n */\nfunction getBillingAddressFormValues() {\n return $('#dwfrm_billing').serialize().split('&')\n .map(function (el) {\n return el.split('=');\n })\n .reduce(function (accumulator, item) {\n var elem = item[0].lastIndexOf('_');\n if (elem < 0) {\n accumulator[item[0]] = item[1];\n } else {\n elem = item[0].substring(elem + 1);\n accumulator[elem] = item[1];\n }\n return accumulator;\n }, {});\n\n delete billingData.stateCode;\n\n var address1 = billingData.address1;\n if (address1.length > 50) {\n if (!billingData.address2) {\n billingData.address1 = address1.substr(0, 50);\n billingData.address2 = address1.substr(50, 50);\n } else {\n var allAddress = billingData.address1 + billingData.address2;\n billingData.address1 = allAddress.substr(0, 50);\n billingData.address2 = allAddress.substr(50, 50);\n }\n }\n\n return billingData;\n}\n\n/**\n * Gets Nonce depending on payment method name\n *\n * @param {string} paymentMethodName - payment method name\n * @returns {boolean} nonce exist\n */\n\nfunction isNonceExist(paymentMethodName) {\n // Payment method name\n var pmName = paymentMethodName;\n\n // Сhange 'CREDIT_CARD' to 'CreditCard' in order to get braintreewCreditCardNonce input\n if (paymentMethodName === 'CREDIT_CARD') {\n pmName = 'CreditCard';\n }\n\n var $nonce = document.querySelector(`#braintree${pmName}Nonce`);\n\n if (!$nonce) return false;\n\n var nonceValue = $nonce.value;\n var $tab = document.querySelector(`.${pmName.toLowerCase()}-tab`);\n var isActiveTab;\n if ($tab) {\n isActiveTab = $tab.classList.contains('active');\n }\n\n return !isActiveTab && nonceValue;\n}\n\nvar loaderInstance = require('./loaderHelper');\nvar accountsLoader;\n\nfunction removeBtPayment(e) {\n let target = e.target;\n var $loaderContainter = document.querySelector('#' + target.getAttribute('data-loader'));\n accountsLoader = loaderInstance($loaderContainter);\n accountsLoader.show();\n\n $.get(target.getAttribute('data-url') + '?UUID=' + target.getAttribute('data-id'))\n .then((data => {\n $('#uuid-' + data.UUID).remove();\n if (data.newDefaultAccount) {\n document.querySelector('#uuid-' + data.newDefaultAccount + ' span').style.fontWeight = 'bold';\n document.querySelector('#uuid-' + data.newDefaultAccount + ' button.braintree-make-default-card').style.display = 'none';\n }\n $('body').trigger('cart:update');\n accountsLoader.hide();\n }))\n .fail(() => {\n location.reload();\n accountsLoader.hide();\n });\n}\n\n/**\n * Create formData from fields data\n *\n * @param {Object} paymentFields fields data values\n * @param {Object} fieldsData fields data values\n * @returns {Object} cart billing form data\n */\nfunction createPaymentFormData(paymentFields, fieldsData) {\n var paymentFieldsParsed;\n\n if (typeof paymentFields === 'object') {\n paymentFieldsParsed = paymentFields;\n } else {\n paymentFieldsParsed = JSON.parse(paymentFields);\n }\n\n return Object.entries(paymentFieldsParsed).reduce(function (formData, entry) {\n const [key, field] = entry;\n if (typeof field === 'object') {\n formData.append(field.name, fieldsData && fieldsData[key] !== null ? fieldsData[key] : field.value);\n }\n return formData;\n }, new FormData());\n}\n\nfunction setDefaultProperty(params) {\n return $.get(params.url + '?UUID=' + params.id + '&pmID=' + params.paymentMethodID)\n .then((data) => {\n document.querySelector('#uuid-' + data.newDefaultProperty + ' span').style.fontWeight = 'bold';\n document.querySelector('.braintree-make-default-card.uuid-' + data.newDefaultProperty).style.display = 'none';\n document.querySelector('#uuid-' + data.toRemoveDefaultProperty + ' span').style.fontWeight = 'normal';\n document.querySelector('.braintree-make-default-card.uuid-' + data.toRemoveDefaultProperty).style.display = 'inline';\n params.loader.hide();\n })\n .fail(() => {\n params.loader.hide();\n });\n}\n\n/**\n * Checks authenticated customer, account list for default Payment Method\n *\n * @param {string} selector - querySelector\n * @returns {Object} default data attribute or null\n */\nfunction getOptionByDataDefault(selector) {\n if (!document.querySelector(selector)) { return null; }\n\n return Array.apply(null, document.querySelector(selector).options).find(function (el) {\n return el.getAttribute('data-default') ? JSON.parse(el.getAttribute('data-default')) : null;\n });\n}\n\n/**\n * Checks authenticated customer, account list for session Account\n *\n * @param {Object} params querySelector + el.id\n * @returns {Object} session account object\n */\nfunction getSessionAccountOption(params) {\n return Array.apply(null, document.querySelector(params.querySelector).options).find(function (el) {\n return el.id === params.id && JSON.parse(el.getAttribute('data-session-account'));\n });\n}\n\n/**\n * This method is called to remove active session account but just in case\n * if tab of currently active session payment isn't active (buyer submited another payment method)\n * @returns {function}function call\n */\nfunction removeActiveSessionPayment() {\n const activePaymentMethods = [];\n document.querySelectorAll('.payment-options[role=tablist] li').forEach(function (el) {\n activePaymentMethods.push(el.dataset.methodId);\n });\n var helpers = {\n PayPal: require('./paypal/components/payPalSessionAccount'),\n Venmo: require('./venmo/components/venmoSessionAccount'),\n GooglePay: require('./googlepay/components/googlePaySessionAccount'),\n CREDIT_CARD: require('./creditcard/components/creditCardSessionAccount'),\n SRC: require('./src/components/srcSessionAccount'),\n ApplePay: require('./applepay/helpers/applePayHelper')\n };\n var activePM = activePaymentMethods.find(function (el) {\n return isNonceExist(el);\n });\n if (activePM) {\n return helpers[activePM].removeSessionNonce();\n }\n}\n\nfunction showCartErrorMsg(message) {\n $('.checkout-btn').addClass('disabled');\n $('.cart-error').append(\n `
\n \n ${message}\n
`\n );\n window.scrollTo(0, 0);\n}\n\n/**\n * Update Checkout Billing form values\n *\n * @param {Object} billingData fields data values\n */\nfunction updateBillingFormValues(billingData) {\n var $billingFormFields = document.querySelectorAll('.billing-address select, .billing-address input, .contact-info-block input');\n\n $billingFormFields.forEach(function (el) {\n if (billingData[el.name]) {\n el.value = billingData[el.name];\n }\n });\n}\n\n/**\n * Returns selected option from select container\n * @param {Object} $selectContainer Select container\n * @returns {Object} Selected option\n */\nfunction getSelectedOption($selectContainer) {\n var selectedOptionIndex = $selectContainer.selectedIndex;\n var selectedOption = $selectContainer.options[selectedOptionIndex];\n\n return selectedOption;\n}\n\n/**\n * Returns payment field data to be send on backend\n * @param {Object} addressData Address data to be set\n * @param {string} paymentMethodName Payment method name\n * @returns {Object} payment data\n */\nfunction getPaymentFieldsData(addressData, paymentMethodName) {\n return {\n firstName: addressData.firstName,\n lastName: addressData.lastName,\n address1: addressData.streetAddress,\n address2: addressData.extendedAddress || '',\n city: addressData.locality,\n postalCode: addressData.postalCode,\n stateCode: addressData.stateCode || addressData.region,\n country: addressData.countryCodeAlpha2,\n phone: addressData.phone,\n paymentMethod: paymentMethodName\n };\n}\n\nfunction getUpdatedStoreFrontBillingData(billingAddress) {\n var storeFrontBillingData = JSON.parse(document.querySelector('.braintree-billing-payment-wrap').getAttribute('data-billing-form-fields-names'));\n\n storeFrontBillingData.dwfrm_billing_addressFields_firstName = billingAddress.firstName;\n storeFrontBillingData.dwfrm_billing_addressFields_lastName = billingAddress.lastName;\n storeFrontBillingData.dwfrm_billing_addressFields_address1 = billingAddress.streetAddress;\n storeFrontBillingData.dwfrm_billing_addressFields_address2 = billingAddress.extendedAddress || '';\n storeFrontBillingData.dwfrm_billing_addressFields_city = billingAddress.locality;\n storeFrontBillingData.dwfrm_billing_addressFields_postalCode = billingAddress.postalCode;\n storeFrontBillingData.dwfrm_billing_addressFields_states_stateCode = billingAddress.stateCode || billingAddress.region;\n storeFrontBillingData.dwfrm_billing_addressFields_country = billingAddress.countryCodeAlpha2;\n storeFrontBillingData.dwfrm_billing_contactInfoFields_phone = billingAddress.phone;\n\n return storeFrontBillingData;\n}\n\nmodule.exports = {\n initCartUpdateEvent,\n paymentMethodChangeHandle,\n continueButtonToggle,\n updateCheckoutView,\n isValidInputField,\n updatePaymentMethodTab,\n getBillingAddressFormValues,\n removeBtPayment,\n createPaymentFormData,\n isNonceExist,\n setDefaultProperty,\n getOptionByDataDefault,\n removeActiveSessionPayment,\n getSessionAccountOption,\n showCartErrorMsg,\n updateBillingFormValues,\n getSelectedOption,\n getPaymentFieldsData,\n getUpdatedStoreFrontBillingData\n};\n","\nmodule.exports = function (containerElement) {\n if (!containerElement) {\n // eslint-disable-next-line no-console\n console.error('Braintree: No container for showing loaders');\n }\n function Constructor() {\n this.containerEl = containerElement;\n }\n Constructor.prototype.show = function () {\n this.containerEl.style.display = 'block';\n };\n Constructor.prototype.hide = function () {\n this.containerEl.style.display = 'none';\n };\n return new Constructor();\n};\n","'use string';\n\nvar lpmHelper = require('../helpers/lpmHelper');\n\nvar braintreeLpmSDK = require('./braintreeLpmSDK');\n\n// Global variables\nvar lpmConfigs = lpmHelper.getBraintreeLpmConfigs();\nvar lpmInstance;\nvar shippingAddress;\nvar amount;\n\n/**\n * Init Braintree LPM pay model\n * @param {Promise} braintreeClientInstancePromise Braintreee client instance promise\n */\n\nfunction init(braintreeClientInstancePromise) {\n braintreeLpmSDK.init(braintreeClientInstancePromise);\n}\n\n/**\n * Inits LPM instance for the next payment actions\n * @returns {Promise} Promise resolved with the 'createLpmClickListener' boolean value\n */\nfunction initLpm() {\n return braintreeLpmSDK.createLpmPayment()\n .then(function (localPaymentInstance) {\n lpmInstance = localPaymentInstance;\n\n return {\n createLpmClickListener: true\n };\n });\n}\n\n/**\n * Updates order data\n * @param {Object} updatedShippingAddress Updates order shipping address from backend\n * @param {number} updatedAmount Updated order amount from backend\n */\nfunction updateLpmOrderData(updatedShippingAddress, updatedAmount) {\n shippingAddress = updatedShippingAddress;\n amount = updatedAmount;\n}\n\n/**\n * Returns order shipping address\n * @returns {Object} Shipping address\n */\nfunction getShippingAddress() {\n return shippingAddress;\n}\n\n/**\n * Creates and returns object with all options for initiating the lpm payment flow\n * @param {string} paymentMethodName Payment method name\n * @param {string} email Email address\n * @returns {Object} {Object} Options object\n */\nfunction createRequestData(paymentMethodName, email) {\n return Object.assign(braintreeLpmSDK.createRequestData(\n shippingAddress,\n lpmConfigs,\n paymentMethodName,\n email,\n amount\n ),\n {\n onPaymentStart: function (_, continueCallback) {\n continueCallback();\n }\n });\n}\n\n/**\n * Launches the local payment flow and returns a nonce payload\n * @param {Object} reqData Options object\n * @returns {Promise} Promise resolved with a startPaymentPayload\n */\nfunction startPayment(reqData) {\n return braintreeLpmSDK.startPayment(lpmInstance, reqData);\n}\n\nmodule.exports = {\n init,\n initLpm,\n updateLpmOrderData,\n getShippingAddress,\n createRequestData,\n startPayment\n};\n","'use strict';\n\nvar lpmHelper = require('../helpers/lpmHelper');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar braintreeLpmModel = require('./braintreeLpmModel');\n\nvar lpmErrorMessages = require('../constants/errorMessages');\n\n/**\n * Initialize Braintree Lpm Model. Pattern Builder is used\n * @returns {Object} Object with booleam \"error\" flag and \"message\" attribute with error message\n */\nfunction init() {\n var braintreeLpmConfigs = lpmHelper.getBraintreeLpmConfigs();\n var clientToken;\n var btClientInstancePromise;\n var response = {\n error: false,\n message: '',\n btLpmModel: null\n };\n\n if (braintreeLpmConfigs) {\n clientToken = braintreeLpmConfigs.clientToken;\n btClientInstancePromise = braintreeGeneral.createClientInstance(clientToken);\n\n braintreeLpmModel.init(\n btClientInstancePromise\n );\n\n response.btLpmModel = braintreeLpmModel;\n } else {\n response.error = true;\n response.message = lpmErrorMessages.NO_LPM_BRAINTREE_CONFIGURATIONS;\n }\n\n return response;\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n/* global braintreeUtils braintree $ */\n\nvar btClientInstancePromise;\n\n/**\n * Creates Lpm payment instance\n * @returns {Promise} A promise resolved with the Lpm instance\n */\n\nfunction createLpmPayment() {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.localPayment.create({\n client: btClientInstance\n });\n });\n}\n\n/**\n * Creates and returns object with all options for initiating the LPM payment flow\n * @param {Object} shippingData Order Shipping address\n * @param {Object} lpmConfigs LPM configs object\n * @param {string} paymentMethodName Payment method name\n * @param {string} email Email address\n * @param {number} amount Order total amount\n * @returns {Object} Options object\n */\nfunction createRequestData(shippingData, lpmConfigs, paymentMethodName, email, amount) {\n var recipientName = shippingData.recipientName.split(' ');\n shippingData.firstName = recipientName[0];\n shippingData.lastName = recipientName[1];\n\n return {\n paymentType: paymentMethodName,\n amount: amount,\n fallback: {\n url: lpmConfigs.fallbackUrl + '?lpmName=' + paymentMethodName + '&email=' + email,\n buttonText: 'Complete Payment'\n },\n currencyCode: lpmConfigs.options.currency,\n shippingAddressRequired: false,\n email: email,\n phone: shippingData && shippingData.phone,\n givenName: shippingData && shippingData.firstName,\n surname: shippingData && shippingData.lastName,\n address: {\n countryCode: shippingData && shippingData.countryCode\n }\n };\n}\n\n/**\n *\n * @param {lpmInstance} localPaymentInstance LPM instance\n * @param {Object} reqData Options object\n * @returns {Promise} Promise resolved with a startPaymentPayload\n */\nfunction startPayment(localPaymentInstance, reqData) {\n return localPaymentInstance.startPayment(reqData);\n}\n\n/**\n * Inits braintreeLpmSDK with client instance promise\n * @param {Promise} braintreeClientInstancePromise Braintree client instance promise\n */\nfunction init(braintreeClientInstancePromise) {\n btClientInstancePromise = braintreeClientInstancePromise;\n}\n\nmodule.exports = {\n init,\n createLpmPayment,\n createRequestData,\n startPayment\n};\n","'use string';\n\n// Helpers\nvar lpmHelper = require('../helpers/lpmHelper');\nvar loaderInstance = require('../../loaderHelper');\nvar lpmPaymentProcessingHelper = require('../helpers/lpmPaymentProcessorHelper');\n\nvar lpmErrorHandler = require('../errorhandler/lpmErrorHandler');\n\nvar $braintreeLpmLoader = document.querySelector('.lpmLoader');\n\n// Global variables\nvar lpmConfigs;\nvar loader;\nvar lpmModel;\n\n/**\n * Opens LPM page and process a payment\n * @param {Object} reqData Options object\n * @param {string} paymentMethodName Payment method name\n */\nfunction startLpmPayment(reqData, paymentMethodName) {\n lpmModel.startPayment(reqData)\n .then(function (startPaymentPayload) {\n // Handles LPM processing messages on the Billing-Checkout Page\n lpmPaymentProcessingHelper.hideProcessingMsg();\n lpmPaymentProcessingHelper.showFinalProcessingMsg();\n\n // Sends payment details to the backend\n return lpmPaymentProcessingHelper.confirmPayment(\n lpmConfigs,\n paymentMethodName,\n reqData.email,\n startPaymentPayload\n );\n })\n .then(function (response) {\n loader.hide();\n lpmPaymentProcessingHelper.processLpmConfirmForm(response.redirectUrl);\n })\n .catch(function (err) {\n loader.hide();\n lpmErrorHandler.processStartLpmPaymentError(err);\n });\n}\n\n/**\n * Prepares and checks all necessary options for start LPM payment\n * @param {Object} event On LPM button click event\n */\nfunction onLpmButtonClick(event) {\n var $email = document.querySelector('.customer-summary-email');\n var paymentMethodName = this.dataset.localPaymentMethodName;\n var reqData;\n\n lpmErrorHandler.hideError();\n\n event.preventDefault();\n\n try {\n if (lpmConfigs.options.amount === 0) {\n loader.hide();\n lpmErrorHandler.handleZeroAmountOnCheckout(paymentMethodName);\n }\n\n $.getJSON(lpmConfigs.getOrderInfoUrl)\n .then(function (data) {\n loader.show();\n lpmPaymentProcessingHelper.showProcessingMsg();\n\n // Updates shipping address and amount of order from server\n lpmModel.updateLpmOrderData(data.shippingAddress, data.amount);\n\n // Creates all options for initiating the local payment payment flow.\n reqData = lpmModel.createRequestData(paymentMethodName, $email.textContent);\n\n startLpmPayment(reqData, paymentMethodName);\n })\n // Handles errors form Braintree-GetOrderInfo endpoint\n .catch(function (err) {\n loader.hide();\n lpmErrorHandler.showErrorByMessage(err.responseJSON.message);\n });\n loader.hide();\n } catch (err) {\n lpmErrorHandler.showErrorByMessage(err);\n }\n}\n\n/**\n * Inits LPM functionality on the Checkout-Billing Page\n */\nfunction initLpm() {\n lpmModel.initLpm()\n .then(function (response) {\n if (response.createLpmClickListener) {\n $('.tab-content').on('click', '.js_braintree_lpm_button', onLpmButtonClick);\n }\n })\n .catch(function (err) {\n lpmErrorHandler.showErrorByMessage(err.message);\n });\n}\n\n/**\n * Inits LPM payment processing components\n * @param {Object} braintreeLpmModel LPM model\n */\nfunction init(braintreeLpmModel) {\n loader = loaderInstance($braintreeLpmLoader);\n lpmConfigs = lpmHelper.getBraintreeLpmConfigs();\n lpmModel = braintreeLpmModel;\n\n initLpm();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nmodule.exports = {\n NO_LPM_BRAINTREE_CONFIGURATIONS: 'No Lpm Braintree Configurations',\n ORDER_TOTAL_0: 'Order total 0 is not allowed for '\n};\n","'use strict';\n\nvar lpmErrorMessages = require('../constants/errorMessages');\nvar lpmHelper = require('../helpers/lpmHelper');\n\nvar $topErrorMessageText;\nvar $topErrorMessageWrapper;\nvar braintreeErrorMessages;\n\n/**\n * Shows error message on the top of the Checkout Page\n * @param {string} message Error message\n */\nfunction createErrorNotification(message) {\n $topErrorMessageText.textContent = '';\n $topErrorMessageWrapper.style.display = 'block';\n $topErrorMessageText.append(message);\n window.scrollTo(0, 0);\n}\n\n// General method which should be used for cases when error came from Braintree\nfunction showErrorByObject(error) {\n var msg = error.message;\n var code = error.code;\n var errorMessage = braintreeErrorMessages[code] || msg || braintreeErrorMessages.CLIENT_GATEWAY_NETWORK;\n\n createErrorNotification(errorMessage);\n}\n\n/**\n * Shows error by message\n * @param {string} message Error Message\n */\nfunction showErrorByMessage(message) {\n createErrorNotification(message);\n}\n\n/**\n * Process error form Braintree or Braintree-PaymentConfirm endpoint\n * @param {Object} error Error object\n */\nfunction processStartLpmPaymentError(error) {\n if (error.name === 'BraintreeError') {\n showErrorByObject(error);\n } else {\n showErrorByMessage(error.responseText);\n }\n}\n\n/**\n * Hides error message form the top of the Checkout Page\n */\nfunction hideError() {\n $topErrorMessageWrapper.style.display = 'none';\n $topErrorMessageText.innerHTML = '';\n}\n\n/**\n * Creates and throws an error if order amount is 0\n * @param {string} paymentMethodName Payment method name\n */\nfunction handleZeroAmountOnCheckout(paymentMethodName) {\n var zeroAmountErrorMsg = lpmErrorMessages.ORDER_TOTAL_0 + paymentMethodName;\n\n throw zeroAmountErrorMsg;\n}\n\n/**\n * Inits LPM error handler components\n */\nfunction init() {\n $topErrorMessageText = document.querySelector('.error-message-text');\n $topErrorMessageWrapper = document.querySelector('.error-message');\n braintreeErrorMessages = lpmHelper.getBraintreeLpmConfigs().messages;\n}\n\nmodule.exports = {\n processStartLpmPaymentError,\n showErrorByObject,\n showErrorByMessage,\n createErrorNotification,\n handleZeroAmountOnCheckout,\n hideError,\n init\n};\n","'use strict';\n\n/**\n * Returns Braintree LPM configs\n * @returns {Object} Braintree LPM configs\n */\nfunction getBraintreeLpmConfigs() {\n var braintreeLpmConfigs = null;\n\n try {\n braintreeLpmConfigs = JSON.parse(document.querySelector('.js_braintree_lpm_button').getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeLpmConfigs;\n }\n\n return braintreeLpmConfigs;\n}\n\nmodule.exports = {\n getBraintreeLpmConfigs\n};\n","'use strict';\n\nvar lpmModel = require('../braintreesdk/braintreeLpmModel');\n\nvar processingMsg = document.querySelector('.processingMsg');\nvar finalProcessingMsg = document.querySelector('.finalProcessingMsg');\n\n/**\n * Whether 'details' parameter is exist returns 'details' or shipping address if not exist\n *\n * @param {Object} details Details object from StartPaymentPayload\n * @param {string} email Email Address\n * @returns {Object} Details object\n */\nfunction getPaymentDetailsParameter(details, email) {\n var shippingAddress = lpmModel.getShippingAddress();\n shippingAddress.email = email;\n\n return jQuery.isEmptyObject(details) ? shippingAddress : details;\n}\n\n/**\n * Shows processing message on the Billing Page\n */\nfunction showProcessingMsg() {\n processingMsg.style.display = 'block';\n}\n\n/**\n * Hides processing message on the Billing Page\n */\nfunction hideProcessingMsg() {\n processingMsg.style.display = 'none';\n}\n\n/**\n * Show final processing message on the Billing Page\n */\nfunction showFinalProcessingMsg() {\n finalProcessingMsg.style.display = 'block';\n}\n\n/**\n *\n * @param {Object} lpmConfigs LPM configs object\n * @param {string} paymentMethodName Payment method name\n * @param {string} email Email address\n * @param {Object} startPaymentPayload StartPaymnetPayload\n * @returns {Promise} Promise resolved with 'redirectUrl'\n */\nfunction confirmPayment(lpmConfigs, paymentMethodName, email, startPaymentPayload) {\n return $.ajax({\n url: lpmConfigs.paymentConfirmUrl,\n type: 'POST',\n contentType: 'application/json',\n data: JSON.stringify({\n nonce: startPaymentPayload.nonce,\n lpmName: paymentMethodName,\n details: getPaymentDetailsParameter(startPaymentPayload.details, email),\n deviceData: JSON.stringify({ correlation_id: startPaymentPayload.correlationId })\n })\n });\n}\n\n/**\n * Creates a redirecting form to Order-Confirm endpoint\n * @param {Object} param The helping object for creating a from\n * @returns {Object} form element\n */\nfunction createConfirmForm(param) {\n var form = $('')\n .appendTo(document.body)\n .attr({\n method: 'POST',\n action: param.url\n });\n\n $('')\n .appendTo(form)\n .attr({\n name: 'orderID',\n value: param.orderID\n });\n\n $('')\n .appendTo(form)\n .attr({\n name: 'orderToken',\n value: param.orderToken\n });\n\n return form;\n}\n\n/**\n * Prepare and submits form in order to confirm order with Lpm\n * @param {string} redirectUrl Redirect Url\n */\nfunction processLpmConfirmForm(redirectUrl) {\n var splitUrl = redirectUrl.split('?');\n var url = splitUrl[0];\n var paramsString = splitUrl[1];\n var searchParams = new URLSearchParams(paramsString);\n var formParam = {\n orderID: searchParams.get('orderID'),\n orderToken: searchParams.get('orderToken'),\n url: url\n };\n var form = createConfirmForm(formParam);\n\n form.submit();\n}\n\nmodule.exports = {\n getPaymentDetailsParameter,\n showProcessingMsg,\n hideProcessingMsg,\n showFinalProcessingMsg,\n confirmPayment,\n processLpmConfirmForm\n};\n","'use strict';\n\nvar braintreeLpmModelBuilder = require('./braintreesdk/braintreeLpmModelBuilder');\n\nvar lpmErrorHandler = require('./errorhandler/lpmErrorHandler');\nvar lpmPaymentProcessing = require('./components/lpmPaymentProcessing');\n\n/**\n * Inits LPM on the Billing-Checkout Page\n */\nfunction init() {\n var braintreeLpmModelResponse = braintreeLpmModelBuilder.init();\n\n lpmErrorHandler.init();\n\n lpmPaymentProcessing.init(braintreeLpmModelResponse.btLpmModel);\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar braintreeGeneral = require('./braintreeGeneral');\n\n// Components\nvar payPalStoredBillingAddressComponent = require('./paypal/components/payPalStoredBillingAddress');\n\n// Helpers\nvar paymentMethodGeneralHelper = require('./paymentMethodGeneralHelper');\nvar helper = require('./helper');\nvar googlePayHelper = require('./googlepay/helpers/googlePayHelper');\nvar srcHelper = require('./src/helpers/srcHelper');\nvar venmoHelper = require('./venmo/helpers/venmoHelper');\nvar applePayHelper = require('./applepay/helpers/applePayHelper');\nvar payPalListHelper = require('./paypal/helpers/payPalListHelper');\nvar customerHelpers = require('../../../../../../../cartridges/app_custom_fraserhart/cartridge/client/default/js/checkout/customer.js');\n\n// Constancts used only for \"createGeneralClientInstancePromise\" function\nconst CHECKOUT_PAGE = 'checkout_page';\nconst CART_MINICART_PRODUCT_PAGE = 'cart_minicart_product_page';\n\nfunction getApplicablePageType() {\n var isCheckoutPage = Boolean(document.getElementById('checkout-main'));\n // It is so, since MiniCart is exists on all mentioned pages\n var isCartMiniCartProductPage = Boolean(document.getElementsByClassName('minicart').length);\n var currentPageType;\n\n if (isCheckoutPage) {\n currentPageType = CHECKOUT_PAGE;\n } else if (isCartMiniCartProductPage) {\n currentPageType = CART_MINICART_PRODUCT_PAGE;\n }\n\n return currentPageType;\n}\n\nfunction createGeneralClientInstancePromise() {\n var applycablePageType = getApplicablePageType();\n var clientToken = null;\n var clientInstancePromise = null;\n\n // eslint-disable-next-line default-case\n switch (applycablePageType) {\n case CHECKOUT_PAGE:\n var $billingElement = document.querySelector('.summary-details.billing');\n\n clientToken = $billingElement.getAttribute('data-bt-client-token');\n break;\n\n case CART_MINICART_PRODUCT_PAGE:\n var $btExpressCheckoutPayPalButtonWrapper = document.querySelector('.braintree-cart-paypal-buttons-wrap');\n var $btAccountPayPalButtonWrapper = document.querySelector('.js_braintree_accountPaypalButton_wrapper');\n\n if ($btExpressCheckoutPayPalButtonWrapper) {\n clientToken = $btExpressCheckoutPayPalButtonWrapper.getAttribute('data-bt-client-token');\n } else if ($btAccountPayPalButtonWrapper) {\n clientToken = $btAccountPayPalButtonWrapper.getAttribute('data-bt-client-token');\n }\n break;\n }\n\n if (clientToken) {\n clientInstancePromise = braintreeGeneral.createClientInstance(clientToken);\n }\n\n return clientInstancePromise;\n}\n\n/**\n * Method override default SFRA payment-details filling behavior.\n * Method fill payment-details block with the right payment methdo data (like name, account, etc.)\n */\nfunction fillPaymentSammaryContainer() {\n var $summaryDetails = document.querySelector('.summary-details .payment-details');\n\n if ($summaryDetails) {\n $summaryDetails.classList.add('braintree-payment-details');\n $summaryDetails.classList.remove('payment-details');\n\n $('body').on('checkout:updateCheckoutView', helper.updateCheckoutView);\n }\n}\n\n/**\n * May be used for all payment methods\n * Create error container and append it after PayPal button\n * @param {string} payPalButtonSelector selector of PayPal button\n * @returns {Object} return created error container\n */\nfunction createErrorContainerAfterPayPalButton(payPalButtonSelector) {\n var $errorContainer = document.createElement('div');\n var $payPalButton = document.querySelector(payPalButtonSelector);\n\n $errorContainer.classList.add('alert-danger');\n $errorContainer.style.cssText = 'text-align: center';\n\n $payPalButton.parentNode.insertBefore($errorContainer, $payPalButton.nextSibling);\n\n return $errorContainer;\n}\n\n/**\n * Init behavior which should be triggered when buyer clicked on Payment Method tab.\n * Currently we handle billing address modification enabling/disabling.\n * We also have init behavior of \"Submit Payment\" button\n */\nfunction initPaymentMethodTabClickBehavior() {\n $('.payment-options .nav-item').click(function () {\n var selectedMethodID = $(this).data('method-id');\n var $payPalAccountList = document.querySelector('#braintreePaypalAccountsList');\n var localPaymentMethodsList = [\n 'sepa',\n 'bancontact',\n 'eps',\n 'giropay',\n 'ideal',\n 'mybank',\n 'p24',\n 'sofort'\n ];\n\n if (selectedMethodID !== 'PayPal' && selectedMethodID !== 'V12') {\n // Undo address selection which was done via \"displaySelectedStoredBillingAddress\" for PayPal PM\n payPalStoredBillingAddressComponent.selectDefaultBillingAddressOption();\n }\n\n if (localPaymentMethodsList.includes(selectedMethodID)) {\n selectedMethodID = 'LPM';\n }\n\n switch (selectedMethodID) {\n case 'PayPal':\n var $selectedPayPalAccountOption = $payPalAccountList.options[$payPalAccountList.selectedIndex];\n // Disabled billing address functionality on billing page\n paymentMethodGeneralHelper.disableBillingAddressFunctionality();\n\n // Submit Payment button behavior\n var isAccountListHidden = document.querySelector('.braintree_used_paypal_account').classList.contains('used-paypal-account-hide');\n\n if (isAccountListHidden) {\n paymentMethodGeneralHelper.hideSubmitPaymentButton();\n } else if (!payPalListHelper.isNewPayPalAccountOptionSelected()) {\n paymentMethodGeneralHelper.showSubmitPaymentButton();\n } else {\n paymentMethodGeneralHelper.hideSubmitPaymentButton();\n }\n\n // Display billing address of selected PayPal account ONLY for STORED PP accounts use-case\n payPalStoredBillingAddressComponent.displaySelectedStoredBillingAddress($selectedPayPalAccountOption);\n break;\n\n case 'GooglePay':\n googlePayHelper.googlePayContentTabHandler(true);\n // Disabled billing address functionality on the Billing Page\n paymentMethodGeneralHelper.disableBillingAddressFunctionality();\n break;\n\n case 'SRC':\n srcHelper.srcContentTabHandler(true);\n // Disabled billing address functionality on Billing Page\n paymentMethodGeneralHelper.disableBillingAddressFunctionality();\n break;\n\n case 'DW_APPLE_PAY':\n applePayHelper.toggleContinueButtonOnBillingPage();\n // Disabled billing address functionality on the Billing Page\n paymentMethodGeneralHelper.disableBillingAddressFunctionality();\n paymentMethodGeneralHelper.hideBillingAddressBlock();\n paymentMethodGeneralHelper.saveBillingAddressToField();\n break;\n\n case 'CREDIT_CARD':\n paymentMethodGeneralHelper.enableBillingAddressFunctionality();\n\n // Submit Payment button behavior\n paymentMethodGeneralHelper.showSubmitPaymentButton();\n var customerFormSelector = customerHelpers.methods.isGuestFormActive() ? customerHelpers.vars.GUEST_FORM : customerHelpers.vars.REGISTERED_FORM;\n var hasSavedAddresses = $('.payment-information').attr('data-has-saved-addresses');\n \n if (($('.payment-information').attr('data-apple-pay-loaded') === 'true' && hasSavedAddresses === 'false')\n || ($('.payment-information').attr('data-apple-pay-loaded') === 'true' && customerFormSelector === customerHelpers.vars.GUEST_FORM)\n ) {\n $('body').trigger('checkout:clearBillingFormAddNew');\n $('.payment-information').attr('data-apple-pay-loaded', false);\n }\n break;\n case 'Venmo':\n var isBtVenmoAccountsList = Boolean(document.querySelector('#braintreeVenmoAccountsList'));\n var isSessionAccountExist = Boolean(document.querySelector('.used-venmo-account'));\n // Handles continue button visibility on the Billing Page in Venmo tab\n // Case for the registered user with saved account\n if (isBtVenmoAccountsList) {\n venmoHelper.venmoContentTabHandler();\n } else if (isSessionAccountExist) {\n // Case when only session account exist without saved account\n helper.continueButtonToggle(false);\n } else {\n // Case when no session/saved account exist and Venmo button is shown\n helper.continueButtonToggle(true);\n }\n\n // Enabled billing address functionality on the Billing Page\n paymentMethodGeneralHelper.enableBillingAddressFunctionality();\n break;\n case 'LPM':\n // Enabled billing address functionality on the Billing Page\n paymentMethodGeneralHelper.enableBillingAddressFunctionality();\n paymentMethodGeneralHelper.hideSubmitPaymentButton();\n break;\n default:\n // Enabled billing address functionality on the Billing Page\n paymentMethodGeneralHelper.enableBillingAddressFunctionality();\n }\n });\n}\n\n/**\n * Creates customer form with email to submit it to CheckoutServices-SubmitCustomer endpoint\n * @param {string} email email from payment method's response\n * @returns {Object} customer form data\n */\nfunction createCustomerFormData(email) {\n var data = {\n email: email\n };\n\n var csrfToken = document.querySelector('.braintree-cart-buttons-wrap #csrf_token');\n var checkoutCustomerFormFields = document.querySelector('.braintree-cart-buttons-wrap').getAttribute('data-checkout-customer-form-fields');\n var customerFormData = helper.createPaymentFormData(checkoutCustomerFormFields, data);\n\n customerFormData.append(csrfToken.name, csrfToken.value);\n\n return customerFormData;\n}\n\n/**\n * Submits customer form with email to CheckoutServices-SubmitCustomer endpoint\n * Call is triggered only in case if email in basket is empty (guest first checkout from cart)\n * @param {string} email email from payment method's response\n * @returns {Ajax} ajax call to CheckoutServices-SubmitCustomer endpoint\n */\nfunction submitCustomerForm(email) {\n var buttonsWrapper = document.querySelector('.braintree-cart-buttons-wrap');\n var isCustomerEmailEmpty = JSON.parse(buttonsWrapper.getAttribute('data-is-customer-email-empty'));\n // Could be \"true\" only in case if email in basket is empty (first guest checkout from cart)\n if (isCustomerEmailEmpty) {\n var submitCustomerUrl = buttonsWrapper.getAttribute('data-checkout-submit-customer-url');\n var customerFormData = createCustomerFormData(email);\n\n return $.ajax({\n type: 'POST',\n url: submitCustomerUrl,\n data: customerFormData,\n contentType: false,\n processData: false\n });\n }\n}\n\nmodule.exports = {\n createGeneralClientInstancePromise,\n fillPaymentSammaryContainer,\n createErrorContainerAfterPayPalButton,\n initPaymentMethodTabClickBehavior,\n submitCustomerForm\n};\n","'use strict';\n\nfunction hideBillingAddressManipulationButtons() {\n document.querySelector('.address-selector-block .btn-show-details').style.display = 'none';\n document.querySelector('.address-selector-block .btn-add-new').style.display = 'none';\n}\n\nfunction showBillingAddressManipulationButtons() {\n document.querySelector('.address-selector-block .btn-show-details').style.display = '';\n document.querySelector('.address-selector-block .btn-add-new').style.display = '';\n}\n\nfunction disableBillingAddressList() {\n document.getElementById('billingAddressSelector').setAttribute('disabled', 'disabled');\n}\n\nfunction enableBillingAddressList() {\n document.getElementById('billingAddressSelector').removeAttribute('disabled');\n}\n\nfunction hideSubmitPaymentButton() {\n document.querySelector('.submit-payment').style.display = 'none';\n}\n\nfunction showSubmitPaymentButton() {\n document.querySelector('.submit-payment').style.display = '';\n}\n\nfunction hideBillingAddressBlock() {\n document.querySelector('.billing-address-block').style.display = 'none';\n}\n\nfunction showBillingAddressBlock() {\n document.querySelector('.billing-address-block').style.display = 'block';\n}\n\n/**\n * Hides biiling address form on the Billing Page for appropriate tabs.\n * Case when customer cliked 'Updated address' or 'Add New' button and flipped through the payment method tabs\n */\nfunction hideBillingAddressForm() {\n document.querySelector('.billing-address-block .billing-address').style.display = 'none';\n}\n\n/**\n * Shows biiling address form on the Billing Page for appropriate tabs.\n * Case when customer cliked 'Updated address' or 'Add New' button and flipped through the payment method tabs\n */\nfunction showBillingAddressForm() {\n document.querySelector('.billing-address-block .billing-address').style.display = '';\n}\n\n/**\n * Saves billing address field to the hidden field on the Billing Page in JSON\n */\nfunction saveBillingAddressToField() {\n var billingAddress = {\n firstName: document.getElementById('billingFirstName').value,\n lastName: document.getElementById('billingLastName').value,\n address1: document.getElementById('billingAddressOne').value,\n address2: document.getElementById('billingAddressTwo').value,\n countryCode: document.getElementById('billingCountry').value,\n stateCode: document.getElementById('billingState').value,\n city: document.getElementById('billingAddressCity').value,\n postalCode: document.getElementById('billingZipCode').value,\n phone: document.getElementById('phoneNumber').value,\n email: $('.billing-email').val()\n };\n\n // eslint-disable-next-line no-undef\n document.getElementById('previousBillingAddress').value = JSON.stringify(billingAddress);\n}\n\n/**\n * Disabled billing address functionality on the Billing Page\n */\nfunction disableBillingAddressFunctionality() {\n disableBillingAddressList();\n hideBillingAddressManipulationButtons();\n hideBillingAddressForm();\n}\n\n/**\n * Enabled billing address functionality on the Billing Page\n */\nfunction enableBillingAddressFunctionality() {\n showBillingAddressBlock();\n showBillingAddressManipulationButtons();\n enableBillingAddressList();\n showBillingAddressForm();\n}\n\nmodule.exports = {\n disableBillingAddressFunctionality,\n enableBillingAddressFunctionality,\n hideBillingAddressManipulationButtons,\n showBillingAddressManipulationButtons,\n disableBillingAddressList,\n enableBillingAddressList,\n hideBillingAddressForm,\n showBillingAddressForm,\n hideSubmitPaymentButton,\n showSubmitPaymentButton,\n hideBillingAddressBlock,\n saveBillingAddressToField\n};\n","'use strict';\n\n/* global paypal braintree $ */\n\n/**\n * Function creates PayPal Checkout instance\n * @param {Promise} btClientInstancePromise BT Client Instance Promise\n * @param {Object} payPalPaymentProcessingModal Instance of PayPalPaymentProcessing model. Is needed to have customize CheckoutInstance generation\n * depending on PayPalPaymentProcessing instance congfigs\n * @returns {Promise} Promise with PayPal Checkout Instance\n */\nfunction createPayPalCheckoutInstance(btClientInstancePromise, payPalPaymentProcessingModal) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n var payPalCheckoutConfigs = payPalPaymentProcessingModal.payPalCheckoutInstanceConfigs(btClientInstance);\n\n return braintree.paypalCheckout.create(payPalCheckoutConfigs);\n });\n}\n\n/**\n * Creates PayPal button style configs\n * @param {Object} btPayPalConfigurations Configurations of PayPal button\n * @returns {Object} Style configs with the right format\n */\nfunction createPayPalStyleConfigurations(btPayPalConfigurations) {\n var payPalButtonStyleConfigs = btPayPalConfigurations.paypalConfig.style;\n\n return {\n height: payPalButtonStyleConfigs.height,\n color: payPalButtonStyleConfigs.color,\n shape: payPalButtonStyleConfigs.shape,\n layout: payPalButtonStyleConfigs.layout,\n label: payPalButtonStyleConfigs.label,\n tagline: payPalButtonStyleConfigs.tagline\n };\n}\n\n/**\n * Callback which is came from PayPal configuratinos. Should trigger only \"enable\" action\n * @param {Object} validateActions Object from Braintree\n */\nvar payPalFormValidationConrol = function (validateActions) {\n var isFormValid = true;\n\n if (isFormValid) {\n validateActions.enable();\n } else {\n validateActions.disable();\n }\n};\n\n/**\n * Returns PayPal button behavior configs which are used when VaultMode is enabled\n * @param {Promise} btPayPalCheckoutInstance Promise with PayPal Checkout Instance\n * @param {Object} btPayPalConfigurations Object with PayPal configurations\n * @param {Object} payPalPaymentProcessingModal Instance of PayPalPaymentProcessing model\n * @returns {Object} Object with PayPal button configs & callbacks wich will handle PayPal button behavior\n */\nfunction getVaultModeButtonConfigurations(\n btPayPalCheckoutInstance,\n btPayPalConfigurations,\n payPalPaymentProcessingModal\n) {\n var payPalButtonStyleConfigs = createPayPalStyleConfigurations(btPayPalConfigurations);\n var vaultModePayPalButtonConfigs = {\n onClick: function (_, actions) {\n return payPalPaymentProcessingModal.onPayPalButtonClickCallback(_, actions);\n },\n createBillingAgreement: function () {\n // Logic which executed after buyer clicked on the button, and PayPal modal start loading\n // \"onOrderCreateCallback\" is used for forming of order data object\n var paymentObject = payPalPaymentProcessingModal.onOrderCreateCallback();\n\n return btPayPalCheckoutInstance.createPayment(paymentObject);\n },\n onApprove: function (data) {\n // Some logic here before tokenization happens below\n return btPayPalCheckoutInstance.tokenizePayment(data)\n .then(function (payload) {\n payPalPaymentProcessingModal.onApprovePaymentCallback(payload);\n });\n },\n onCancel: function () {\n payPalPaymentProcessingModal.onCancelPaymentCallback();\n },\n\n onError: function (err) {\n payPalPaymentProcessingModal.onErrorPaymentCallback(err);\n },\n style: payPalButtonStyleConfigs,\n validate: function (validateActions) {\n payPalFormValidationConrol(validateActions);\n }\n };\n\n return vaultModePayPalButtonConfigs;\n}\n\n/**\n * Returns PayPal button behavior configs which are used when VaultMode is disabled or \"Checkout with Vault\" is enabled\n * @param {Promise} btPayPalCheckoutInstance Promise with PayPal Checkout Instance\n * @param {Object} btPayPalConfigurations Object with PayPal configurations\n * @param {Object} payPalPaymentProcessingModal Instance of PayPalPaymentProcessing model\n * @returns {Object} Object with PayPal button configs & callbacks wich will handle PayPal button behavior\n */\nfunction getCheckoutModeButtonConfigurations(\n btPayPalCheckoutInstance,\n btPayPalConfigurations,\n payPalPaymentProcessingModal\n) {\n var payPalButtonStyleConfigs = createPayPalStyleConfigurations(btPayPalConfigurations);\n var vaultModePayPalButtonConfigs = {\n onClick: function (_, actions) {\n return payPalPaymentProcessingModal.onPayPalButtonClickCallback(_, actions);\n },\n createOrder: function () {\n // Logic which executed after buyer clicked on the button, and PayPal modal start loading\n // \"onOrderCreateCallback\" is used for forming of order data object\n var paymentObject = payPalPaymentProcessingModal.onOrderCreateCallback();\n\n return btPayPalCheckoutInstance.createPayment(paymentObject);\n },\n onApprove: function (data) {\n // Some logic here before tokenization happens below\n return btPayPalCheckoutInstance.tokenizePayment(data)\n .then(function (payload) {\n payPalPaymentProcessingModal.onApprovePaymentCallback(payload);\n });\n },\n onCancel: function () {\n payPalPaymentProcessingModal.onCancelPaymentCallback();\n },\n\n onError: function (err) {\n payPalPaymentProcessingModal.onErrorPaymentCallback(err);\n },\n style: payPalButtonStyleConfigs,\n validate: function (validateActions) {\n payPalFormValidationConrol(validateActions);\n }\n };\n\n return vaultModePayPalButtonConfigs;\n}\n\n/**\n * Function which result is rendered PayPal button\n * @param {Promise} btClientInstancePromise Client instance promise\n * @param {boolean} isVaultMode \"true\" in case if VaultMode is enabled\n * @param {Object} btPayPalConfigurations Object with PayPal configurations\n * @param {string} payPalButtonSelector PayPal button selector (container inside of which PayPal button will be rendered)\n * @param {Object} payPalPaymentProcessingModal instance of PayPalPaymentProcessing model\n * @returns {Promise} PayPal button\n */\nfunction payPalButtonRendering(\n btClientInstancePromise,\n isVaultMode,\n btPayPalConfigurations,\n payPalButtonSelector,\n payPalPaymentProcessingModal\n) {\n var btPayPalCheckoutInstancePromise = createPayPalCheckoutInstance(btClientInstancePromise, payPalPaymentProcessingModal);\n\n var paypalButtonConfigs = null;\n var paypalButtonSdkUrlConfigs = null;\n\n var changePMButtonEnabled = payPalPaymentProcessingModal.changePMButtonEnabled;\n\n return btPayPalCheckoutInstancePromise\n .then(function (btPayPalCheckoutInstance) {\n // Change Paymnet Method button flow (checkout with vault flow)\n if (changePMButtonEnabled) {\n paypalButtonConfigs = getCheckoutModeButtonConfigurations(\n btPayPalCheckoutInstance,\n btPayPalConfigurations,\n payPalPaymentProcessingModal\n );\n paypalButtonSdkUrlConfigs = payPalPaymentProcessingModal.payPalCheckoutSdkConfigs();\n // If vault mode\n } else if (isVaultMode) {\n paypalButtonConfigs = getVaultModeButtonConfigurations(\n btPayPalCheckoutInstance,\n btPayPalConfigurations,\n payPalPaymentProcessingModal\n );\n paypalButtonSdkUrlConfigs = payPalPaymentProcessingModal.payPalVaultSdkConfigs();\n // If checkout mode\n } else {\n paypalButtonConfigs = getCheckoutModeButtonConfigurations(\n btPayPalCheckoutInstance,\n btPayPalConfigurations,\n payPalPaymentProcessingModal\n );\n paypalButtonSdkUrlConfigs = payPalPaymentProcessingModal.payPalCheckoutSdkConfigs();\n }\n\n // PayPal button loading\n if (!window.isPayPalSDKLoaded || changePMButtonEnabled) {\n // We pass params to customize PayPal SDK loading.\n btPayPalCheckoutInstance.loadPayPalSDK(paypalButtonSdkUrlConfigs).then(function () {\n window.isPayPalSDKLoaded = true;\n // eslint-disable-next-line new-cap\n return paypal.Buttons(paypalButtonConfigs).render(payPalButtonSelector);\n });\n } else {\n // In case if PayPal SDK was already loaded (with custom parameters), we can simple load PP button\n // eslint-disable-next-line new-cap\n return paypal.Buttons(paypalButtonConfigs).render(payPalButtonSelector);\n }\n });\n}\n\nmodule.exports = {\n payPalButtonRendering\n};\n","'use strict';\n\nvar PayPalAccountModel = require('../models/payPalAccountModel');\nvar ErrorHandlingBaseModel = require('../errorhandler/errorHandlingBaseModel');\nvar payPalAccountPageHelper = require('../helpers/payPalAccountPageHelper');\nvar helper = require('../../helper');\nvar loaderInstance = require('../../loaderHelper');\n\n/**\n * Init add new PayPal account button\n * @param {Object} PayPalAccount PayPal Account model instance\n */\nfunction initAddNewPayPalAccountEvent(PayPalAccount) {\n var $addNewPayPalAccountButton = document.querySelector('.add-paypal-account');\n\n $addNewPayPalAccountButton.addEventListener('click', function () {\n payPalAccountPageHelper.showPayPalAccountBtn();\n\n if (!window.accountPayPalButtonInited) {\n window.accountPayPalButtonInited = true;\n PayPalAccount.initPayment();\n }\n });\n}\n\n/**\n * Init remove PayPal account button\n */\nfunction initRemovePayPalAccountEvent() {\n $(document).on('click', '.paypal-accounts .remove-bt-payment', function (e) {\n helper.removeBtPayment(e);\n });\n}\n\n/**\n * Init Make Default PayPal account button\n */\nfunction initMakeDefaultPayPalAccountEvent() {\n $(document).on('click', '.paypal-accounts .braintree-make-default-card', function () {\n var $this = $(this);\n var makeDefaultUrl = $this.data('make-default-url');\n var paymentMehtodId = $this.data('id');\n var paymentProcessorId = $('.paypal-accounts').data('payment-method-id');\n var loaderContainer = document.querySelector('#paypalAccountBtLoader');\n var loader = loaderInstance(loaderContainer);\n\n loader.show();\n\n helper.setDefaultProperty({\n url: makeDefaultUrl,\n id: paymentMehtodId,\n paymentMethodID: paymentProcessorId,\n loader\n });\n });\n}\n\n/**\n * Function which initiate PayPal functionality on the Account Page\n * @param {Object} btClientInstancePromise BT Client Instance promise\n */\nfunction init(btClientInstancePromise) {\n var payPalButtonSelector = '.js_braintree_accountPaypalButton_wrapper .js_braintree_accountPaypalButton';\n var $payPalButton = document.querySelector(payPalButtonSelector);\n\n if ($payPalButton) {\n var payPalConfigurations = JSON.parse($payPalButton.getAttribute('data-braintree-config'));\n var addPayPalAccountUrl = $payPalButton.getAttribute('data-paypal-add-account-handler');\n\n var isVaultMode = payPalConfigurations.options.flow !== 'checkout';\n var requestBillingAgreement = Boolean(payPalConfigurations.options.requestBillingAgreement);\n var isFraudToolsEnabled = payPalConfigurations.isFraudToolsEnabled;\n let $csrfToken = document.querySelector('.js_braintree_accountPaypalButton_wrapper #csrf_token');\n var $loaderContainer = document.querySelector('#braintreePayPalAccLoader');\n\n // Init params for AccountErrorHandling model\n var errorMessages = payPalConfigurations.messages;\n\n var ErrorHandling = new ErrorHandlingBaseModel(errorMessages);\n var PayPalAccount = new PayPalAccountModel(\n ErrorHandling,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n addPayPalAccountUrl,\n $loaderContainer\n );\n\n initAddNewPayPalAccountEvent(PayPalAccount);\n initRemovePayPalAccountEvent();\n initMakeDefaultPayPalAccountEvent();\n\n return;\n }\n\n var isVenmoAccountBlockExists = Boolean(document.querySelector('.paypal-accounts'));\n\n if (isVenmoAccountBlockExists) {\n initRemovePayPalAccountEvent();\n initMakeDefaultPayPalAccountEvent();\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n// For cases when basket amount changing without page reload\nvar dynamicBasketProductQuantity = -1;\n\n/**\n * Hide PayPal button\n * @param {Object} $payPalButton PayPal button js container\n */\nfunction hidePayPalButton($payPalButton) {\n $payPalButton.style.display = 'none';\n}\n\n/**\n * Show PayPal button\n * @param {Object} $payPalButton PayPal button js container\n */\nfunction showPayPalButton($payPalButton) {\n $payPalButton.style.display = '';\n}\n\n/**\n * Check if PDP product price is zero\n * @returns {boolean} \"true\" in case if PDP product price is zero\n */\nfunction isZeroPdpProductPrice() {\n var $productPriceSelector = document.querySelector('.price .sales .value');\n\n if ($productPriceSelector) {\n var price = parseInt($productPriceSelector.getAttribute('content'), 0);\n return !(price > 0);\n }\n\n return true;\n}\n\n/**\n * Check if basket is empty based on attr which comes from server and \"dynamicBasketProductQuantity\" which updates on \"cart:update\" event\n * @param {Object} $payPalButton PayPal button js container\n * @returns {boolean} \"true\" in case if basket is not empty\n */\nfunction isBasketNotEmpty($payPalButton) {\n return !JSON.parse($payPalButton.getAttribute('data-is-basket-empty')) || (dynamicBasketProductQuantity > 0 && dynamicBasketProductQuantity !== -1);\n}\n\n/**\n * Is add to cart button disabled\n * @returns {boolean} \"true\" in case if add to cart button disabled\n */\nfunction isAddToCartButtonDisabled() {\n var $addToCartButton = document.querySelector('.add-to-cart') || document.querySelector('.add-to-cart-global');\n\n return $addToCartButton.disabled;\n}\n\n/**\n * Return mini cart quantity\n * @param {Object} $miniCartQuantitySelector Mini cart quantity selector\n * @returns {Int} Quantity\n */\nfunction getMiniCartQuantity($miniCartQuantitySelector) {\n var quantity = null;\n\n if ($miniCartQuantitySelector) {\n quantity = parseInt($miniCartQuantitySelector.textContent, 0);\n }\n\n return quantity;\n}\n\n/**\n * Check if current total basket price is zero\n * @returns {boolean} \"true\" in case if current total basket price is zero\n */\nfunction isCurrentTotalBasketPriceZero() {\n var $basketTotalAmount = document.querySelector('.sub-total');\n\n if ($basketTotalAmount) {\n var basketTotalAmount = $basketTotalAmount.textContent.slice(1);\n\n return parseInt(basketTotalAmount, 10) === 0;\n }\n}\n\n/**\n * Show or hide PayPal button\n * @param {Object} paypalMinicartButton paypal button js container\n */\nfunction paypalMinicartButtonBehavior(paypalMinicartButton) {\n if (!isCurrentTotalBasketPriceZero()) {\n showPayPalButton(paypalMinicartButton);\n } else {\n hidePayPalButton(paypalMinicartButton);\n }\n}\n\n/**\n * Init PayPal button display behavior. This code is handle both PayPal button on PDP and MiniCart pages\n * @param {Object} $payPalButton PayPal button js container\n */\nfunction initProductPage($payPalButton) {\n var addToCartButtonDisabled = isAddToCartButtonDisabled();\n var zeroProductPrice = isZeroPdpProductPrice();\n var basketNotEmpty = isBasketNotEmpty($payPalButton);\n\n if (addToCartButtonDisabled || zeroProductPrice || basketNotEmpty) {\n hidePayPalButton($payPalButton);\n }\n\n $('body').on('product:afterAddToCart', function () {\n hidePayPalButton($payPalButton);\n });\n\n // Case when buyer remove product from Cart\n $('body').on('cart:update', function (_, data) {\n var $miniCartQuantityContainer = document.querySelector('.minicart-quantity');\n var miniCartQuantity = getMiniCartQuantity($miniCartQuantityContainer);\n var addToCartButtonEnabled = !isAddToCartButtonDisabled();\n zeroProductPrice = isZeroPdpProductPrice();\n\n if (data.basket) {\n dynamicBasketProductQuantity = data.basket.numItems;\n }\n\n if (miniCartQuantity === 0 && addToCartButtonEnabled && !zeroProductPrice) {\n showPayPalButton($payPalButton);\n } else {\n hidePayPalButton($payPalButton);\n }\n });\n\n // When buyer change collor/size of the product on PDP\n $('body').on('product:statusUpdate', function () {\n addToCartButtonDisabled = isAddToCartButtonDisabled();\n zeroProductPrice = isZeroPdpProductPrice();\n\n if (addToCartButtonDisabled || zeroProductPrice) {\n hidePayPalButton($payPalButton);\n } else {\n showPayPalButton($payPalButton);\n }\n });\n}\n\nmodule.exports = {\n initProductPage,\n paypalMinicartButtonBehavior\n};\n","'use strict';\n\nvar PayPalCartModel = require('../models/payPalCartModel');\nvar ErrorHandlingCartModel = require('../errorhandler/errorHandlingCartModel');\n\n/**\n * Initialize Cart page PayPal button\n * @param {Promise} clientInstancePromise Client instance promise\n */\nfunction init(clientInstancePromise) {\n var payPalButtonSelector = '.cart-page .js_braintree_paypal_cart_button';\n var $payPalButton = document.querySelector(payPalButtonSelector);\n var payPalConfigurations = JSON.parse($payPalButton.getAttribute('data-braintree-config'));\n\n var isVaultMode = payPalConfigurations.options.flow !== 'checkout';\n var requestBillingAgreement = Boolean(payPalConfigurations.options.requestBillingAgreement);\n var isFraudToolsEnabled = payPalConfigurations.isFraudToolsEnabled;\n var $csrfToken = document.querySelector('.braintree-cart-paypal-buttons-wrap #csrf_token');\n var $loaderContainer = document.querySelector('.braintreePayPalLoader');\n\n var ErrorHandling = new ErrorHandlingCartModel(payPalConfigurations.messages);\n var PayPalExpress = new PayPalCartModel(\n ErrorHandling,\n clientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n );\n\n // Generate Fraud Data if enabled\n PayPalExpress.generateFraudData();\n // Init PayPal button\n PayPalExpress.initPayment();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar PayPalCheckoutModel = require('../models/payPalCheckoutModel');\nvar ErrorHandlingCheckoutModel = require('../errorhandler/errorHandlingCheckoutModel');\nvar payPalAccountList = require('./payPalList');\nvar requestsHelper = require('../helpers/payPalRequestsHelperGlobal');\n\nvar braintreeClientInstancePromise;\nvar payPalConfigs;\n\n/**\n * Initialize Checkout PayPal button functionality\n * @param {Promise} btClientInstancePromise BT Client Instance promise\n * @param {Object} payPalConfigurations PayPal checkout configurations object\n * @param {Int} basketTotalAmount Basket total amount\n */\nfunction initCheckout(btClientInstancePromise, payPalConfigurations, basketTotalAmount) {\n var payPalButtonSelector = '.js_braintree_paypal_billing_button';\n var $continueButton = document.querySelector('button.submit-payment');\n\n var isVaultMode = payPalConfigurations.options.flow !== 'checkout';\n var requestBillingAgreement = Boolean(payPalConfigurations.options.requestBillingAgreement);\n var isFraudToolsEnabled = payPalConfigurations.isFraudToolsEnabled;\n var $loaderContainer = document.querySelector('.braintreePayPalLoader');\n\n var ErrorHandling = new ErrorHandlingCheckoutModel(payPalConfigurations.messages);\n var PayPalCheckoutPayment = new PayPalCheckoutModel(\n ErrorHandling,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $continueButton,\n basketTotalAmount,\n $loaderContainer\n );\n\n // Init account list\n payPalAccountList.init();\n // Generate Fraud Data if enabled\n PayPalCheckoutPayment.generateFraudData();\n // Init PayPal button\n PayPalCheckoutPayment.initPayment();\n}\n\n/**\n * Initialize Checkout PayPal button functionality.\n * Additional code was added which is used for total amount extracting which is needed for \"Change Payment Method button\" feature\n * @param {Promise} btClientInstancePromise BT Client Instance promise\n */\nfunction init(btClientInstancePromise) {\n var $payPalButton = document.querySelector('.js_braintree_paypal_billing_button');\n var $paypalTab = $('.payment-options .nav-item[data-method-id=\"PayPal\"]');\n var sessionPaymentMethodId;\n var changePMButtonEnabled;\n\n payPalConfigs = JSON.parse($payPalButton.getAttribute('data-braintree-config'));\n braintreeClientInstancePromise = btClientInstancePromise;\n sessionPaymentMethodId = payPalConfigs.sessionPaymentMethodId;\n changePMButtonEnabled = payPalConfigs.changePMButtonEnabled;\n\n // To load PayPal button only when buyer click (or from code) on PayPal Checkout tab\n $paypalTab.click(function () {\n var selectedMethodID = $(this).data('method-id');\n\n if (selectedMethodID === 'PayPal' && !window.payPalCheckoutWasInited) {\n window.payPalCheckoutWasInited = true;\n\n if (changePMButtonEnabled) {\n var basketDataPromise = requestsHelper.getBasketDataPromise(payPalConfigs.getOrderInfoUrl);\n\n basketDataPromise\n .then(function (data) {\n initCheckout(braintreeClientInstancePromise, payPalConfigs, data.amount);\n });\n } else {\n initCheckout(braintreeClientInstancePromise, payPalConfigs, null);\n }\n }\n });\n\n // Use case when PayPal button was inited and shipment price was updated\n // We need this only for Change Payment Method button feature\n if (changePMButtonEnabled) {\n $('body').on('checkout:shippingMethodSelected', function () {\n if (window.payPalCheckoutWasInited) {\n var basketDataPromise = requestsHelper.getBasketDataPromise(payPalConfigs.getOrderInfoUrl);\n\n basketDataPromise\n .then(function (data) {\n initCheckout(braintreeClientInstancePromise, payPalConfigs, data.amount);\n });\n }\n });\n }\n\n // Case when buyer use PayPal Static Image button\n // After click we select PayPal PM and init the rest of PP logic\n if (sessionPaymentMethodId === 'PayPal') {\n $paypalTab.trigger('click');\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar payPalSessionAccountComponent = require('./payPalSessionAccount');\nvar payPalStoredBillingAddressComponent = require('./payPalStoredBillingAddress');\nvar {\n isVaultModeEnabled,\n isOrderIntentEnabled,\n getAccountType,\n setNonceInputValue,\n hideSavePayPalAccountBlock,\n displaySavePayPalAccountBlock,\n displayPayPalButton,\n hidePayPalButon,\n displayContinueButton,\n hideContinueButon,\n isBuyerAuthenticated,\n selectPayPalCheckoutTab,\n setBraintreePayPalEmailInput,\n handleStoredAccountsShowing\n} = require('../helpers/payPalListHelper');\nvar billingFormHelper = require('../helpers/payPalBillingFormHelperGlobal');\n\nvar $payPalAccountList;\nvar $continueButton;\nvar $savePaypalAccountCountainer;\nvar $braintreePayPalNonce;\nvar $paypalButton;\nvar $payPalTab;\nvar $braintreePaypalEmail;\n\nvar constantList = {\n SESSION_ACCOUNT: 'session_account',\n NEW_ACCOUNT: 'new_account',\n STORED_ACCOUNT: 'stored_account'\n};\n\n/**\n * The function which manages what should be done when session/stored/new account was selected from the account dropdown\n */\nfunction accountsListChange() { // eslint-disable-line require-jsdoc\n var accountType = getAccountType($payPalAccountList, constantList);\n var $selectedPayPalAccountOption = $payPalAccountList.options[$payPalAccountList.selectedIndex];\n\n $continueButton.removeEventListener('click', payPalSessionAccountComponent.removeSessionNonce);\n\n // eslint-disable-next-line default-case\n switch (accountType) {\n // Buyer selected new PayPal account\n case constantList.NEW_ACCOUNT:\n displayPayPalButton($paypalButton);\n hideContinueButon($continueButton);\n break;\n\n // Buyer selected session account\n case constantList.SESSION_ACCOUNT:\n var $selectedOption = $payPalAccountList.selectedOptions[0];\n var selectedOptionNonceValue = $selectedOption.getAttribute('data-nonce');\n\n setNonceInputValue($braintreePayPalNonce, selectedOptionNonceValue);\n displayContinueButton($continueButton);\n hidePayPalButon($paypalButton);\n\n selectPayPalCheckoutTab($payPalTab);\n break;\n\n // Buyer selected stored account\n case constantList.STORED_ACCOUNT:\n var selectedAccountEmail = $selectedPayPalAccountOption.text;\n\n setNonceInputValue($braintreePayPalNonce, '');\n displayContinueButton($continueButton);\n hidePayPalButon($paypalButton);\n\n selectPayPalCheckoutTab($payPalTab);\n setBraintreePayPalEmailInput($braintreePaypalEmail, selectedAccountEmail);\n\n // Display billing address of selected PayPal account\n payPalStoredBillingAddressComponent.displaySelectedStoredBillingAddress($selectedPayPalAccountOption);\n\n $continueButton.addEventListener('click', payPalSessionAccountComponent.removeSessionNonce);\n break;\n }\n}\n\n/**\n * Init PayPal Account list functionality\n */\nfunction init() {\n $payPalAccountList = document.querySelector('#braintreePaypalAccountsList');\n $savePaypalAccountCountainer = document.querySelector('#braintreeSavePaypalAccountContainer');\n $braintreePayPalNonce = document.querySelector('#braintreePayPalNonce');\n $paypalButton = document.querySelector('.js_braintree_paypal_billing_button');\n $continueButton = document.querySelector('button.submit-payment');\n $payPalTab = document.querySelector('.paypal-tab');\n $braintreePaypalEmail = document.querySelector('#braintreePaypalEmail');\n var buyerAuthenticated = isBuyerAuthenticated($payPalAccountList);\n\n // Add on change \"account list\" event\n $payPalAccountList.addEventListener('change', accountsListChange);\n // Execute \"account list\" change function to setup init values\n accountsListChange();\n // Check whether buyer has proceeded with the same email which is already stored\n // if yes we hide stored account with the same email in dropdown\n // if no we show all existent PP accounts in dropdown (stored + new session account)\n handleStoredAccountsShowing(buyerAuthenticated);\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar PayPalExpressModel = require('../models/payPalExpressModel');\nvar ErrorHandlingMiniCartModel = require('../errorhandler/errorHandlingMiniCartModel');\nvar paymentMethodGeneral = require('../../paymentMethodGeneral');\nvar payPalStaticButtonComponent = require('./payPalStaticImage');\nvar paypalMinicartButtonBehavior = require('./payPalButtonDisplayBehavior');\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * Init PayPal on the MiniCart Page\n * @returns stop function execution in case if PayPal button wasn't rendered\n */\nfunction initPayPalOnMiniCart() {\n var $paypalMinicartButton = document.querySelector('.paypalMinicartButton');\n var $payPalStaticButton = document.querySelector('.paypalMinicartButton .braintree-static-paypal-button');\n var payPalButtonSelector = '.paypalMinicartButton .js_braintree_paypal_cart_button';\n var $payPalButton = document.querySelector(payPalButtonSelector);\n\n // Case when buyer remove product from the Cart\n $('body').on('cart:update', function () {\n paypalMinicartButtonBehavior.paypalMinicartButtonBehavior($paypalMinicartButton);\n });\n\n // PayPal Statick button rendering\n if (!$payPalButton && $payPalStaticButton) {\n paypalMinicartButtonBehavior.paypalMinicartButtonBehavior($paypalMinicartButton);\n // Init PayPal Static Button component\n payPalStaticButtonComponent.initOnMiniCart();\n\n return;\n // Do not init PayPal button in case if it was disabled via Site Pref config\n } else if (!$payPalButton) {\n return;\n }\n\n paypalMinicartButtonBehavior.paypalMinicartButtonBehavior($paypalMinicartButton);\n\n var payPalConfigurations = JSON.parse($payPalButton.getAttribute('data-braintree-config'));\n var isPayPalButtonWasInited = JSON.parse($payPalButton.getAttribute('data-is-inited'));\n\n // Do not init PayPal button if it was already inited or PayPal configs are empty\n if (isPayPalButtonWasInited || typeof payPalConfigurations !== 'object' || payPalConfigurations === null) {\n return;\n }\n\n var isVaultMode = payPalConfigurations.options.flow !== 'checkout';\n var requestBillingAgreement = Boolean(payPalConfigurations.options.requestBillingAgreement);\n var isFraudToolsEnabled = payPalConfigurations.isFraudToolsEnabled;\n var $csrfToken = document.querySelector('.braintree-cart-paypal-buttons-wrap #csrf_token');\n var $loaderContainer = document.querySelector('.braintreePayPalLoader');\n\n var clientInstancePromise = paymentMethodGeneral.createGeneralClientInstancePromise();\n\n var ErrorHandling = new ErrorHandlingMiniCartModel(payPalConfigurations.messages);\n var PayPalExpress = new PayPalExpressModel(\n ErrorHandling,\n clientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n );\n\n // Generate Fraud Data if enabled\n PayPalExpress.generateFraudData();\n\n // Init PayPal button\n PayPalExpress.initPayment();\n\n // Indicate that PayPal button was already inited.\n $payPalButton.setAttribute('data-is-inited', true);\n}\n\n/**\n * Init PayPal button on the MiniCart Page\n */\nfunction init() {\n var $minicartPopover = document.querySelector('.minicart .popover');\n var observer;\n\n // To avoid executino of this code on checkout page\n if ($minicartPopover) {\n observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n if (mutation.addedNodes.length < 2) {\n return;\n }\n\n initPayPalOnMiniCart();\n });\n });\n\n observer.observe($minicartPopover, { childList: true });\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar PayPalProductPageModel = require('../models/payPalProductPageModel');\nvar ErrorHandlingBaseModel = require('../errorhandler/errorHandlingBaseModel');\n\nvar payPalButtonDisplayBehavior = require('./payPalButtonDisplayBehavior');\n\n/**\n * Init PayPal button on the Product Page\n * @param {Promise} clientInstancePromise Client Instance Promise\n */\nfunction init(clientInstancePromise) {\n var payPalButtonSelector = '.prices-add-to-cart-actions .js_braintree_paypal_cart_button';\n var $payPalButton = document.querySelector(payPalButtonSelector);\n var payPalConfigurations = JSON.parse($payPalButton.getAttribute('data-braintree-config'));\n\n var isVaultMode = payPalConfigurations.options.flow !== 'checkout';\n var requestBillingAgreement = Boolean(payPalConfigurations.options.requestBillingAgreement);\n var isFraudToolsEnabled = payPalConfigurations.isFraudToolsEnabled;\n var $csrfToken = document.querySelector('.braintree-cart-paypal-buttons-wrap #csrf_token');\n var $loaderContainer = document.querySelector('.braintreePayPalLoader');\n\n var ErrorHandling = new ErrorHandlingBaseModel(payPalConfigurations.messages);\n var PayPalProductPage = new PayPalProductPageModel(\n ErrorHandling,\n clientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n );\n\n // Init behavior for hide/show PayPal button\n payPalButtonDisplayBehavior.initProductPage($payPalButton);\n // Generate Fraud Data if enabled\n PayPalProductPage.generateFraudData();\n // Init PayPal button\n PayPalProductPage.initPayment();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar payPalSessionAccountHelper = require('../helpers/payPalSessionAccountHelper');\n\n/**\n * Function which remove session nonce and related to the session account data\n */\nfunction removeSessionNonce() {\n var $braintreePayPalNonce = document.querySelector('#braintreePayPalNonce');\n var $braintreePaypalAccount = document.querySelector('#braintreePaypalAccount');\n\n var sessionOption = helper.getSessionAccountOption({\n querySelector: '#braintreePaypalAccountsList',\n id: 'braintreePaypalAccount'\n });\n\n if (sessionOption) {\n $braintreePayPalNonce.value = '';\n $braintreePaypalAccount.selected = false;\n\n sessionOption.classList.add('used-paypal-account-hide');\n sessionOption.classList.remove('used-paypal-account');\n sessionOption.value = '';\n sessionOption.text = '';\n sessionOption.setAttribute('data-session-account', false);\n sessionOption.setAttribute('data-save', false);\n\n // Handles a behavior inside PayPal tab, when session PayPal account was deleted\n payPalSessionAccountHelper.handlePaypalTabBehavior();\n }\n}\n\nmodule.exports = {\n removeSessionNonce\n};\n","'use strict';\n\nvar payPalStaticImageHelper = require('../helpers/payPalStaticImageHelper');\nvar payPalButtonDisplayBehavior = require('./payPalButtonDisplayBehavior');\nvar loaderInstance = require('../../loaderHelper');\nvar ErrorHandlingBaseModel = require('../errorhandler/errorHandlingBaseModel');\nvar ErrorHandlingCartModel = require('../errorhandler/errorHandlingCartModel');\nvar ErrorHandlingMiniCartModel = require('../errorhandler/errorHandlingMiniCartModel');\nvar billingFormHelper = require('../helpers/payPalBillingFormHelperGlobal');\nvar requestsHelper = require('../helpers/payPalRequestsHelperGlobal');\nvar payPalExpressModelHelper = require('../helpers/payPalExpressModelHelper');\n\nvar $btPoductPagePayPalButton = document.querySelector('.braintree_pdp_button');\n\n/**\n * On PayPal Static button click handler. Implement the logic which should happen when buyer clicked on this button\n * @param {Object} loader Loader\n * @param {Object} ErrorHandlingInstance Error handling instance\n */\nfunction onStaticImageClickHandlerBase(loader, ErrorHandlingInstance) {\n loader.show();\n\n // URLs\n var checkoutFromCartUrl = this.getAttribute('data-checkout-from-cart-url');\n var placeOrderUrl = this.getAttribute('data-paypal-placeorder-url');\n\n // PayPal Account data\n var payPalAccountData = JSON.parse(this.getAttribute('data-paypal-account-data'));\n var billingAddressData = Object.assign(payPalAccountData, JSON.parse(payPalAccountData.address));\n\n // Process of payment FromData creation/filling\n var $payPalButtonWrapper = document.querySelector('.braintree-cart-paypal-buttons-wrap');\n var payPalCheckoutFormFieldNames = $payPalButtonWrapper.getAttribute('data-paypal-checkout-form-fields');\n var $csrfToken = document.querySelector('.braintree-cart-paypal-buttons-wrap #csrf_token');\n var billingFromData;\n\n billingFromData = billingFormHelper.createBillingAddressFormData(payPalCheckoutFormFieldNames, billingAddressData);\n\n billingFormHelper.appendCsrfTokenToFormData(billingFromData, $csrfToken);\n payPalStaticImageHelper.appendSavePayPalAccount(billingFromData);\n payPalStaticImageHelper.appendPaymentDataToFormData(billingFromData, payPalAccountData);\n\n // Submit customer form with email (CheckoutServices-SubmitCustomer)\n // as we skip step \"login via guest/registered user\" while express checkout\n // email is set only in case of guest checkout and if email is not already set\n payPalExpressModelHelper.submitCustomerForm(payPalAccountData.email);\n\n // Submit billing data to server (CheckoutSrvice-SubmitPayment)\n // In case of succesfull call, redirect buyer to Order Review Page\n requestsHelper.submitPaymentDataToServerPromise(checkoutFromCartUrl, billingFromData, placeOrderUrl, loader, ErrorHandlingInstance);\n}\n\n/**\n * Code which is configure and manage Static PayPal button on PDP\n */\nfunction onStaticImageClickHandlerPdp() {\n var isBtPoductPagePayPalButtonVisible = $btPoductPagePayPalButton.style.display === '';\n var addProductToCartOnClick = Boolean($btPoductPagePayPalButton) && isBtPoductPagePayPalButtonVisible;\n var ErrorHandlingProductModelInstance = new ErrorHandlingBaseModel({});\n var that = this;\n\n var $loaderContainter = document.querySelector('.product-detail .braintreePayPalLoader');\n var loader = loaderInstance($loaderContainter);\n\n loader.show();\n // On click on PayPal Static image add product to the Cart (only on PDP)\n if (addProductToCartOnClick) {\n var res = requestsHelper.addProductToCart();\n\n if (res.error) {\n // eslint-disable-next-line no-unused-expressions\n window.location.reload;\n loader.hide();\n } else {\n onStaticImageClickHandlerBase.call(that, loader, ErrorHandlingProductModelInstance);\n }\n }\n}\n\n/**\n * Code which is configure and manage Static PayPal button on the Cart Page\n */\nfunction onStaticImageClickHandlerCart() {\n var ErrorHandlingCartModelInstance = new ErrorHandlingCartModel({});\n var $loaderContainter = document.querySelector('.braintree-cart-buttons-wrap .braintreePayPalLoader');\n var loader = loaderInstance($loaderContainter);\n\n onStaticImageClickHandlerBase.call(this, loader, ErrorHandlingCartModelInstance);\n}\n\n/**\n * Code which is configure and manage Static PayPal button on the MiniCart Page\n\n */\nfunction onStaticImageClickHandlerMiniCart() {\n var ErrorHandlingMiniCartModelInstance = new ErrorHandlingMiniCartModel({});\n var $loaderContainter = document.querySelector('.paypalMinicartButton .braintreePayPalLoader');\n var loader = loaderInstance($loaderContainter);\n\n onStaticImageClickHandlerBase.call(this, loader, ErrorHandlingMiniCartModelInstance);\n}\n\n/**\n * Init on click listner on Static PayPal button on PDP\n * @param {Promise} clientInstancePromise Client Instance Promise\n */\nfunction initOnPdp() {\n var $pdpStaticPaypalButton = document.querySelector('.braintree_pdp_button .braintree-static-paypal-button');\n\n // Init behavior for hide/show PayPal Static button\n payPalButtonDisplayBehavior.initProductPage($pdpStaticPaypalButton);\n\n if ($pdpStaticPaypalButton) {\n $pdpStaticPaypalButton.addEventListener('click', onStaticImageClickHandlerPdp);\n }\n}\n\n/**\n * Init on click listner on Static PayPal button on the MiniCart Page\n * @param {Promise} clientInstancePromise Client Instance Promise\n */\nfunction initOnMiniCart() {\n var $miniCartStaticPaypalButton = document.querySelector('.paypalMinicartButton .braintree-static-paypal-button');\n\n if ($miniCartStaticPaypalButton) {\n $miniCartStaticPaypalButton.addEventListener('click', onStaticImageClickHandlerMiniCart);\n }\n}\n\n/**\n * Init on click listner on Static PayPal button on the Cart Page\n * @param {Promise} clientInstancePromise Client Instance Promise\n */\nfunction initOnCart() {\n var $cartStaticPaypalButton = document.querySelector('.cart-page .braintree-static-paypal-button');\n\n if ($cartStaticPaypalButton) {\n $cartStaticPaypalButton.addEventListener('click', onStaticImageClickHandlerCart);\n }\n}\n\nmodule.exports = {\n initOnMiniCart,\n initOnPdp,\n initOnCart\n};\n","'use strict';\n\n/**\n * Extract billing address of corresponding PayPal payment account from paypal account option\n * @param {Object} $selectedPayPalPayment PayPal payment option\n * @returns {string} return string representation of extracted address\n */\nfunction getBillingAddressAsString($selectedPayPalPayment) {\n var selectedBillingAddressStr = $selectedPayPalPayment.getAttribute('data-billing-address');\n var selectedBillingAddressObj;\n var billingAddressRepresentationString = '';\n\n if (selectedBillingAddressStr && selectedBillingAddressStr !== '') {\n selectedBillingAddressObj = JSON.parse(selectedBillingAddressStr);\n\n if (selectedBillingAddressObj && selectedBillingAddressStr !== '{}') {\n var firstName = selectedBillingAddressObj.firstName || '';\n var lastname = selectedBillingAddressObj.lastName || '';\n var address1 = selectedBillingAddressObj.line1 || selectedBillingAddressObj.address1 || '';\n var city = selectedBillingAddressObj.city || '';\n var state = selectedBillingAddressObj.state || selectedBillingAddressObj.stateCode || '';\n var postalCode = selectedBillingAddressObj.postalCode || '';\n\n billingAddressRepresentationString = firstName + ' ' +\n lastname + ' ' +\n address1 + ' ' +\n city + ', ' +\n state + ' ' +\n postalCode;\n }\n }\n\n return billingAddressRepresentationString;\n}\n\n/**\n * Display billing address of passed paypal payment option (of selected paypal payment option)\n * @param {Object} $selectedPayPalPayment Selected PayPal payment option\n */\nfunction displaySelectedStoredBillingAddress($selectedPayPalPayment) {\n if ($selectedPayPalPayment) {\n var selectedOptionClassList = $selectedPayPalPayment.classList;\n\n if (selectedOptionClassList.contains('js-stored-paypal-account') || selectedOptionClassList.contains('js-session-paypal-account')) {\n var billingAddressAsString = getBillingAddressAsString($selectedPayPalPayment);\n var $storedPayPalAddressOption = $('#billingAddressSelector option[class=\"stored-paypal-address\"]');\n var storedPayPalAddressOptionExists = $storedPayPalAddressOption.length;\n\n if (billingAddressAsString !== '') {\n if (storedPayPalAddressOptionExists) {\n $storedPayPalAddressOption.text(billingAddressAsString);\n $storedPayPalAddressOption.prop('selected', true);\n } else {\n $('#billingAddressSelector').append('');\n }\n }\n }\n }\n}\n\n/**\n * Returns the matching address ID or UUID for a billing address\n * @returns {string} Matching address ID\n */\nfunction getMatchingBillingAddressId() {\n var matchingBillingAddressId;\n\n $.ajax({\n url: document.querySelector('.js_braintree_getOrderInfoUrl').value + '?qwe=2344',\n type: 'get',\n async: false,\n dataType: 'json',\n success: function (data) {\n if (data.matchingBillingAddressId) {\n matchingBillingAddressId = data.matchingBillingAddressId;\n } else {\n matchingBillingAddressId = false;\n }\n },\n error: function () {\n window.location.reload();\n }\n });\n\n return matchingBillingAddressId;\n}\n\n/**\n * Set default billing address as selected\n */\nfunction selectDefaultBillingAddressOption() {\n var billingAccountsSelector = '#billingAddressSelector';\n var $braintreePaypalAccountList = document.querySelector('#braintreePaypalAccountsList');\n var matchingBillingAddressId;\n\n if ($braintreePaypalAccountList) {\n matchingBillingAddressId = getMatchingBillingAddressId();\n\n if (matchingBillingAddressId && matchingBillingAddressId !== '') {\n $(`${billingAccountsSelector} option[value=\"${matchingBillingAddressId}\"]`).prop('selected', true);\n } else {\n // Shows billing address of session account\n $(`${billingAccountsSelector} option[value=\"${'manual-entry'}\"]`).prop('selected', true);\n }\n\n $(`${billingAccountsSelector} option[class=\"stored-paypal-address\"]`).remove();\n }\n}\n\nmodule.exports = {\n displaySelectedStoredBillingAddress,\n selectDefaultBillingAddressOption\n};\n","'use strict';\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages object with error messages\n */\nfunction ErrorHandlingBaseModel(errorMessages) {\n this.errorMessages = errorMessages;\n}\n\n/**\n * ---- General method which should be used for cases when error came from Braintree ----\n * Show error notification by error Object from BT\n * @param {Object} error error object from Bt\n */\nErrorHandlingBaseModel.prototype.showErrorByObject = function (error) {\n var msg = error.message;\n var code = error.code;\n var errorMessage = this.errorMessages[code] || msg || this.errorMessages.CLIENT_GATEWAY_NETWORK;\n\n this.createErrorNotification(errorMessage);\n};\n\n/**\n * ---- General method which should be used for cases when error came from Braintree ----\n * Show error notification by message\n * @param {string} message message to display inside error notification\n */\nErrorHandlingBaseModel.prototype.showErrorByMessage = function (message) {\n this.createErrorNotification(message);\n};\n\n/**\n * ---- Error container which will be used on Account and PDP ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Method responsible for Error Notification generation\n * @param {string} message message to display inside error notification\n */\nErrorHandlingBaseModel.prototype.createErrorNotification = function (message) {\n var $errorContainer = $('.error-messaging');\n\n var errorHtml = '
' +\n '' + message + '
';\n\n $errorContainer.append(errorHtml);\n $errorContainer.show();\n window.scrollTo(0, 0);\n};\n\n/**\n * ---- Method which should hide error container and make it empty. On Account and PDP we use this one ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Hide error notification\n */\nErrorHandlingBaseModel.prototype.hideError = function () {\n var $errorContainer = $('.error-messaging');\n\n $errorContainer.hide();\n $errorContainer.empty();\n};\n\n/**\n * Show \"Billing Address is not Supported\" error notification\n */\nErrorHandlingBaseModel.prototype.showBillingAddressIsNotSupported = function () {\n this.showErrorByMessage(this.errorMessages.PAYPAL_BILLING_ADDRESS_NOT_SUPPORTED);\n};\n\nmodule.exports = ErrorHandlingBaseModel;\n","'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling Cart model constructor\n * @param {Object} errorMessages Object with error messages\n */\nfunction ErrorHandlingCartModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.$errorContainer = $('.cart-error-messaging');\n this.errorMessages = errorMessages;\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingCartModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCartModel.prototype.createErrorNotification = function (message) {\n $('.checkout-btn').addClass('disabled');\n this.$errorContainer.append(\n `
\n \n ${message}\n
`\n );\n\n this.$errorContainer.show();\n window.scrollTo(0, 0);\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCartModel.prototype.hideError = function () {\n this.$errorContainer.hide();\n this.$errorContainer.empty();\n};\n\n/**\n * Show \"Zero Amount\" error on Cart page\n */\nErrorHandlingCartModel.prototype.showZeroAmountOnCart = function () {\n this.showErrorByMessage(this.errorMessages.CUSTOM_PAYPAL_ZERO_AMOUNT_ERROR);\n};\n\n\nmodule.exports = ErrorHandlingCartModel;\n","'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling Checkout model constructor\n * @param {Object} errorMessages object with error messages\n */\nfunction ErrorHandlingCheckoutModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.$topErrorMessageText = document.querySelector('.error-message-text');\n this.$topErrorMessageWrapper = document.querySelector('.error-message');\n\n this.errorMessages = errorMessages;\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingCheckoutModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.hideError = function () {\n this.$topErrorMessageWrapper.style.display = 'none';\n this.$topErrorMessageText.innerHTML = '';\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.createErrorNotification = function (message) {\n this.$topErrorMessageText.textContent = '';\n this.$topErrorMessageText.append(message);\n\n this.$topErrorMessageWrapper.style.display = 'block';\n window.scrollTo(0, 0);\n};\n\n/**\n * Show \"Billing Address is not Supported\" error\n */\nErrorHandlingCheckoutModel.prototype.showBillingAddressIsNotSupported = function () {\n this.showErrorByMessage(this.errorMessages.PAYPAL_BILLING_ADDRESS_NOT_SUPPORTED);\n};\n\n/**\n * Show \"Zero Amount\" on the Checkout Page error\n */\nErrorHandlingCheckoutModel.prototype.showZeroAmountOnCheckout = function () {\n this.showErrorByMessage(this.errorMessages.CUSTOM_PAYPAL_ZERO_AMOUNT_ERROR);\n};\n\n\nmodule.exports = ErrorHandlingCheckoutModel;\n","'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling MiniCart model constructor\n * @param {Object} errorMessages object with error messages\n */\nfunction ErrorHandlingMiniCartModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.$errorContainer = $('.minicart-error');\n this.errorMessages = errorMessages;\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingMiniCartModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingMiniCartModel.prototype.createErrorNotification = function (message) {\n $('.checkout-btn').addClass('disabled');\n this.$errorContainer.append(\n `
\n \n ${message}\n
`\n );\n\n this.$errorContainer.show();\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingMiniCartModel.prototype.hideError = function () {\n this.$errorContainer.hide();\n this.$errorContainer.empty();\n};\n\nmodule.exports = ErrorHandlingMiniCartModel;\n","'use strict';\n\nvar helper = require('../../helper');\n\n/**\n * Save PayPal account to DW\n * @param {string} addPayPalAccountUrl add PayPal account url\n * @param {FormData} paymentFormData payment FormData\n * @returns {Promise} response from server\n */\nfunction savePayPalAccount(addPayPalAccountUrl, paymentFormData) {\n return $.ajax({\n type: 'POST',\n url: addPayPalAccountUrl,\n data: paymentFormData,\n contentType: false,\n processData: false\n });\n}\n\n/**\n * Render PayPal account\n * @param {string} renderAccountsUrl render PayPal accounts URL\n * @returns {Promise} promise with html of PayPal account list\n */\nfunction renderPayPalAccounts(renderAccountsUrl) {\n return $.get(renderAccountsUrl);\n}\n\n/**\n * Hide PayPal account button\n */\nfunction hidePaypalAccountBtn() {\n var $addNewPaypalAccountBtn = document.querySelector('.add-paypal-account');\n var $paypalAccountButtonWrapper = document.querySelector('.js_braintree_accountPaypalButton_wrapper');\n\n // Display add new paypal account button\n $addNewPaypalAccountBtn.style.display = 'block';\n // Hide PayPal Account button\n $paypalAccountButtonWrapper.style.display = 'none';\n}\n\n/**\n * Add PayPal accounts html template to the DOM\n * @param {string} accountListTemplate html template with PayPal account list\n */\nfunction addPayPalAccountsToTheTemplate(accountListTemplate) {\n var $payPalAccountsContainer = document.querySelector('.paypal-accounts');\n\n $payPalAccountsContainer.innerHTML = accountListTemplate;\n}\n\n/**\n * Trigger cart:updates event\n */\nfunction throwCartUpade() {\n $('body').trigger('cart:update');\n}\n\n/**\n * Init Remove PayPal Account button listner\n */\nfunction initRemovePayPalAccountButtonsListners() {\n var $allRemovePayPalAccountButtons = document.querySelectorAll('.paypal-accounts .remove-bt-payment');\n\n $allRemovePayPalAccountButtons.forEach(function (removePayPalAccountButton) {\n removePayPalAccountButton.addEventListener('click', helper.removeBtPayment);\n });\n}\n\nmodule.exports = {\n savePayPalAccount,\n renderPayPalAccounts,\n hidePaypalAccountBtn,\n addPayPalAccountsToTheTemplate,\n throwCartUpade,\n initRemovePayPalAccountButtonsListners\n};\n","'use strict';\n\n/**\n * Show PayPal Account button\n */\nfunction showPayPalAccountBtn() {\n var $addPaypalAccountBtn = document.querySelector('.add-paypal-account');\n var $paypalAccountWrapper = document.querySelector('.js_braintree_accountPaypalButton_wrapper');\n\n $addPaypalAccountBtn.style.display = 'none';\n $paypalAccountWrapper.style.display = 'block';\n}\n\nmodule.exports = {\n showPayPalAccountBtn\n};\n","\n'use strict';\n\nvar helper = require('../../helper');\n\n/**\n * Store payment as session payment\n * @param {string} nonce Nonce\n * @param {string} sessionAccountEmail Session account email\n */\nfunction storePaymentAsSessionPayment(nonce, sessionAccountEmail) {\n var $accountListBlock = document.querySelector('.form-group.braintree_used_paypal_account');\n var $braintreePaypalNonceInput = document.querySelector('input[name=braintreePaypalNonce]');\n var $sessionPyapalAccount = document.querySelector('#braintreePaypalAccount');\n\n if ($braintreePaypalNonceInput) {\n $braintreePaypalNonceInput.value = nonce;\n }\n\n $sessionPyapalAccount.setAttribute('data-session-account', 'true');\n $sessionPyapalAccount.setAttribute('data-nonce', nonce);\n $sessionPyapalAccount.text = sessionAccountEmail;\n $sessionPyapalAccount.classList.remove('used-paypal-account-hide');\n\n // Show account list block\n $accountListBlock.classList.remove('used-paypal-account-hide');\n}\n\n/**\n * Select session paypal accounts.\n * Every time when buyer adds new account, the New Account option is selected (doesn't matter logged in buyer or not)\n */\nfunction setSessionAccountOptionDefault() {\n var $savedPayPalAccountList = document.querySelector('#braintreePaypalAccountsList');\n var $sessionPyapalAccount = document.querySelector('#braintreePaypalAccount');\n\n Array.prototype.forEach.call($savedPayPalAccountList, function (element) {\n element.removeAttribute('selected');\n });\n\n $sessionPyapalAccount.selected = true;\n}\n\n/**\n * Get stored account by session account email\n * @returns {Object} js container with stored account\n */\nfunction getStoredAccountBySesionAccountEmail() {\n var sessionPaypalAccount = document.getElementById('braintreePaypalAccount');\n var paypalAccountsList = document.querySelector('#braintreePaypalAccountsList');\n var sessionEmail = sessionPaypalAccount.value || null;\n\n return Array.apply(null, paypalAccountsList.options).find(function (el) {\n return el.getAttribute('data-id') && sessionEmail && sessionEmail === el.text;\n });\n}\n\n/**\n * Fill DW billing form with billing address from Bt\n * @param {Object} braintreeAddress Billing address from BT\n * @param {Object} btDetails Details from BT\n * @returns {Object} Object with billing form fields and it's values\n */\nfunction mapBraintreeWithDwBillingAddress(braintreeAddress, btDetails) {\n var $btPaymentMethodWrapper = document.querySelector('.braintree-billing-payment-wrap');\n var dwBillingFormFieldNames = JSON.parse($btPaymentMethodWrapper.getAttribute('data-billing-form-fields-names'));\n\n dwBillingFormFieldNames.dwfrm_billing_addressFields_firstName = btDetails.firstName;\n dwBillingFormFieldNames.dwfrm_billing_addressFields_lastName = btDetails.lastName;\n dwBillingFormFieldNames.dwfrm_billing_addressFields_address1 = braintreeAddress.line1;\n dwBillingFormFieldNames.dwfrm_billing_addressFields_address2 = braintreeAddress.line2;\n dwBillingFormFieldNames.dwfrm_billing_addressFields_city = braintreeAddress.city;\n dwBillingFormFieldNames.dwfrm_billing_addressFields_postalCode = braintreeAddress.postalCode;\n dwBillingFormFieldNames.dwfrm_billing_addressFields_states_stateCode = braintreeAddress.state;\n dwBillingFormFieldNames.dwfrm_billing_addressFields_country = braintreeAddress.countryCode;\n dwBillingFormFieldNames.dwfrm_billing_contactInfoFields_phone = btDetails.phone;\n\n return dwBillingFormFieldNames;\n}\n\n/**\n * Create billing address data\n * @param {Object} payloadDetails BT paymload details\n * @returns {Object} Mapped billing data\n */\nfunction createBillingAddressData(payloadDetails) {\n var billingAddress = payloadDetails.billingAddress;\n\n billingAddress.firstName = payloadDetails.firstName;\n billingAddress.lastName = payloadDetails.lastName;\n billingAddress.email = payloadDetails.email;\n billingAddress.phone = payloadDetails.phone;\n billingAddress.countryCodeAlpha2 = billingAddress.countryCode;\n billingAddress.streetAddress = billingAddress.line1;\n billingAddress.extendedAddress = billingAddress.line2;\n billingAddress.locality = billingAddress.city;\n billingAddress.region = billingAddress.state;\n\n return billingAddress;\n}\n\n/**\n * Copy PayPal billing address to DW billing form\n * @param {Object} braintreeBillingAddress Billing address from BT\n * @param {Object} btDetails Details from bt\n */\nfunction copyPayPalBillingAddressToDw(braintreeBillingAddress, btDetails) {\n var $braintreePaypalBillingAddressInput = document.querySelector('input[name=braintreePaypalBillingAddress]');\n var paypalBillingData = mapBraintreeWithDwBillingAddress(braintreeBillingAddress, btDetails);\n\n // Store billing address inside hidden input in order to send it to the server and\n // proccess with billing address server logic (the logic - billing address can't be overrided by\n // buyer. Only PayPal billing address should be used)\n $braintreePaypalBillingAddressInput.value = JSON.stringify(paypalBillingData);\n helper.updateBillingFormValues(paypalBillingData);\n}\n\n/**\n * Create billig address FormData\n * @param {Object} paypalBillingFormFields PayPal billing form fields\n * @param {Object} billingAddressData Billing address data\n * @returns {FormData} Billing FormData\n */\nfunction createBillingAddressFormData(paypalBillingFormFields, billingAddressData) {\n var billingAddressFormData;\n\n billingAddressFormData = helper.createPaymentFormData(paypalBillingFormFields, {\n firstName: billingAddressData.firstName,\n lastName: billingAddressData.lastName,\n address1: billingAddressData.streetAddress,\n address2: billingAddressData.extendedAddress || '',\n city: billingAddressData.locality,\n postalCode: billingAddressData.postalCode,\n stateCode: billingAddressData.state,\n country: billingAddressData.countryCodeAlpha2,\n email: billingAddressData.email,\n phone: billingAddressData.phone,\n paymentMethod: 'PayPal'\n });\n\n return billingAddressFormData;\n}\n\n/**\n * Fill PayPal payment fields with payment data\n * @param {Object} btDetails Details from BT\n */\nfunction fillPayPalPaymentFields(btDetails) {\n var $braintreePaypalEmailInput = document.querySelector('#braintreePaypalEmail');\n var $sessionPaypalAccount = document.querySelector('#braintreePaypalAccount');\n var btEmail = btDetails.email;\n\n $braintreePaypalEmailInput.value = btEmail;\n $sessionPaypalAccount.value = btEmail;\n $sessionPaypalAccount.text = btEmail;\n\n // Hide Continue button\n helper.continueButtonToggle(false);\n}\n\n/**\n * Fill fraud data input with fraud data\n * @param {Object} data Fraud data\n */\nfunction fillFraudDataInput(data) {\n var $braintreePaypalRiskDataInput = document.querySelector('input[name=braintreePaypalRiskData]');\n\n $braintreePaypalRiskDataInput.value = data.deviceData;\n}\n\n\n/**\n * Append CSRF token to the billing FormData\n * @param {FormData} formData Billing form data\n * @param {Object} $csrfToken CSRF token js container\n */\nfunction appendCsrfTokenToFormData(formData, $csrfToken) {\n formData.append($csrfToken.name, $csrfToken.value);\n}\n\n/**\n * Append email to the billing FormData\n * @param {FormData} formData billing form data\n * @param {string} email user email\n */\nfunction appendEmailAsStringToFormData(formData, email) {\n formData.append('braintreePaypalEmail', email);\n}\n\n/**\n * Append fraud data to the FormData\n * @param {FormData} billingFromData billing FormData\n * @param {Object} fraudData fraud data\n */\nfunction appendFraudDataToFormData(billingFromData, fraudData) {\n billingFromData.append('braintreePaypalRiskData', fraudData);\n}\n\n/**\n * Append billing address data as a string to the FromData\n * @param {FormData} billingFromData Billing FormData\n * @param {Object} billingData Billing data\n */\nfunction appendBillingAddressAsStringToFormData(billingFromData, billingData) {\n billingFromData.append('braintreePaypalBillingAddress', JSON.stringify(billingData));\n}\n\n/**\n * Append BT payment fields to the FromData\n * @param {FormData} billingFromData Billing FormData\n * @param {Object} payload payload from BT\n */\nfunction appendBtPaymentFieldsToFormData(billingFromData, payload) {\n billingFromData.append('braintreePaypalNonce', payload.nonce);\n billingFromData.append('braintreeSavePaypalAccount', true);\n}\n\n/**\n * Append params to the URL\n * @param {string} url To which append params\n * @param {Object} param Which should be appended to the URL\n * @returns {string} Final URL with passed params\n */\nfunction appendToUrl(url, param) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(param).map(function (key) {\n return key + '=' + encodeURIComponent(param[key]);\n }).join('&');\n\n return newUrl;\n}\n\nmodule.exports = {\n storePaymentAsSessionPayment,\n setSessionAccountOptionDefault,\n getStoredAccountBySesionAccountEmail,\n copyPayPalBillingAddressToDw,\n createBillingAddressFormData,\n createBillingAddressData,\n fillPayPalPaymentFields,\n fillFraudDataInput,\n\n appendCsrfTokenToFormData,\n appendFraudDataToFormData,\n appendBillingAddressAsStringToFormData,\n appendBtPaymentFieldsToFormData,\n appendEmailAsStringToFormData,\n\n // Utils\n appendToUrl\n};\n","'use strict';\n\n/**\n * Hide PayPal button\n */\nfunction hidePayPalButtons() {\n var payPalButtonsContainer = document.querySelector('.js_braintree_paypal_billing_button');\n\n payPalButtonsContainer.style.display = 'none';\n}\n\n/* -------------------------------------------- Account\\Options Manipulations -------------------------------------------- */\n\n/**\n * Hide account option from account dropdown\n * @param {Object} $accountOption vanilla js account option container\n */\nfunction hideAccount($accountOption) {\n $accountOption.style.display = 'none';\n}\n\n/**\n * Hide Save New Account checkbox with corresponding block\n */\nfunction hideSaveNewAccountContainer() {\n var savePaypalAccountCheckbox = document.getElementById('braintreeSavePaypalAccount');\n var savePaypalAccountContainer = document.querySelector('#braintreeSavePaypalAccountContainer');\n\n savePaypalAccountCheckbox.value = false;\n savePaypalAccountContainer.style.display = 'none';\n}\n\n/**\n * Make all hidden stored paypal accounts visible for buyer\n */\nfunction displayAllStoredAccounts() {\n var braintreePaypalAccountsList = document.querySelector('#braintreePaypalAccountsList');\n\n Array.prototype.forEach.call(braintreePaypalAccountsList, function (el) {\n if (el.style.display === 'none') {\n el.style.display = 'block';\n }\n });\n}\n\n/**\n * Hides 'Save PayPal Account' checkbox on the Billing Page\n */\nfunction hideSavePayPalAccountBlock() {\n var $savePaypalAccountCountainer = document.querySelector('#braintreeSavePaypalAccountContainer');\n\n $savePaypalAccountCountainer.style.display = 'none';\n}\n\n/**\n * Function which store billing data on session payment option level\n * @param {Object} btPayloadDetails braintree payload details\n */\nfunction addBillingAddressOnPaymentOptionLevel(btPayloadDetails) {\n var $sessionPyapalAccount = document.querySelector('#braintreePaypalAccount');\n var btBillingAddress = btPayloadDetails.shippingAddress;\n\n $sessionPyapalAccount.setAttribute('data-billing-address', JSON.stringify({\n firstName: btPayloadDetails.firstName,\n lastName: btPayloadDetails.lastName,\n line1: btBillingAddress.line1,\n city: btBillingAddress.city,\n state: btBillingAddress.state,\n postalCode: btBillingAddress.postalCode\n }));\n}\n\nmodule.exports = {\n hidePayPalButtons,\n // Account\\Options Manipulations\n hideAccount,\n hideSaveNewAccountContainer,\n displayAllStoredAccounts,\n hideSavePayPalAccountBlock,\n addBillingAddressOnPaymentOptionLevel\n};\n","'use strict';\n\nvar helper = require('../../helper');\n\n/**\n * Create shipping address data\n * @param {Object} payloadDetails BT payload details\n * @returns {Object} Shipping address\n */\nfunction createShippingAddressData(payloadDetails) {\n var shippingAddressPayPalData = payloadDetails.shippingAddress;\n var shippingAddressData = {\n line1: shippingAddressPayPalData.line1,\n streetAddress: shippingAddressPayPalData.line1,\n city: shippingAddressPayPalData.city,\n locality: shippingAddressPayPalData.city,\n state: shippingAddressPayPalData.state,\n region: shippingAddressPayPalData.state,\n countryCode: shippingAddressPayPalData.countryCode,\n countryCodeAlpha2: shippingAddressPayPalData.countryCode,\n postalCode: shippingAddressPayPalData.postalCode,\n email: payloadDetails.email,\n phone: payloadDetails.phone\n };\n\n if (!shippingAddressPayPalData.recipientName) {\n shippingAddressData.firstName = payloadDetails.firstName;\n shippingAddressData.lastName = payloadDetails.lastName;\n shippingAddressData.recipientName = payloadDetails.firstName + ' ' + payloadDetails.lastName;\n } else {\n shippingAddressData.recipientName = shippingAddressPayPalData.recipientName;\n }\n\n return shippingAddressData;\n}\n\n/**\n * Append Shipping data as a String to the FormData\n * @param {FormData} billingFromData Billing FormData\n * @param {Object} shippingData Shipping data\n */\nfunction appendShippingDataAsStringToFormData(billingFromData, shippingData) {\n billingFromData.append('braintreePaypalShippingAddress', JSON.stringify(shippingData));\n}\n\n/**\n * Creates customer form with email to submit it to CheckoutServices-SubmitCustomer endpoint\n * @param {string} email Email from payment method's response\n * @returns {Object} Customer form data\n */\nfunction createCustomerFormData(email) {\n var data = {\n email: email\n };\n\n var csrfToken = document.querySelector('.braintree-cart-paypal-buttons-wrap #csrf_token');\n var checkoutCustomerFormFields = document.querySelector('.braintree-cart-paypal-buttons-wrap').getAttribute('data-checkout-customer-form-fields');\n var customerFormData = helper.createPaymentFormData(checkoutCustomerFormFields, data);\n\n customerFormData.append(csrfToken.name, csrfToken.value);\n\n return customerFormData;\n}\n\n/**\n * Submits customer form with email to CheckoutServices-SubmitCustomer endpoint\n * Call is triggered only in case if email in basket is empty (guest first checkout from cart)\n * @param {string} email Email from payment method's response\n * @returns {Ajax} Ajax call to CheckoutServices-SubmitCustomer endpoint\n */\nfunction submitCustomerForm(email) {\n var paypalButtonsWrapper = document.querySelector('.braintree-cart-paypal-buttons-wrap');\n var isCustomerEmailEmpty = JSON.parse(paypalButtonsWrapper.getAttribute('data-is-customer-email-empty'));\n // Could be true only in case if email in basket is empty (first guest checkout from cart)\n if (isCustomerEmailEmpty) {\n var submitCustomerUrl = paypalButtonsWrapper.getAttribute('data-submit-customer-url');\n var customerFormData = createCustomerFormData(email);\n\n return $.ajax({\n type: 'POST',\n url: submitCustomerUrl,\n data: customerFormData,\n contentType: false,\n processData: false\n });\n }\n}\n\nmodule.exports = {\n createShippingAddressData,\n appendShippingDataAsStringToFormData,\n submitCustomerForm\n};\n","'use strict';\n\nvar billingFormHelper = require('./payPalBillingFormHelperGlobal');\nvar paypalCheckoutModelHelper = require('./payPalCheckoutModelHelper');\n\n/**\n * Is vault mode enabled\n * @param {Object} $paypalButton PayPal button js container\n * @returns {boolean} 'true' in case if vault mode is enabled\n */\nfunction isVaultModeEnabled($paypalButton) {\n var payPalConfigurations = JSON.parse($paypalButton.getAttribute('data-braintree-config'));\n var isVaultMode = payPalConfigurations.vaultModeEnabled;\n\n return isVaultMode;\n}\n\n/**\n * Returns whether 'order' intent type is enbaled\n * @param {Object} $paypalButton PayPal button js container\n * @returns {boolean} true/false\n */\nfunction isOrderIntentEnabled($paypalButton) {\n var payPalConfigurations = JSON.parse($paypalButton.getAttribute('data-braintree-config'));\n\n return payPalConfigurations.options.intent === 'order';\n}\n\n/**\n * Function which return account type.\n * Possible values are: new account, session account, stored account\n * @param {Object} $payPalAccountList PayPal account list js container\n * @param {Object} constantList Object with paypal account constants\n * @returns {string} Account type\n */\nfunction getAccountType($payPalAccountList, constantList) {\n var accountType;\n\n if ($payPalAccountList.value === 'newaccount') {\n accountType = constantList.NEW_ACCOUNT;\n } else if ($payPalAccountList.selectedOptions[0].id === 'braintreePaypalAccount') {\n accountType = constantList.SESSION_ACCOUNT;\n } else {\n accountType = constantList.STORED_ACCOUNT;\n }\n\n return accountType;\n}\n\n/**\n * Set nonce in to corresponding hidden input\n * @param {Object} $braintreePayPalNonce BT input nonce js container\n * @param {string} nonceValue Nonce\n */\nfunction setNonceInputValue($braintreePayPalNonce, nonceValue) {\n $braintreePayPalNonce.value = nonceValue;\n}\n\n/**\n * Hide save PayPal account block\n * @param {Object} $savePaypalAccountCountainer Save PayPal account js container\n */\nfunction hideSavePayPalAccountBlock($savePaypalAccountCountainer) {\n $savePaypalAccountCountainer.style.display = 'none';\n}\n\n/**\n * Display save PayPal account block\n * @param {Object} $savePaypalAccountCountainer Save PayPal account js container\n */\nfunction displaySavePayPalAccountBlock($savePaypalAccountCountainer) {\n $savePaypalAccountCountainer.style.display = 'block';\n}\n\n/* --------------- PayPal button manipulations --------------- */\n/**\n * Show PayPal button\n * @param {Object} $paypalButton PayPal button js container\n */\nfunction displayPayPalButton($paypalButton) {\n $paypalButton.style.display = '';\n}\n\n/**\n * Hide PayPal button\n * @param {Object} $paypalButton PayPal button js container\n */\nfunction hidePayPalButon($paypalButton) {\n $paypalButton.style.display = 'none';\n}\n\n/* --------------- Continue button manipulations --------------- */\n/**\n * Display Continue button\n * @param {Object} $continueButton Continue button js container\n */\nfunction displayContinueButton($continueButton) {\n $continueButton.style.display = '';\n}\n\n/**\n * Hide Continue button\n * @param {Object} $continueButton Continue button js container\n */\nfunction hideContinueButon($continueButton) {\n $continueButton.style.display = 'none';\n}\n\n/**\n * Return \"true\" if buyer is authenticated\n * Needed on the Checkout Page only\n * @param {Object} $payPalAccountList PayPal account list js container\n * @returns {boolean} \"true\" in case if buyer is authenticated\n */\nfunction isBuyerAuthenticated($payPalAccountList) {\n return JSON.parse($payPalAccountList.dataset.customerAuthenticated);\n}\n\n/**\n * Select PayPal account tab\n * @param {Object} $payPalTab PayPal payment tab js container\n */\nfunction selectPayPalCheckoutTab($payPalTab) {\n $payPalTab.click();\n}\n\n/**\n * Set email in to corresponding input\n * @param {Object} $braintreePaypalEmail BT PayPal email input js container\n * @param {string} email Email\n */\nfunction setBraintreePayPalEmailInput($braintreePaypalEmail, email) {\n $braintreePaypalEmail.value = email;\n}\n\n/**\n * Returns whether the new PayPal account option is selected\n * @returns {boolean} Whether the new PayPal account option is selected\n */\nfunction isNewPayPalAccountOptionSelected() {\n var $payPalAccountList = document.querySelector('#braintreePaypalAccountsList');\n\n if ($payPalAccountList) {\n return $payPalAccountList.value === 'newaccount';\n }\n\n return false;\n}\n\n/**\n * Handles showing stored PP account in dropdown\n * Checks whether buyer has proceeded with the same email which is already stored\n * Triggered while tokenization callback and page reload\n * @param {boolean} buyerAuthenticated Whether customer is authenticated\n */\nfunction handleStoredAccountsShowing(buyerAuthenticated) {\n if (!buyerAuthenticated) {\n return;\n }\n\n // Get stored account by session account email\n var $storedAccountOptionWithSameEmail = billingFormHelper.getStoredAccountBySesionAccountEmail();\n\n // The buyer added an account with the same email address already in the buyer's wallet\n if ($storedAccountOptionWithSameEmail) {\n // Hide stored account with same email\n paypalCheckoutModelHelper.hideAccount($storedAccountOptionWithSameEmail);\n } else {\n // We need this to undo what was done by \"if\" statement\n paypalCheckoutModelHelper.displayAllStoredAccounts();\n }\n}\n\nmodule.exports = {\n isVaultModeEnabled,\n getAccountType,\n setNonceInputValue,\n hideSavePayPalAccountBlock,\n displaySavePayPalAccountBlock,\n displayPayPalButton,\n hidePayPalButon,\n displayContinueButton,\n hideContinueButon,\n isBuyerAuthenticated,\n selectPayPalCheckoutTab,\n setBraintreePayPalEmailInput,\n isNewPayPalAccountOptionSelected,\n handleStoredAccountsShowing,\n isOrderIntentEnabled\n};\n","'use strict';\n\nvar billingFormHelper = require('./payPalBillingFormHelperGlobal');\n\n/**\n * Remove product from Cart\n * @param {string} removeFromCartUrl Remove from Cart URL\n * @param {Object} productRepresentationObj Object with represent the product to remove from Cart\n */\nfunction removeProductFromCart(removeFromCartUrl, productRepresentationObj) {\n $.ajax({\n url: billingFormHelper.appendToUrl(removeFromCartUrl, productRepresentationObj),\n type: 'get',\n dataType: 'json'\n });\n}\n\nmodule.exports = {\n removeProductFromCart\n};\n","\n'use strict';\n\n/**\n * Add product to the Cart\n * @returns {Object} Response data from DW\n */\nfunction addProductToCart() {\n var $bundleItem = $('.bundle-item');\n\n function getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n }\n\n var pid = $('.product-detail:not(.bundle-item)').data('pid');\n var $btn = $('.braintree_pdp_button');\n var $productContainer = $btn.closest('.product-detail');\n\n var form = {\n pid: pid,\n quantity: $('.quantity-select').val()\n };\n\n if (!$bundleItem.length) {\n form.options = getOptions($productContainer);\n } else {\n var items = $bundleItem.map(function () {\n return {\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n };\n });\n form.childProducts = JSON.stringify(items.toArray());\n }\n\n var response = $.ajax({\n url: $('.add-to-cart-url').val(),\n method: 'POST',\n async: false,\n data: form\n }).responseJSON;\n response.pid = pid;\n return response;\n}\n\n/**\n * Get basket data\n * @param {string} url Braintree-GetOrderInfo URL\n * @returns {Promise} Promise with response from DW\n */\nfunction getBasketDataPromise(url) {\n return $.ajax({\n url: url,\n method: 'GET'\n });\n}\n\n/**\n * Get basket data\n * @param {string} url Braintree-GetOrderInfo URL\n * @returns {Object} Object with basket data from DW\n */\nfunction getBasketData(url) {\n return $.ajax({\n url: url,\n method: 'GET',\n async: false\n }).responseJSON;\n}\n\n/**\n * Submit payment (billing) data to the server\n * @param {string} submitPaymentUrl Submit payment URL\n * @param {FromData} billingFormData Billing Form Data\n * @param {string} redirectUrl Redirect URL after succesfull payment data submit\n * @param {Object} loader Loader\n * @param {Object} ErrorModelInstance Error Model instance\n * @returns {Promise} Promise with response result\n */\nfunction submitPaymentDataToServerPromise(submitPaymentUrl, billingFormData, redirectUrl, loader, ErrorModelInstance) {\n return $.ajax({\n type: 'POST',\n url: submitPaymentUrl,\n data: billingFormData,\n contentType: false,\n processData: false\n })\n .done(function (data) {\n if (data.error) {\n var errorMessage = '';\n\n if (data.fieldErrors.length) {\n data.fieldErrors.forEach(function (error, index) {\n var keys = Object.keys(error);\n if (keys.length) {\n errorMessage += `${keys[index].replace('dwfrm_billing_', '').replace('_', ' ')} ${data.fieldErrors[index][keys[index]]}. `;\n }\n });\n ErrorModelInstance.showErrorByMessage(errorMessage);\n }\n\n if (data.serverErrors.length) {\n data.serverErrors.forEach(function (error) {\n errorMessage += `${error}. `;\n });\n ErrorModelInstance.showErrorByMessage(errorMessage);\n }\n\n // Usually in case of any errors \"cartError\" will be \"true\"\n if (data.cartError) {\n window.location.href = data.redirectUrl;\n }\n loader.hide();\n } else {\n sessionStorage.setItem('pageState', 'cart');\n window.location.href = redirectUrl;\n loader.hide();\n }\n })\n .fail(function (err) {\n loader.hide();\n if (err && err.redirectUrl) {\n window.location.href = err.redirectUrl;\n }\n });\n}\n\nmodule.exports = {\n addProductToCart,\n getBasketDataPromise,\n getBasketData,\n submitPaymentDataToServerPromise\n};\n","'use strict';\n\nvar helper = require('../../helper');\n\nvar $btSavePaypalAccountContainer = document.querySelector('#braintreeSavePaypalAccountContainer');\nvar $paypalContent = document.querySelector('.js_braintree_paypalContent');\nvar $btPayPalBillingButton = document.querySelector('.js_braintree_paypal_billing_button');\n\n/**\n * Hides PayPal Smart Button functionality inside PayPal tab\n */\nfunction hidePaypalSmartButtonFunctionality() {\n $btSavePaypalAccountContainer.style.display = 'none';\n $btPayPalBillingButton.style.display = 'none';\n $paypalContent.setAttribute('data-paypal-is-hide-continue-button', false);\n}\n\n/**\n * Shows PayPal Smart Button functionality inside PayPal tab\n */\nfunction showPaypalSmartButtonFunctionality() {\n $btPayPalBillingButton.style.display = 'block';\n $paypalContent.setAttribute('data-paypal-is-hide-continue-button', true);\n}\n\n/**\n * Handles a behavior inside PayPal tab, when session PayPal account was deleted\n */\nfunction handlePaypalTabBehavior() {\n var $payPalAccountList = document.querySelector('#braintreePaypalAccountsList');\n var $defaultOption = helper.getOptionByDataDefault('#braintreePaypalAccountsList');\n var $selectedOption = helper.getSelectedOption($payPalAccountList);\n var isSelectedPaypalAccount = $selectedOption.value !== 'newaccount';\n var paypalButtonConfigs = JSON.parse($btPayPalBillingButton.getAttribute('data-braintree-config'));\n var isChangePmButton = paypalButtonConfigs.changePMButtonEnabled;\n\n // Case when buyer selected another PM (CC,GP..)\n if ($defaultOption && !isSelectedPaypalAccount) {\n // Shows ChangePM button if buyer has already saved PP account and ChangePM button is enabled\n if (isChangePmButton) {\n $btSavePaypalAccountContainer.style.display = 'block';\n\n showPaypalSmartButtonFunctionality();\n // Shows default PayPal account\n } else {\n $defaultOption.selected = true;\n\n hidePaypalSmartButtonFunctionality();\n }\n // Case when buyer selected PayPal account from paypalAccountList\n } else if (isSelectedPaypalAccount) {\n hidePaypalSmartButtonFunctionality();\n // Case when buyer does not have saved PayPal account\n } else {\n var $btUsedPayPalAccount = document.querySelector('.form-group.braintree_used_paypal_account');\n\n $btUsedPayPalAccount.classList.remove('used-paypal-account');\n $btUsedPayPalAccount.classList.add('used-paypal-account-hide');\n\n showPaypalSmartButtonFunctionality();\n }\n\n [].forEach.call($payPalAccountList, function (el) {\n if (el.style.display === 'none') el.style.display = 'block';\n });\n}\n\nmodule.exports = {\n handlePaypalTabBehavior,\n hidePaypalSmartButtonFunctionality,\n showPaypalSmartButtonFunctionality\n};\n","'use strict';\n\n/**\n * Append save PayPal account prop\n * @param {FormData} billingFormData billing FormData\n */\nfunction appendSavePayPalAccount(billingFormData) {\n billingFormData.append('braintreeSavePaypalAccount', true);\n}\n\n/**\n * Append payment data to the FromData\n * @param {FormData} formData billing FormData\n * @param {Object} payPalAccountData data from Bt\n */\nfunction appendPaymentDataToFormData(formData, payPalAccountData) {\n formData.append('paymentMethodUUID', payPalAccountData.uuid);\n}\n\nmodule.exports = {\n appendSavePayPalAccount,\n appendPaymentDataToFormData\n};\n","'use strict';\n\nvar PayPalBaseModel = require('./payPalBaseModel');\nvar helper = require('../../helper');\nvar payPalAccountModelHelper = require('../helpers/payPalAccountModelHelper');\nvar billingFormHelper = require('../helpers/payPalBillingFormHelperGlobal');\n\nfunction PayPalAccountModel(\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n addPayPalAccountUrl,\n $loaderContainer\n) {\n PayPalBaseModel.call(\n this,\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $loaderContainer\n );\n\n this.$csrfToken = $csrfToken;\n this.addPayPalAccountUrl = addPayPalAccountUrl;\n}\n\n// ES5 inheritance\nPayPalAccountModel.prototype = Object.create(PayPalBaseModel.prototype);\n\n/**\n * For whole description open \"payPalBaseModel\".\n * We don't generate and send fraud data from Account. That's why \"generateFraudData\" isn't used\n * @param {Object} payload Buyer data from PayPal (like address, nonce, etc.)\n */\nPayPalAccountModel.prototype.onApprovePaymentCallback = function (payload) {\n // Calling parrent method to proceed with PayPal payload validation\n var baseResponse = PayPalBaseModel.prototype.onApprovePaymentCallback.call(this, payload);\n\n // Error will be handled on BaseModel level\n if (baseResponse && baseResponse.error) {\n return;\n }\n\n this.loader.show();\n\n var payPalAccountModelInstance = this;\n var btDetails = payload.details;\n var nonce = payload.nonce;\n var email = payload.details.email;\n var $payPalButton = document.querySelector(this.payPalButtonSelector);\n var paypalAccountFormFields = $payPalButton.getAttribute('data-paypal-account-form-fields');\n var payPalBraintreeAddressData;\n var paypalAccountFormData;\n\n // Append Shippig/Billing data to FormData\n payPalBraintreeAddressData = billingFormHelper.createBillingAddressData(btDetails);\n paypalAccountFormData = helper.createPaymentFormData(paypalAccountFormFields, {\n nonce: nonce,\n email: email,\n addresses: JSON.stringify(payPalBraintreeAddressData),\n shippingAddress: JSON.stringify(payload.details.shippingAddress)\n });\n // Apped CSRF token\n billingFormHelper.appendCsrfTokenToFormData(paypalAccountFormData, this.$csrfToken);\n\n payPalAccountModelHelper.savePayPalAccount(this.addPayPalAccountUrl, paypalAccountFormData)\n .done(function (paymentData) {\n var renderAccountsUrl = paymentData.renderAccountsUrl;\n\n payPalAccountModelHelper.hidePaypalAccountBtn();\n\n payPalAccountModelHelper.renderPayPalAccounts(renderAccountsUrl)\n .done(function (accountListTemplate) {\n payPalAccountModelHelper.addPayPalAccountsToTheTemplate(accountListTemplate);\n payPalAccountModelHelper.initRemovePayPalAccountButtonsListners();\n payPalAccountModelHelper.throwCartUpade();\n\n payPalAccountModelInstance.loader.hide();\n });\n })\n .fail(function (errorPayload) {\n var error = errorPayload.responseJSON.error;\n\n payPalAccountModelInstance.errorHandlingModel.showErrorByMessage(error);\n payPalAccountModelInstance.loader.hide();\n });\n};\n\n/**\n * Triggers when buyer clicked on the PayPal button and PayPal modal started loading\n * @returns {Object} Object which will be passed directly into Braintree PayPal SDK as an order data\n */\nPayPalAccountModel.prototype.onOrderCreateCallback = function () {\n var payPalButtonConfigs = this.payPalConfigurations;\n var orderCreateParams = payPalButtonConfigs.options;\n\n // Hide custom error on buyer PayPal button click.\n this.errorHandlingModel.hideError();\n\n return {\n flow: orderCreateParams.flow,\n enableShippingAddress: orderCreateParams.enableShippingAddress,\n displayName: orderCreateParams.displayName,\n billingAgreementDescription: orderCreateParams.billingAgreementDescription\n };\n};\n\nmodule.exports = PayPalAccountModel;\n","'use strict';\n\n/* global Promise $ */\n\nvar braintreePayPalSDK = require('../braintreesdk/braintreePayPalSDK');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar requestsHelper = require('../helpers/payPalRequestsHelperGlobal');\n\nvar loaderInstance = require('../../loaderHelper');\n\n/**\n * PayPal base model constructor\n * @param {Object} errorHandlingModel error handling model\n * @param {Promise} btClientInstancePromise BT client instance promise\n * @param {string} payPalButtonSelector PayPal button selector\n * @param {Object} payPalConfigurations configs from server (taken from data attr)\n * @param {boolean} isVaultMode \"true\" in case if vault mode is enabled\n * @param {boolean} requestBillingAgreement \"true\" in case if billing agreement should be requested\n * @param {boolean} isFraudToolsEnabled \"true\" in case if fraud tools is enabled\n * @param {Object} $loaderContainer loader js container\n */\nfunction PayPalBaseModel(\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $loaderContainer\n) {\n this.isVaultMode = isVaultMode;\n this.requestBillingAgreement = requestBillingAgreement && isVaultMode;\n this.btClientInstancePromise = btClientInstancePromise;\n this.payPalButtonSelector = payPalButtonSelector;\n this.payPalConfigurations = payPalConfigurations;\n // Fraud data related\n this.isFraudToolsEnabled = isFraudToolsEnabled;\n // Setup init fraudData value for default case (default case: fraud data disabled)\n this.fraudDataPromise = Promise.resolve({ fraudDataCollectionDisabled: true });\n\n // URLs\n this.basketDataUrl = payPalConfigurations.getOrderInfoUrl;\n this.submitPaymentUrl = payPalConfigurations.paypalHandle;\n this.placeOrderStageUrl = payPalConfigurations.redirectUrl;\n\n this.braintreePayPalSDK = braintreePayPalSDK.payPalButtonRendering;\n\n this.errorHandlingModel = errorHandlingModel;\n this.basketData = null;\n this.loader = loaderInstance($loaderContainer);\n}\n\n/* -------------------- Payment Callbacks -------------------- */\n\n/**\n * Method triggers when buyer approved payment in PayPal modal and they passed succesfully\n * THIS METHOD NEEDS TO BE OVERRIDDEN in children class\n * @param {Object} payload buyer's data from PayPal\n * @returns {*} finish function execution\n */\nPayPalBaseModel.prototype.onApprovePaymentCallback = function (payload) {\n \n};\n\n/**\n * Method triggers when buyer canceled payment in PayPal modal\n * THIS METHOD CAN BE OVERRIDDEN in children class\n */\nPayPalBaseModel.prototype.onCancelPaymentCallback = function () {};\n\n/**\n * Method triggers when buyer clicked on PayPal button and PayPal modal is opening\n * THIS METHOD CAN BE OVERRIDDEN in children class\n * @returns {Object} Amount and Shipping address from basket\n */\nPayPalBaseModel.prototype.onOrderCreateCallback = function () {\n // Hide custom error on buyer PayPal button click.\n this.errorHandlingModel.hideError();\n\n // Get basket again in case if \"onPayPalButtonClickCallback\" wasn't triggered (Change Payment Method Button case)\n var basketData = this.basketData || requestsHelper.getBasketData(this.basketDataUrl);\n var basketShiippingAddress = basketData.shippingAddress;\n\n var payPalConfigurations = this.payPalConfigurations;\n var mainPayPalConfigurations = payPalConfigurations.options;\n var requestBillingAgreement = mainPayPalConfigurations.requestBillingAgreement;\n\n var paymentObjectData = {\n amount: basketData.amount,\n currency: mainPayPalConfigurations.currency,\n flow: mainPayPalConfigurations.flow,\n intent: mainPayPalConfigurations.intent,\n locale: mainPayPalConfigurations.locale,\n enableShippingAddress: mainPayPalConfigurations.enableShippingAddress,\n billingAgreementDescription: mainPayPalConfigurations.billingAgreementDescription,\n displayName: mainPayPalConfigurations.displayName\n };\n\n // \"requestBillingAgreement\" we be true when \"paupal_pay_later\" functionality will be enabled or when Checkout with Vault is enabled\n // Vault mode should be also enabled\n if (requestBillingAgreement) {\n paymentObjectData.requestBillingAgreement = requestBillingAgreement;\n\n if (mainPayPalConfigurations.billingAgreementDetails) {\n paymentObjectData.billingAgreementDetails = {\n description: mainPayPalConfigurations.billingAgreementDetails.description\n };\n }\n }\n\n // Case when process from PDP & Cart & Mini Cart & Checkout and basket isn't empty or we are on the Account Page\n if (basketShiippingAddress) {\n paymentObjectData.shippingAddressEditable = false;\n paymentObjectData.shippingAddressOverride = {\n line1: basketShiippingAddress.line1,\n line2: basketShiippingAddress.line2,\n city: basketShiippingAddress.city,\n state: basketShiippingAddress.state,\n postalCode: basketShiippingAddress.postalCode,\n countryCode: basketShiippingAddress.countryCode,\n phone: basketShiippingAddress.phone,\n recipientName: basketShiippingAddress.recipientName\n };\n }\n\n return paymentObjectData;\n};\n\n/**\n * Callback triggers when buyer clicked on PayPal button\n * @param {Object} _ first not used param\n * @param {Object} actions BT actions object\n */\n// eslint-disable-next-line no-unused-vars\nPayPalBaseModel.prototype.onPayPalButtonClickCallback = function (_, actions) {\n // Hide custom error on buyer PayPal button click.\n this.errorHandlingModel.hideError();\n this.basketData = requestsHelper.getBasketData(this.basketDataUrl);\n};\n\n/**\n * Method triggers when error happens during PayPal modal payment processing\n * THIS METHOD CAN BE OVERRIDDEN in children class\n * @param {Object} error error object with \"message\" and \"code\" inside\n */\nPayPalBaseModel.prototype.onErrorPaymentCallback = function (error) {\n this.errorHandlingModel.showErrorByObject(error);\n};\n\n/**\n * This method is executed when creating paypalCheckoutInstance. Should contain configs for \"braintree.paypalCheckout.create\" method.\n * Should only be used inside \"braintreePayPalSDK\" file\n * @param {Object} btClientInstance Braintree client instance\n * @returns {Object} object with additional configurations\n */\nPayPalBaseModel.prototype.payPalCheckoutInstanceConfigs = function (btClientInstance) {\n return {\n client: btClientInstance\n };\n};\n\n/**\n * This method is executed when loading PayPal SDK\n * @returns {Object} object with Checkout mode PayPal SDK configs\n */\nPayPalBaseModel.prototype.payPalCheckoutSdkConfigs = function () {\n var intent = this.payPalConfigurations.options.intent;\n var currency = this.payPalConfigurations.options.currency;\n var enableFundingList = this.payPalConfigurations.options.enableFundingList;\n var disableFundingList = this.payPalConfigurations.options.disableFundingList;\n var payPalSDKConfigObject = {\n intent: intent,\n currency: currency,\n components: 'buttons,messages',\n commit: false\n };\n\n if (enableFundingList !== undefined) {\n payPalSDKConfigObject['enable-funding'] = enableFundingList;\n }\n\n if (disableFundingList !== undefined) {\n payPalSDKConfigObject['disable-funding'] = disableFundingList;\n }\n\n return payPalSDKConfigObject;\n};\n\n/**\n * This method is executed when loading PayPal SDK\n * @returns {Object} object with Vault mode PayPal SDK configs\n */\nPayPalBaseModel.prototype.payPalVaultSdkConfigs = function () {\n var enableFundingList = this.payPalConfigurations.options.enableFundingList;\n var disableFundingList = this.payPalConfigurations.options.disableFundingList;\n var payPalVaultSdkConfigsObject = {\n vault: true,\n components: 'buttons,messages'\n };\n\n if (enableFundingList !== undefined) {\n payPalVaultSdkConfigsObject['enable-funding'] = enableFundingList;\n }\n\n if (disableFundingList !== undefined) {\n payPalVaultSdkConfigsObject['disable-funding'] = disableFundingList;\n }\n\n return payPalVaultSdkConfigsObject;\n};\n\n/* -------------------- Payment logic -------------------- */\n\n/**\n * Function which should be called when we need to init PayPal payment button\n * @returns {Promise} PayPal button\n */\nPayPalBaseModel.prototype.initPayment = function () {\n var CurrentPayPalPaymenProcessorModelInstance = this;\n var result;\n\n result = this.braintreePayPalSDK(\n this.btClientInstancePromise,\n this.isVaultMode,\n this.payPalConfigurations,\n this.payPalButtonSelector,\n CurrentPayPalPaymenProcessorModelInstance\n );\n\n return result;\n};\n\n/**\n * Generate fraud data if enabled\n */\nPayPalBaseModel.prototype.generateFraudData = function () {\n if (this.isFraudToolsEnabled) {\n this.fraudDataPromise = braintreeGeneral.collectFraudData(this.btClientInstancePromise);\n }\n // Don't need \"else\" case, since default value was inited in constructor\n};\n\nmodule.exports = PayPalBaseModel;\n","'use strict';\n\nvar PayPalExpressModel = require('./payPalExpressModel');\n\n/**\n * PayPal cart model constructor\n * @param {Object} errorHandlingModel error handling model\n * @param {Promise} btClientInstancePromise BT client instance promise\n * @param {string} payPalButtonSelector PayPal button selector\n * @param {Object} payPalConfigurations configs from server (taken from data attr)\n * @param {boolean} isVaultMode \"true\" in case if vault mode is enabled\n * @param {boolean} requestBillingAgreement \"true\" in case if billing agreement should be requested\n * @param {boolean} isFraudToolsEnabled \"true\" in case if fraud tools is enabled\n * @param {Object} $csrfToken CSRF token js container\n * @param {Object} $loaderContainer loader js container\n */\nfunction PayPalCartModel(\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n) {\n // Init PayPalExpressModel constructor\n PayPalExpressModel.call(\n this,\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n );\n}\n\n// ES5 inheritance\nPayPalCartModel.prototype = Object.create(PayPalExpressModel.prototype);\n\n// Show error in case if current basket has zero total price\nPayPalCartModel.prototype.onPayPalButtonClickCallback = function (_, actions) {\n PayPalExpressModel.prototype.onPayPalButtonClickCallback.call(this, _, actions);\n\n if (this.basketData.amount === 0) {\n this.errorHandlingModel.showZeroAmountOnCart();\n\n return actions.reject();\n }\n};\n\nmodule.exports = PayPalCartModel;\n","'use strict';\n\nvar PayPalBaseModel = require('./payPalBaseModel');\nvar helper = require('../../helper');\nvar payPalCheckoutModelHelper = require('../helpers/payPalCheckoutModelHelper');\nvar billingFormHelper = require('../helpers/payPalBillingFormHelperGlobal');\nvar paypalListHelper = require('../helpers/payPalListHelper');\n\n/**\n * PayPal checkout model constructor\n * @param {Object} errorHandlingModel error handling model\n * @param {Promise} btClientInstancePromise BT client instance promise\n * @param {string} payPalButtonSelector PayPal button selector\n * @param {Object} payPalConfigurations configs from server (taken from data attr)\n * @param {boolean} isVaultMode \"true\" in case if vault mode is enabled\n * @param {boolean} requestBillingAgreement \"true\" in case if billing agreement should be requested\n * @param {boolean} isFraudToolsEnabled \"true\" in case if fraud tools is enabled\n * @param {Object} $continueButton continue button js container\n * @param {number} totalAmount total basket amount\n * @param {Object} $loaderContainer loader js container\n */\nfunction PayPalCheckoutPaymentModel(\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $continueButton,\n totalAmount,\n $loaderContainer\n) {\n PayPalBaseModel.call(\n this,\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $loaderContainer\n );\n\n this.$continueButton = $continueButton;\n this.totalAmount = totalAmount;\n this.changePMButtonEnabled = payPalConfigurations.changePMButtonEnabled;\n}\n\n// ES5 inheritance\nPayPalCheckoutPaymentModel.prototype = Object.create(PayPalBaseModel.prototype);\n\n// For more details see same method from \"PayPalBaseModel\"\n// Add additional configs which are needed for \"Change Payment Method Button\" feature\nPayPalCheckoutPaymentModel.prototype.payPalCheckoutInstanceConfigs = function (btClientInstance) {\n var checkoutInstanceConfigs = PayPalBaseModel.prototype.payPalCheckoutInstanceConfigs.call(this, btClientInstance);\n\n if (this.changePMButtonEnabled) {\n checkoutInstanceConfigs.autoSetDataUserIdToken = true;\n }\n\n return checkoutInstanceConfigs;\n};\n\n// For more details see same method from \"PayPalBaseModel\"\n// Add additional configs which are needed for \"Change Payment Method Button\" feature\nPayPalCheckoutPaymentModel.prototype.payPalCheckoutSdkConfigs = function () {\n var payPalCheckoutSdkConfigs = PayPalBaseModel.prototype.payPalCheckoutSdkConfigs.call(this);\n\n if (this.changePMButtonEnabled) {\n payPalCheckoutSdkConfigs.dataAttributes = {\n amount: this.totalAmount\n };\n }\n\n return payPalCheckoutSdkConfigs;\n};\n\n// For more details see same method from \"PayPalBaseModel\"\n// Show error in case if current basket has zero total price\nPayPalCheckoutPaymentModel.prototype.onPayPalButtonClickCallback = function (_, actions) {\n PayPalBaseModel.prototype.onPayPalButtonClickCallback.call(this, _, actions);\n\n if (this.basketData.amount === 0) {\n this.errorHandlingModel.showZeroAmountOnCheckout();\n\n return actions.reject();\n }\n};\n\n// For more details see same method from \"PayPalBaseModel\"\n// Mark new account as the session one, fill billing form with data from paypal\nPayPalCheckoutPaymentModel.prototype.onApprovePaymentCallback = function (payload) {\n // Calling parrent method to proceed with PayPal payload validation\n var baseResponse = PayPalBaseModel.prototype.onApprovePaymentCallback.call(this, payload);\n\n // Error will be handled on BaseModel level\n if (baseResponse && baseResponse.error) {\n return;\n }\n\n this.loader.show();\n\n var PayPalCheckoutPaymentModelInstance = this;\n var isBuyerAuthenificated = PayPalCheckoutPaymentModelInstance.payPalConfigurations.isBuyerAuthenticated;\n var btDetails = payload.details;\n var nonce = payload.nonce;\n var email = payload.details.email;\n var btBillingAddress = btDetails.billingAddress ? btDetails.billingAddress : btDetails.shippingAddress;\n\n // Remove all other Payments session payments\n helper.removeActiveSessionPayment();\n\n // Hide PayPal buttons block\n payPalCheckoutModelHelper.hidePayPalButtons();\n\n // Fill just PayPal related form fields\n billingFormHelper.fillPayPalPaymentFields(btDetails);\n\n // Copy billing address from PayPal to DW billing address form fields\n if (btBillingAddress && btDetails) {\n billingFormHelper.copyPayPalBillingAddressToDw(btBillingAddress, btDetails);\n }\n\n // Make current PayPal account as a session account\n billingFormHelper.storePaymentAsSessionPayment(nonce, email);\n\n billingFormHelper.setSessionAccountOptionDefault();\n\n // Add billing address on session payment option level\n payPalCheckoutModelHelper.addBillingAddressOnPaymentOptionLevel(btDetails);\n\n // Check whether buyer has proceeded with the same email which is already stored\n // if \"yes\" we hide stored account with the same email in dropdown\n // if \"no\" we show all existent PP accounts in dropdown (stored + new session account)\n paypalListHelper.handleStoredAccountsShowing(isBuyerAuthenificated);\n\n\n // Gennerate and add fraud data in to the billing form\n PayPalCheckoutPaymentModelInstance.fraudDataPromise\n .then(function (data) {\n // We have \"fraudDataCollectionDisabled\" flag only in case if we have fraud data collection disabled\n if (!data.fraudDataCollectionDisabled) {\n billingFormHelper.fillFraudDataInput(data);\n }\n })\n .then(function () {\n // Submit payment to server\n PayPalCheckoutPaymentModelInstance.$continueButton.click();\n\n PayPalCheckoutPaymentModelInstance.loader.hide();\n });\n};\n\nmodule.exports = PayPalCheckoutPaymentModel;\n","'use strict';\n\nvar PayPalBaseModel = require('./payPalBaseModel');\nvar payPalExpressModelHelper = require('../helpers/payPalExpressModelHelper');\nvar billingFormHelper = require('../helpers/payPalBillingFormHelperGlobal');\nvar requestHelper = require('../helpers/payPalRequestsHelperGlobal');\n\n/**\n * PayPal express model constructor\n * @param {Object} errorHandlingModel error handling model\n * @param {Promise} btClientInstancePromise BT client instance promise\n * @param {string} payPalButtonSelector PayPal button selector\n * @param {Object} payPalConfigurations configs from server (taken from data attr)\n * @param {boolean} isVaultMode \"true\" in case if vault mode is enabled\n * @param {boolean} requestBillingAgreement \"true\" in case if billing agreement should be requested\n * @param {boolean} isFraudToolsEnabled \"true\" in case if fraud tools is enabled\n * @param {Object} $csrfToken CSRF token js container\n * @param {Object} $loaderContainer loader js container\n */\nfunction PayPalExpressModel(\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n) {\n // Init PayPalBaseModel constructor\n PayPalBaseModel.call(\n this,\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $loaderContainer\n );\n\n this.$csrfToken = $csrfToken;\n}\n\n// ES5 inheritance\nPayPalExpressModel.prototype = Object.create(PayPalBaseModel.prototype);\n\n\n// For more details see same method from \"PayPalBaseModel\"\n// Create and submit billing data to the server. Redirect on order reivew checkout step\nPayPalExpressModel.prototype.onApprovePaymentCallback = function (payload) {\n // Calling parrent method to proceed with PayPal payload validation\n var baseResponse = PayPalBaseModel.prototype.onApprovePaymentCallback.call(this, payload);\n\n // Error will be handled on BaseModel level\n if (baseResponse && baseResponse.error) {\n return;\n }\n\n this.loader.show();\n\n var PayPalExpressInstance = this;\n var payloadDetails = payload.details;\n var $payPalButtonWrapper = document.querySelector('.braintree-cart-paypal-buttons-wrap');\n var paypalCheckoutFormFields = JSON.parse($payPalButtonWrapper.getAttribute('data-paypal-checkout-form-fields'));\n var billingAddressData = billingFormHelper.createBillingAddressData(payloadDetails);\n var billingFromData;\n\n // Create form data only with billing address\n billingFromData = billingFormHelper.createBillingAddressFormData(paypalCheckoutFormFields, billingAddressData);\n\n billingFormHelper.appendCsrfTokenToFormData(billingFromData, PayPalExpressInstance.$csrfToken);\n\n // It will generate FFraud data only if it Fraud Data collection was enabled\n PayPalExpressInstance.fraudDataPromise\n .then(function (data) {\n if (!data.fraudDataCollectionDisabled) {\n billingFormHelper.appendFraudDataToFormData(billingFromData, data.deviceData);\n }\n })\n .then(function () {\n var shippingAddressData;\n\n // If shipping address was presented in PayPal payload, create a shipping address object,\n // stringify it and store in FormData as an input\n if (payloadDetails.shippingAddress) {\n shippingAddressData = payPalExpressModelHelper.createShippingAddressData(payloadDetails);\n\n payPalExpressModelHelper.appendShippingDataAsStringToFormData(billingFromData, shippingAddressData);\n }\n\n // Create a shipping address object, stringify it and store in FormData as an input\n billingFormHelper.appendBillingAddressAsStringToFormData(billingFromData, billingAddressData);\n\n billingFormHelper.appendEmailAsStringToFormData(billingFromData, payloadDetails.email);\n\n billingFormHelper.appendBtPaymentFieldsToFormData(billingFromData, payload);\n })\n .then(function () {\n // Submit customer form with email (CheckoutServices-SubmitCustomer)\n // as we skip step \"login via guest/registered user\" while express checkout\n // email is set only in case of guest checkout and if email is not already set\n payPalExpressModelHelper.submitCustomerForm(payloadDetails.email);\n })\n .then(function () {\n requestHelper.submitPaymentDataToServerPromise(\n PayPalExpressInstance.submitPaymentUrl,\n billingFromData,\n PayPalExpressInstance.placeOrderStageUrl,\n PayPalExpressInstance.loader,\n PayPalExpressInstance.errorHandlingModel\n );\n\n PayPalExpressInstance.loader.hide();\n });\n};\n\nmodule.exports = PayPalExpressModel;\n","'use strict';\n\nvar PayPalBaseModel = require('./payPalBaseModel');\nvar PayPalExpressModel = require('./payPalExpressModel');\nvar payPalProductPageModelHelper = require('../helpers/payPalProductPageModelHelper');\nvar requestsHelper = require('../helpers/payPalRequestsHelperGlobal');\n\n/**\n * PayPal product model constructor\n * @param {Object} errorHandlingModel error handling model\n * @param {Promise} btClientInstancePromise BT client instance promise\n * @param {string} payPalButtonSelector PayPal button selector\n * @param {Object} payPalConfigurations configs from server (taken from data attr)\n * @param {boolean} isVaultMode \"true\" in case if vault mode is enabled\n * @param {boolean} requestBillingAgreement \"true\" in case if billing agreement should be requested\n * @param {boolean} isFraudToolsEnabled \"true\" in case if fraud tools is enabled\n * @param {Object} $csrfToken CSRF token js container\n * @param {Object} $loaderContainer loader js container\n */\nfunction PayPalProductPageModel(\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n) {\n // Init PayPalExpressModel constructor\n PayPalExpressModel.call(\n this,\n errorHandlingModel,\n btClientInstancePromise,\n payPalButtonSelector,\n payPalConfigurations,\n isVaultMode,\n requestBillingAgreement,\n isFraudToolsEnabled,\n $csrfToken,\n $loaderContainer\n );\n}\n\n// ES5 inheritance\nPayPalProductPageModel.prototype = Object.create(PayPalExpressModel.prototype);\n\n// Dummy function to override default behavior and do not execute \"GetOrderInfo\" call.\n// Instead, we will get basket data inside \"onOrderCreateCallback\"\nPayPalProductPageModel.prototype.onPayPalButtonClickCallback = function () {};\n\n// Add product to the Cart\nPayPalProductPageModel.prototype.onOrderCreateCallback = function () {\n var orderData;\n var addProductToCartResponse = requestsHelper.addProductToCart();\n var basketDataUrl = this.basketDataUrl;\n\n this.basketData = requestsHelper.getBasketData(basketDataUrl);\n this.addedProductFromPdp = {\n uuid: addProductToCartResponse.pliUUID,\n pid: addProductToCartResponse.pid\n };\n this.removeFromCartUrl = addProductToCartResponse.cart.actionUrls.removeProductLineItemUrl;\n orderData = PayPalBaseModel.prototype.onOrderCreateCallback.call(this);\n\n return orderData;\n};\n\n// On error remove added product from Cart\nPayPalProductPageModel.prototype.onErrorPaymentCallback = function (error) {\n PayPalExpressModel.prototype.onErrorPaymentCallback.call(this, error);\n\n payPalProductPageModelHelper.removeProductFromCart(this.removeFromCartUrl, this.addedProductFromPdp);\n};\n\n// On cancel remove added product from Cart\nPayPalProductPageModel.prototype.onCancelPaymentCallback = function () {\n payPalProductPageModelHelper.removeProductFromCart(this.removeFromCartUrl, this.addedProductFromPdp);\n};\n\nmodule.exports = PayPalProductPageModel;\n","'use strict';\n\nvar payPalProductPage = require('./components/payPalProductPage');\nvar payPalMiniCartPage = require('./components/payPalMiniCartPage');\nvar payPalCartPage = require('./components/payPalCartPage');\nvar payPalAccountPage = require('./components/payPalAccountPage');\nvar payPalCheckoutPage = require('./components/payPalCheckoutPage');\n\nvar btClientInstancePromise;\n\n/**\n * Init PayPal functionality on PDP\n */\nfunction initProduct() {\n payPalProductPage.init(btClientInstancePromise);\n}\n\n/**\n * Init PayPal functionality on MiniCart\n */\nfunction initMiniCart() {\n // For MiniCart we generate client instance inside component.\n // This is, since general code which generate client instance executes before client token appear\n // This is only applicable for MiniCart\n payPalMiniCartPage.init();\n}\n\n/**\n * Init PayPal functionality on Cart\n */\nfunction initCart() {\n payPalCartPage.init(btClientInstancePromise);\n}\n\n/**\n * Init PayPal functionality on Checkout\n */\nfunction initCheckout() {\n payPalCheckoutPage.init(btClientInstancePromise);\n}\n\n/**\n * Init PayPal functionality on Account\n */\nfunction initAccount() {\n payPalAccountPage.init(btClientInstancePromise);\n}\n\n/**\n * Init general variables which are used on all pages\n * @param {Object} clientInstancePromise client instance promise\n */\nfunction init(clientInstancePromise) {\n btClientInstancePromise = clientInstancePromise;\n}\n\nmodule.exports = {\n init,\n initCheckout,\n initProduct,\n initMiniCart,\n initCart,\n initAccount\n};\n","'use strict';\n/* eslint-disable no-undef */\n/* global braintreeUtils braintree $ */\n\n/**\n * Creates visa checkout instance\n * @param {Promise} btClientInstancePromise BT Client Instance Promise\n * @returns {Promise} visaCheckoutInstance SRC instance\n */\nfunction createVisaCheckout(btClientInstancePromise) {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n return braintree.visaCheckout.create({\n client: btClientInstance\n });\n });\n}\n\n/**\n * Initialized SRC with options and pass payload data after tokenize\n * @param {Object} SrcBaseModelInstance Instance of SrcBaseModel or it's child classes\n * @returns {Promise} SRC button\n */\nfunction visaCheckoutInitialized(SrcBaseModelInstance) {\n var visaCheckoutInstancePromise = createVisaCheckout(SrcBaseModelInstance.clientInstancePromise);\n\n return visaCheckoutInstancePromise\n .then(function (visaCheckoutInstance) {\n var srcInitOptions = visaCheckoutInstance.createInitOptions(SrcBaseModelInstance.getInitOptionsObject());\n\n V.init(srcInitOptions);\n\n // Event which is triggered when payment successfully completed on SRC end\n V.on('payment.success', function (payment) {\n visaCheckoutInstance.tokenize(payment).then(function (payload) {\n SrcBaseModelInstance.onTokenizeCallback(payload);\n });\n });\n V.on('payment.error', function (_, error) {\n SrcBaseModelInstance.errorHandlingModel.srcErrorHandler(error);\n });\n V.on('payment.cancel', function (payment) {\n if (payment.error) {\n SrcBaseModelInstance.errorHandlingModel.srcErrorHandler(\n SrcBaseModelInstance.errorHandlingModel.errorMessages.CLIENT_GATEWAY_NETWORK\n );\n }\n });\n });\n}\n\nmodule.exports = {\n visaCheckoutInitialized\n};\n","'use strict';\n\nvar loaderInstance = require('../../loaderHelper');\nvar srcHelper = require('../helpers/srcHelper');\nvar creditCardVaultManager = require('../../creditcard/components/creditCardVaultManager');\n\n// Models\nvar ErrorHandlingBaseModel = require('../errorhandler/errorHandlingBaseModel');\nvar SrcAccountModel = require('../models/srcAccountModel');\n\nvar $braintreeSrcLoader = document.querySelector('.braintreeSrcLoader');\nvar $braintreeSrcButton = document.querySelector('.js_braintree_src_account_button');\n\n/**\n * Inits SRC account functionality on the Account Page\n * @param {Promise} clientInstancePromise client instance promise\n */\nfunction init(clientInstancePromise) {\n var srcButtonConfigurations = srcHelper.getBraintreeSRCButtonConfigs();\n var $braintreeSrcDeviceDataInput = null;\n var srcLoader = loaderInstance($braintreeSrcLoader);\n var errorHandlingBaseModel = new ErrorHandlingBaseModel(srcButtonConfigurations.messages);\n\n var SrcAccountModelInstance = new SrcAccountModel(\n clientInstancePromise,\n srcButtonConfigurations,\n $braintreeSrcDeviceDataInput,\n srcLoader,\n errorHandlingBaseModel\n );\n\n // Hides errors on the Account Page\n $braintreeSrcButton.addEventListener('click', errorHandlingBaseModel.hideError);\n\n creditCardVaultManager.removeFromDomCardsWhichAreNotInVaultMgr(clientInstancePromise);\n SrcAccountModelInstance.initSrcButton();\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar srcHelper = require('../helpers/srcHelper');\nvar loaderInstance = require('../../loaderHelper');\n\n// Models\nvar SrcCartModel = require('../models/srcCartModel');\nvar ErrorHandlingCartModel = require('../errorhandler/errorHandlingCartModel');\n\nvar $braintreeCartSrcButton = document.querySelector('.braintree-cart-src-button');\n\n/**\n * Inits SRC account functionality on the Cart Page\n * @param {Promise} clientInstancePromise client instance promise\n */\nfunction init(clientInstancePromise) {\n var $braintreeSrcLoader = document.querySelector('.braintreeSrcLoader');\n var $totalAmount = document.querySelector('.grand-total');\n var srcLoader = loaderInstance($braintreeSrcLoader);\n var srcButtonConfigurations = srcHelper.getBraintreeSRCButtonConfigs();\n var $braintreeSrcDeviceDataInput = document.querySelector('input[name=braintreeSrcDeviceDataInput]');\n var errorHandlingCartModel = new ErrorHandlingCartModel(srcButtonConfigurations.messages);\n\n var SrcCheckoutModelInstance = new SrcCartModel(\n clientInstancePromise,\n srcButtonConfigurations,\n $braintreeSrcDeviceDataInput,\n srcLoader,\n errorHandlingCartModel\n );\n\n // Hides errors on the Cart Page\n $braintreeCartSrcButton.addEventListener('click', errorHandlingCartModel.hideError);\n\n SrcCheckoutModelInstance.initSrcButton();\n\n // Tracks cases when total amount equal zero and throw an error\n srcHelper.zeroAmountSrcButtonBehavior($totalAmount, errorHandlingCartModel);\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar srcHelper = require('../helpers/srcHelper');\nvar loaderInstance = require('../../loaderHelper');\n\n// Models\nvar SrcCheckoutModel = require('../models/srcCheckoutModel');\nvar ErrorHandlingCheckoutModel = require('../errorhandler/errorHandlingCheckoutModel');\n\nvar $braintreeBillingPageSrcButton = document.querySelector('.braintree-billingpage-src-button');\n\n/**\n * Inits SRC account functionality on the Checkout Page\n * @param {Promise} clientInstancePromise client instance promise\n */\nfunction init(clientInstancePromise) {\n var $braintreeSrcLoader = document.querySelector('.braintreeSrcLoader');\n var $totalAmount = document.querySelector('.grand-total-sum');\n var srcLoader = loaderInstance($braintreeSrcLoader);\n var srcButtonConfigurations = srcHelper.getBraintreeSRCButtonConfigs();\n var $braintreeSrcDeviceDataInput = document.querySelector('input[name=braintreeSrcDeviceDataInput]');\n var errorHandlingCheckoutModel = new ErrorHandlingCheckoutModel(srcButtonConfigurations.messages);\n\n\n var SrcCheckoutModelInstance = new SrcCheckoutModel(\n clientInstancePromise,\n srcButtonConfigurations,\n $braintreeSrcDeviceDataInput,\n srcLoader,\n errorHandlingCheckoutModel\n );\n\n // Hides errors on the Checkout/Billing Page\n $braintreeBillingPageSrcButton.addEventListener('click', errorHandlingCheckoutModel.hideError);\n\n SrcCheckoutModelInstance.initSrcButton();\n\n // Tracks cases when total amount equal zero and throw an error\n srcHelper.zeroAmountSrcButtonBehavior($totalAmount, errorHandlingCheckoutModel);\n\n // Click SRC tab if session payment ID is SRC and session account value is filled\n // in case of checkout through saved SRC card session payment id will be SRC\n // but session account value will be empty\n var sessionPaymentMethodId = srcButtonConfigurations.sessionPaymentMethodId;\n var isSrcSessionAccountExist = document.querySelector('#sessionSrcAccount').value !== '';\n\n if (sessionPaymentMethodId === 'SRC' && isSrcSessionAccountExist) {\n document.querySelector('.src-tab').click();\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar srcHelper = require('../helpers/srcHelper');\nvar srcListHelper = require('../helpers/srcListHelper');\n\n/**\n * Inits SRC list functionality\n */\nfunction init() {\n var $srcAccountList = document.querySelector('#braintreeSrcAccountsList');\n var srcListExist = Boolean($srcAccountList);\n\n if (srcListExist) {\n srcListHelper.srsListStateHandler();\n\n $srcAccountList.addEventListener('change', function () {\n srcHelper.srcContentTabHandler(true);\n });\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n// Helpers\nvar helper = require('../../helper');\nvar srcListHelper = require('../helpers/srcListHelper');\nvar srcHelper = require('../helpers/srcHelper');\n\nvar $srcSessionAccount = document.querySelector('#sessionSrcAccount');\nvar $srcButton = document.querySelector('.js_braintree_src_button');\nvar $accountListBlock = document.querySelector('.braintree_used_src_account');\nvar $srcCardDescription = document.querySelector('#braintreeSrcCardDescription');\nvar $braintreeSrcCardType = document.querySelector('#braintreeSrcCardType');\nvar $braintreeSrcLastFourDigits = document.querySelector('#braintreeSrcLastFourDigits');\nvar $braintreeSrcCreditCardNumber = document.querySelector('#braintreeSrcCreditCardNumber');\n/**\n * Shows used session account(card) in dropdown and handles checkout view\n * @param {Object} srcPayload payload with card data from tokenization\n */\nfunction showSrcSessionAccount(srcPayload) {\n // description of used card(ex. Visa ending in 1111)\n var cardDescription = srcPayload.details.cardType + ' ' + srcPayload.description;\n\n $srcSessionAccount.value = cardDescription;\n $srcSessionAccount.text = cardDescription;\n $srcCardDescription.value = cardDescription;\n $srcSessionAccount.selected = true;\n $accountListBlock.style.display = 'block';\n $srcButton.style.display = 'none';\n\n // Inputs required for identifying already saved cards\n $braintreeSrcCardType.value = srcPayload.details.cardType;\n $braintreeSrcLastFourDigits.value = srcPayload.details.lastFour;\n $braintreeSrcCreditCardNumber.value = '************' + srcPayload.details.lastFour;\n\n srcListHelper.handleSaveSrcAccountCheckbox($srcSessionAccount, true);\n srcListHelper.setIsHideContinueButtonAttr(false);\n helper.continueButtonToggle(false);\n}\n\n/*\n* Removes method was used and changes appearance of SRC tab\n**/\nfunction removeSessionNonce() {\n $srcSessionAccount.value = '';\n $srcSessionAccount.text = '';\n $accountListBlock.style.display = 'none';\n $srcSessionAccount.setAttribute('data-save', false);\n\n document.querySelector('#braintreeSRCNonce').value = '';\n document.querySelector('#braintreeSrcBillingAddress').value = '';\n document.querySelector('#braintreeSrcCardDescription').value = '';\n document.querySelector('#newSrcAccount').selected = true;\n\n srcHelper.srcContentTabHandler(false);\n}\n\nmodule.exports = {\n showSrcSessionAccount,\n removeSessionNonce\n};\n","'use strict';\n\nmodule.exports = {\n FLOW_NAME_ACCOUNT: 'account',\n FLOW_NAME_CART_CHECKOUT: 'cart',\n FLOW_NAME_BILLING_CHECKOUT: 'billing'\n};\n","'use strict';\n\n/**\n * Error Handling constructor\n * @param {Object} errorMessages object with error messages\n */\nfunction ErrorHandlingBaseModel(errorMessages) {\n this.errorMessages = errorMessages;\n}\n\n/**\n * ---- General method which should be used for cases when error came from Braintree ----\n * Show error notification by error Object from BT\n * @param {Object} error error object from Bt\n */\nErrorHandlingBaseModel.prototype.showErrorByObject = function (error) {\n var msg = error.message;\n var code = error.code;\n var errorMessage = this.errorMessages[code] || msg || this.errorMessages.CLIENT_GATEWAY_NETWORK;\n\n this.createErrorNotification(errorMessage);\n};\n\n/**\n * ---- General method which should be used for cases when error came from Braintree ----\n * Show error notification by message\n * @param {string} message message to display inside error notification\n */\nErrorHandlingBaseModel.prototype.showErrorByMessage = function (message) {\n this.createErrorNotification(message);\n};\n\n/**\n * ---- Error container which will be used on Account ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Method responsible for Error Notification generation\n * @param {string} message message to display inside error notification\n */\nErrorHandlingBaseModel.prototype.createErrorNotification = function (message) {\n var $errorContainer = $('.error-messaging');\n\n var errorHtml = '
' +\n '' + message + '
';\n\n $errorContainer.append(errorHtml);\n $errorContainer.show();\n window.scrollTo(0, 0);\n};\n\n/**\n * ---- Method which should hide error container and make it empty. On Account we use this one ----\n * ---- For all other cases this method will be overwritten by corresponding one ----\n *\n * Hide error notification\n */\nErrorHandlingBaseModel.prototype.hideError = function () {\n var $errorContainer = $('.error-messaging');\n\n $errorContainer.hide();\n $errorContainer.empty();\n};\n\n/**\n * Handles SRC error by types\n * @param {Object} error Error object or error message\n */\nErrorHandlingBaseModel.prototype.srcErrorHandler = function (error) {\n if (error.name === 'BraintreeError') {\n this.showErrorByObject(error);\n } else {\n this.showErrorByMessage(error.message || error);\n }\n};\n\nmodule.exports = ErrorHandlingBaseModel;\n","'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling Cart model constructor\n * @param {Object} errorMessages object with error messages\n */\nfunction ErrorHandlingCartModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.errorMessages = errorMessages;\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingCartModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCartModel.prototype.createErrorNotification = function (message) {\n var $errorContainer = $('.cart-error-messaging');\n\n $('.checkout-btn').addClass('disabled');\n $errorContainer.append(\n `
\n \n ${message}\n
`\n );\n\n $errorContainer.show();\n window.scrollTo(0, 0);\n};\n\n// Shows an error when the value of the total amount on the Card is 0\nErrorHandlingCartModel.prototype.showZeroAmountOnCart = function () {\n ErrorHandlingCartModel.prototype.createErrorNotification(this.errorMessages.CUSTOM_SRC_ZERO_AMOUNT_ERROR);\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCartModel.prototype.hideError = function () {\n var $errorContainer = $('.cart-error-messaging');\n\n $errorContainer.hide();\n $errorContainer.empty();\n};\n\n/**\n * Shows cart error in core error container\n * @param {Object} data error data\n */\nErrorHandlingCartModel.prototype.handleCheckoutFromCartError = function (data) {\n var errorMessage = '';\n\n if (data.fieldErrors.length) {\n data.fieldErrors.forEach(function (error, index) {\n var keys = Object.keys(error);\n\n if (keys.length) {\n errorMessage += `${keys[index].replace('dwfrm_billing_', '').replace('_', ' ')} ${data.fieldErrors[index][keys[index]]}. `;\n }\n });\n\n this.showErrorByMessage(errorMessage);\n }\n\n if (data.serverErrors.length) {\n data.serverErrors.forEach(function (error) {\n errorMessage += `${error}. `;\n });\n\n this.showErrorByMessage(errorMessage);\n }\n\n if (data.cartError) {\n window.location.href = data.redirectUrl;\n }\n};\n\nmodule.exports = ErrorHandlingCartModel;\n","'use strict';\n\nvar ErrorHandlingBaseModel = require('./errorHandlingBaseModel');\n\n/**\n * Error Handling Checkout model constructor\n * @param {Object} errorMessages object with error messages\n */\nfunction ErrorHandlingCheckoutModel(errorMessages) {\n ErrorHandlingBaseModel.call(this, errorMessages);\n\n this.errorMessages = errorMessages;\n}\n\n/**\n * ES5 inheritance\n */\nErrorHandlingCheckoutModel.prototype = Object.create(ErrorHandlingBaseModel.prototype);\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.hideError = function () {\n var $topErrorMessageText = document.querySelector('.error-message-text');\n var $topErrorMessageWrapper = document.querySelector('.error-message');\n\n $topErrorMessageWrapper.style.display = 'none';\n $topErrorMessageText.innerHTML = '';\n};\n\n// See corresponding method inside \"ErrorHandlingBaseModel\" model\nErrorHandlingCheckoutModel.prototype.createErrorNotification = function (message) {\n var $topErrorMessageText = document.querySelector('.error-message-text');\n var $topErrorMessageWrapper = document.querySelector('.error-message');\n\n $topErrorMessageText.textContent = '';\n $topErrorMessageText.append(message);\n\n $topErrorMessageWrapper.style.display = 'block';\n window.scrollTo(0, 0);\n};\n\n// Shows an error when the value of the total amount on the Checkout is 0\nErrorHandlingCheckoutModel.prototype.showZeroAmountOnCheckout = function () {\n ErrorHandlingCheckoutModel.prototype.createErrorNotification(this.errorMessages.CUSTOM_SRC_ZERO_AMOUNT_ERROR);\n};\n\nmodule.exports = ErrorHandlingCheckoutModel;\n","'use strict';\n\n/**\n * Shows a zero amount SRC button and hides a normal SRC button\n */\nfunction showZeroAmountSrcButton() {\n $('.v-button-zero-amount').show();\n $('.v-button').hide();\n}\n\n/**\n * Hides a zero amount SRC button and show a normal SRC button\n */\nfunction hideZeroAmountSrcButton() {\n $('.v-button-zero-amount').hide();\n $('.v-button').show();\n}\n\n/**\n * Handles whether show or hide zero amount SRC button\n * @param {number} totalAmount Total amount of order\n */\nfunction handleZeroAmountButtonVisibility(totalAmount) {\n if (totalAmount === 0) {\n showZeroAmountSrcButton();\n } else {\n hideZeroAmountSrcButton();\n }\n}\n\n/**\n * Adds event listener to the zero amount button on the Cart Page\n * @param {DOMElement} $zeroAmountButton DOM element of zero amount SRC button\n * @param {Object} errorHandlingModel Checkout error handling model\n */\nfunction addZeroAmountButtonEventListenerOnCart($zeroAmountButton, errorHandlingModel) {\n $zeroAmountButton.addEventListener('click', () => {\n errorHandlingModel.hideError();\n errorHandlingModel.showZeroAmountOnCart();\n });\n}\n\n/**\n * Adds event listener to the zero amount SRC button on the Checkout Page\n * @param {DOMElement} $zeroAmountButton DOM element of zero amount SRC button\n * @param {Object} errorHandlingModel Checkout error handling model\n */\nfunction addZeroAmountButtonEventListenerOnCheckout($zeroAmountButton, errorHandlingModel) {\n $zeroAmountButton.addEventListener('click', () => {\n errorHandlingModel.hideError();\n errorHandlingModel.showZeroAmountOnCheckout();\n });\n}\n\n/**\n * Creates a mutation obserber for total amount element\n * @param {DOMElement} totalAmountElement DOM Element that includes the total cost\n */\nfunction initTotalAmountElementObserver(totalAmountElement) {\n var config = { attributes: true, childList: true, subtree: true };\n\n var observer = new MutationObserver((element) => {\n var totalAmount = Number.parseFloat(element[0].target.textContent.slice(1));\n\n // Handles whether show or hide zero amount SRC button\n handleZeroAmountButtonVisibility(totalAmount);\n });\n\n observer.observe(totalAmountElement, config);\n}\n\nmodule.exports = {\n initTotalAmountElementObserver: initTotalAmountElementObserver,\n addZeroAmountButtonEventListenerOnCheckout: addZeroAmountButtonEventListenerOnCheckout,\n addZeroAmountButtonEventListenerOnCart: addZeroAmountButtonEventListenerOnCart,\n hideZeroAmountSrcButton: hideZeroAmountSrcButton,\n showZeroAmountSrcButton: showZeroAmountSrcButton,\n handleZeroAmountButtonVisibility: handleZeroAmountButtonVisibility\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar srcListHelper = require('./srcListHelper');\nvar srcButtonHelper = require('./srcButtonHelper');\n\n/**\n * Returns Braintree SRC configs\n * @returns {Object} Braintree SRC configs\n */\nfunction getBraintreeSRCButtonConfigs() {\n var braintreeSrcButtonConfigs = null;\n var $srcButton = document.querySelector('.js_braintree_src_button') || document.querySelector('.js_braintree_src_account_button');\n\n try {\n braintreeSrcButtonConfigs = JSON.parse($srcButton.getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeSrcButtonConfigs;\n }\n\n return braintreeSrcButtonConfigs;\n}\n\n/**\n * Returns stringified SRC shipping address\n * @param {Object} shippingData SRC shipping\n * @returns {string} stringified shipping address\n */\nfunction createSrcShippingAddressData(shippingData) {\n var shippingAddress = {};\n shippingAddress.recipientName = shippingData.firstName + ' ' + shippingData.lastName;\n shippingAddress.phone = shippingData.phoneNumber;\n shippingAddress.countryCodeAlpha2 = shippingData.countryCode;\n shippingAddress.streetAddress = shippingData.streetAddress;\n shippingAddress.extendedAddress = shippingData.extendedAddress;\n shippingAddress.locality = shippingData.locality;\n shippingAddress.region = shippingData.region;\n shippingAddress.postalCode = shippingData.postalCode;\n\n return JSON.stringify(shippingAddress);\n}\n\n/**\n * Returns stringified SRC billing address\n * @param {Object} billingData SRC billing\n * @param {Object} userData user data with email\n * @returns {string} stringified billing address\n */\nfunction createSrcBillingAddress(billingData, userData) {\n var srcBillingAddress = {};\n srcBillingAddress.recipientName = billingData.firstName + ' ' + billingData.lastName;\n srcBillingAddress.phone = billingData.phoneNumber;\n srcBillingAddress.countryCodeAlpha2 = billingData.countryCode;\n srcBillingAddress.streetAddress = billingData.streetAddress;\n srcBillingAddress.extendedAddress = billingData.streetAddress;\n srcBillingAddress.locality = billingData.locality;\n srcBillingAddress.region = billingData.region;\n srcBillingAddress.postalCode = billingData.postalCode;\n srcBillingAddress.email = userData.userEmail;\n\n return JSON.stringify(srcBillingAddress);\n}\n\n/**\n * Creates SRC checkout form data\n * @param {Object} srcCheckoutFormData SRC form data\n * @param {Object} srcResponseData payload from SRC\n * @returns {Object} SRC Checkout Form with appended SRC data\n */\nfunction createSrcCheckoutFormData(srcCheckoutFormData, srcResponseData) {\n var csrfToken = document.querySelector('.braintree-cart-buttons-wrap #csrf_token');\n\n var cardDescription = srcResponseData.details.cardType + ' ' + srcResponseData.description;\n var deviceData = document.querySelector('input[name=braintreeSrcDeviceDataInput]').value;\n var shippingAddressData = createSrcShippingAddressData(srcResponseData.shippingAddress);\n\n srcCheckoutFormData.append(csrfToken.name, csrfToken.value);\n srcCheckoutFormData.append('braintreeSrcNonce', srcResponseData.nonce);\n srcCheckoutFormData.append('braintreeSrcDeviceDataInput', deviceData);\n srcCheckoutFormData.append('braintreeSrcShippingAddress', shippingAddressData || '{}');\n srcCheckoutFormData.append('braintreeSrcCardDescription', cardDescription);\n srcCheckoutFormData.append('braintreeSrcCardType', srcResponseData.details.cardType);\n srcCheckoutFormData.append('braintreeSrcCreditCardNumber', '************' + srcResponseData.details.lastFour);\n\n return srcCheckoutFormData;\n}\n\n/**\n * Creates SRC form data\n * @param {Object} responseData data received after SRC tokenize\n * @param {string} paymentMethodName SRC payment method name\n * @returns {Object} SRC payment form data\n */\nfunction createSrcFormData(responseData, paymentMethodName) {\n var srcData = {};\n var checkoutFormFields = document.querySelector('.braintree-cart-buttons-wrap').getAttribute('data-checkout-form-fields');\n\n srcData.firstName = responseData.userData.userFirstName;\n srcData.lastName = responseData.userData.userLastName;\n srcData.address1 = responseData.billingAddress.streetAddress;\n srcData.address2 = responseData.billingAddress.extendedAddress || '';\n srcData.city = responseData.billingAddress.locality;\n srcData.postalCode = responseData.billingAddress.postalCode;\n srcData.stateCode = responseData.billingAddress.region;\n srcData.country = responseData.billingAddress.countryCode;\n srcData.email = responseData.userData.userEmail;\n srcData.phone = responseData.billingAddress.phoneNumber;\n srcData.paymentMethod = paymentMethodName;\n\n return helper.createPaymentFormData(checkoutFormFields, srcData);\n}\n\n/**\n * Updates Storefront billing data form with SRC data\n * @param {Object} srcBillingData SRC billing address data/phone/email\n */\nfunction updateStorefrontBillingData(srcBillingData) {\n var storefrontBillingData = JSON.parse(document.querySelector('.braintree-billing-payment-wrap').getAttribute('data-billing-form-fields-names'));\n storefrontBillingData.dwfrm_billing_addressFields_firstName = srcBillingData.firstName;\n storefrontBillingData.dwfrm_billing_addressFields_lastName = srcBillingData.lastName;\n storefrontBillingData.dwfrm_billing_addressFields_address1 = srcBillingData.streetAddress;\n storefrontBillingData.dwfrm_billing_addressFields_address2 = srcBillingData.extendedAddress || '';\n storefrontBillingData.dwfrm_billing_addressFields_city = srcBillingData.locality;\n storefrontBillingData.dwfrm_billing_addressFields_postalCode = srcBillingData.postalCode;\n storefrontBillingData.dwfrm_billing_addressFields_states_stateCode = srcBillingData.region;\n storefrontBillingData.dwfrm_billing_addressFields_country = srcBillingData.countryCode;\n storefrontBillingData.dwfrm_billing_contactInfoFields_email = srcBillingData.email;\n storefrontBillingData.dwfrm_billing_contactInfoFields_phone = srcBillingData.phoneNumber;\n\n helper.updateBillingFormValues(storefrontBillingData);\n}\n\n/**\n * Handles all behavior related to the src content tab\n * SRC list (dropdown) change - actions for new/session account showing\n * @param {bollean} isSrcTabActive Whether Src tab is active\n */\nfunction srcContentTabHandler(isSrcTabActive) {\n var $srcAccountList = document.querySelector('#braintreeSrcAccountsList');\n var srcOptionId = $srcAccountList.value;\n var $srcButton = document.querySelector('.js_braintree_src_button');\n var $srcZeroAmountButton = document.querySelector('.braintree-billingpage-src-button-zero-amount');\n var $alertInfo = document.querySelector('.billingAddressInfoAlert');\n var $srcSessionAccount = document.querySelector('#sessionSrcAccount');\n\n switch (srcOptionId) {\n case 'newaccount':\n $srcButton.style.display = 'block';\n $srcZeroAmountButton.style.display = 'block';\n $alertInfo.style.display = 'block';\n\n if (isSrcTabActive) {\n helper.continueButtonToggle(true);\n }\n\n srcListHelper.setIsHideContinueButtonAttr(true);\n // Case when registered user and vaulting is enabled\n srcListHelper.handleSaveSrcAccountCheckbox($srcSessionAccount, true);\n break;\n default:\n $srcButton.style.display = 'none';\n $srcZeroAmountButton.style.display = 'none';\n $alertInfo.style.display = 'none';\n\n helper.continueButtonToggle(false);\n srcListHelper.setIsHideContinueButtonAttr(false);\n // Case when registered user and vaulting is enabled\n srcListHelper.handleSaveSrcAccountCheckbox($srcSessionAccount, JSON.parse($srcSessionAccount.getAttribute('data-save')));\n }\n}\n\n/**\n * Treats the behavior of the SRC button in the SRC tab based on the total cost\n * Shows/hides the required SRC button if the total value is/isn't 0\n * @param {DOMElement} totalAmountElement DOM Element that includes the total cost\n * @param {Object} errorHandlingModel ErrorHandling cart or checkout model\n */\nfunction zeroAmountSrcButtonBehavior(totalAmountElement, errorHandlingModel) {\n var $braintreeCartZeroAmountSrcButton = document.querySelector('.braintree-cart-src-button-zero-amount');\n var $braintreeBillingPageZeroAmountSrcButton = document.querySelector('.braintree-billingpage-src-button-zero-amount');\n var totalAmount = Number.parseFloat(totalAmountElement.textContent.slice(1));\n\n // Add event listener for cart zero amount button\n if ($braintreeCartZeroAmountSrcButton) {\n srcButtonHelper.addZeroAmountButtonEventListenerOnCart($braintreeCartZeroAmountSrcButton, errorHandlingModel);\n }\n\n // Add event listener for checkout zero amount button\n if ($braintreeBillingPageZeroAmountSrcButton) {\n srcButtonHelper.addZeroAmountButtonEventListenerOnCheckout($braintreeBillingPageZeroAmountSrcButton, errorHandlingModel);\n }\n\n // Handles whether show or hide zero amount button\n srcButtonHelper.handleZeroAmountButtonVisibility(totalAmount);\n\n // Creates a mutation obserber for total amount element\n srcButtonHelper.initTotalAmountElementObserver(totalAmountElement);\n}\n\nmodule.exports = {\n getBraintreeSRCButtonConfigs,\n createSrcShippingAddressData,\n createSrcBillingAddress,\n createSrcFormData,\n updateStorefrontBillingData,\n srcContentTabHandler,\n createSrcCheckoutFormData,\n zeroAmountSrcButtonBehavior\n};\n","var helper = require('../../helper');\n\nvar $srcAccountList = document.querySelector('#braintreeSrcAccountsList');\nvar $srcButton = document.querySelector('.js_braintree_src_button');\nvar $accoutnListBlock = document.querySelector('.braintree_used_src_account');\nvar $alertInfo = document.querySelector('.billingAddressInfoAlert');\nvar $saveSRCAccountCheckbox = document.querySelector('#braintreeSaveSRCAccount');\nvar $saveSRCAccountCheckboxContainter = document.querySelector('#braintreeSaveSRCContainer');\n\n/**\n * Sets value to data-paypal-is-hide-continue-button attribute\n * @param {boolean} value true/false\n */\nfunction setIsHideContinueButtonAttr(value) {\n var $srcContent = document.querySelector('.js_braintree_srcContent');\n\n $srcContent.setAttribute('data-paypal-is-hide-continue-button', value);\n}\n\n/**\n * Handles actions based on selected value in SRC dropdown for checkout view\n */\nfunction srsListStateHandler() {\n var srcOptionId = $srcAccountList.value;\n switch (srcOptionId) {\n case 'newaccount':\n\n if ($alertInfo) {\n $alertInfo.style.display = 'block';\n }\n\n $accoutnListBlock.style.display = 'none';\n break;\n default:\n $srcButton.style.display = 'none';\n\n if ($alertInfo) {\n $alertInfo.style.display = 'none';\n }\n\n helper.continueButtonToggle(false);\n setIsHideContinueButtonAttr(false);\n }\n}\n\n/**\n * Get stored card by card type and last four digits\n * @param {string} cardType card type\n * @param {string} lastFour last four card digits\n * @returns {Object} jquery object of found stored card\n */\nfunction getStoredCardByData(cardType, lastFour) {\n var $foundCard;\n\n $('.js_stored_card').each(function (_, $el) {\n var $card = $($el);\n var storedCardType = $card.data('type').replace(/\\s/g, '').toLowerCase();\n var storedCardLastFour = $card.data('last-four').toString();\n\n if (storedCardType === cardType && storedCardLastFour === lastFour) {\n $foundCard = $card;\n }\n });\n\n return $foundCard;\n}\n\n/**\n * Checks whether SRC session card is already stored\n * @param {string} cardType card type\n * @param {string} lastFour last four card digits\n * @returns {boolean} \"true/false\" value whether session card is already stored\n */\nfunction isSessionCardAlreadyStored(cardType, lastFour) {\n var $storedCard = getStoredCardByData(cardType, lastFour);\n var flag = false;\n\n if ($storedCard) {\n flag = true;\n }\n\n return flag;\n}\n\n/**\n * Sets value to \"Save SRC account\" checkbox\n * @param {Element} srcSessionAccount element from which we recognize session account existence\n * @param {boolean} value true/false\n */\nfunction handleSaveSrcAccountCheckbox(srcSessionAccount, value) {\n var isSrcSessionCardExist = srcSessionAccount.value !== '';\n var isAddNewOptionSelected = $srcAccountList.value === 'newaccount';\n\n if ($saveSRCAccountCheckbox) {\n // In case if session account exists and is chosen in dropdown\n // we check whether used SRC card is already stored\n // if card is already stored \"save\" checkbox is hidden and unchecked\n if (isSrcSessionCardExist && !isAddNewOptionSelected) {\n var $braintreeSrcCardType = document.querySelector('#braintreeSrcCardType');\n var $braintreeSrcLastFourDigits = document.querySelector('#braintreeSrcLastFourDigits');\n var sessionCardType = $braintreeSrcCardType.value;\n var sessionCardLastFour = $braintreeSrcLastFourDigits.value;\n sessionCardType = sessionCardType.replace(/\\s/g, '').toLowerCase();\n\n var isSrcSessionCardAlreadyStored = isSessionCardAlreadyStored(sessionCardType, sessionCardLastFour);\n\n if (isSrcSessionCardAlreadyStored) {\n $saveSRCAccountCheckbox.checked = false;\n $saveSRCAccountCheckboxContainter.style.display = 'none';\n }\n\n return;\n }\n // In case if session card does not exist/user chooses option \"Add New\"\n // or session card is not stored yet\n // checkbox is checked and shown\n $saveSRCAccountCheckboxContainter.style.display = 'block';\n $saveSRCAccountCheckbox.checked = value;\n }\n}\n\nmodule.exports = {\n setIsHideContinueButtonAttr,\n srsListStateHandler,\n handleSaveSrcAccountCheckbox\n};\n","'use strict';\n\nvar srcConstants = require('../constants/srcConstants');\nvar paymentMethodGeneral = require('../../paymentMethodGeneral');\n\n/**\n * Gets SRC flow name(corresponding page)\n * @returns {string} Flow id(page) account/cart/billing\n */\nfunction getSrcFlowName() {\n var srcFlowName;\n var isSrcEnabledOnAccountPage = Boolean(document.querySelector('.js_braintree_addSrcAccountForm'));\n var isSrcEnabledOnCartPage = Boolean(document.querySelector('.braintree-cart-src-button'));\n var isSrcEnabledOnBillingPage = Boolean(document.querySelector('.js_braintree_srcContent'));\n\n if (isSrcEnabledOnAccountPage) {\n srcFlowName = srcConstants.FLOW_NAME_ACCOUNT;\n } else if (isSrcEnabledOnCartPage) {\n srcFlowName = srcConstants.FLOW_NAME_CART_CHECKOUT;\n } else if (isSrcEnabledOnBillingPage) {\n srcFlowName = srcConstants.FLOW_NAME_BILLING_CHECKOUT;\n }\n\n return srcFlowName;\n}\n\n/**\n * Makes call to checkoutFrom Cart endpoint\n * @param {Object} srcCheckoutFormData SRC form data passed to server side\n * @param {string} email SRC email from response\n * @param {Object} errorHandlingCartModel Error handling cart model\n * @returns {ajax} call to checkoutFrom Cart endpoint\n */\nfunction checkoutFromCartCall(srcCheckoutFormData, email, errorHandlingCartModel) {\n var $braintreeCartButtons = document.querySelector('.braintree-cart-buttons-wrap');\n var checkoutFromCartUrl = $braintreeCartButtons.getAttribute('data-checkout-from-cart-url');\n var placeOrderUrl = $braintreeCartButtons.getAttribute('data-checkout-placeorder-url');\n // Submit customer form with email (CheckoutServices-SubmitCustomer)\n // as we skip step \"login via guest/registered user\" while express checkout\n // email is set only in case of guest checkout and if email is not already set\n paymentMethodGeneral.submitCustomerForm(email);\n\n return $.ajax({\n type: 'POST',\n url: checkoutFromCartUrl,\n data: srcCheckoutFormData,\n contentType: false,\n processData: false\n })\n .done(function (data) {\n if (data.error) {\n errorHandlingCartModel.handleCheckoutFromCartError(data);\n }\n\n sessionStorage.setItem('pageState', 'cart');\n window.location.href = placeOrderUrl;\n })\n .fail(function (err) {\n if (err && err.redirectUrl) {\n window.location.href = err.redirectUrl;\n }\n });\n}\n\nmodule.exports = {\n getSrcFlowName,\n checkoutFromCartCall\n};\n","'use strict';\n\nvar SrcBaseModel = require('./srcBaseModel');\nvar creditCardVaultManager = require('../../creditcard/components/creditCardVaultManager');\n\n/**\n * Check whether new card is presented on storefront and in VaultMgr. If yes - render error message.\n * @param {Promise} clientInstancePromise client instance promise\n * @param {Object} btPayload payload from Braintree\n * @param {Object} srcMessages object with errors\n * @returns {Promise} promise with reject status in case if new card already exists in VaultMgr and on Storefront (buyer's wallet)\n */\nfunction rejectIfCardExistsInVault(clientInstancePromise, btPayload, srcMessages) {\n var payloadDetails = btPayload.details;\n var lastFour = payloadDetails.lastFour.toString();\n var type = payloadDetails.cardType.toLowerCase();\n\n return creditCardVaultManager.isNewCardCanBeStored(clientInstancePromise, lastFour, type)\n .then(function (newCardCanBeStored) {\n if (!newCardCanBeStored) {\n // eslint-disable-next-line no-undef\n return Promise.reject(srcMessages.CARD_ALREADY_EXIST_ERROR_MESSAGE);\n }\n });\n}\n\n// See description of \"srcBaseModel\" for more info\nfunction SrcAccountModel(clientInstancePromise, srcButtonConfigurations, $braintreeSrcDeviceDataInput, loader, errorHandlingBaseModel) {\n SrcBaseModel.call(\n this,\n clientInstancePromise,\n srcButtonConfigurations,\n $braintreeSrcDeviceDataInput,\n loader,\n errorHandlingBaseModel\n );\n}\n\nSrcAccountModel.prototype = Object.create(SrcBaseModel.prototype);\n\n// See description of \"srcBaseModel\" for more info\n// Method set nonce data in to hidden input and submit the form to the server\nSrcAccountModel.prototype.onTokenizeCallback = function (srcPayload) {\n SrcBaseModel.prototype.onTokenizeCallback.call(this, srcPayload);\n var srcLoader = this.loader;\n var errorHandlingBaseModel = this.errorHandlingModel;\n var $addSrcAccountForm = $('.js_braintree_addSrcAccountForm');\n var addSrcFormUrl = $addSrcAccountForm.attr('action');\n var $srcNonce = document.querySelector('#braintreeSrcNonce');\n\n srcLoader.show();\n\n $srcNonce.value = srcPayload.nonce;\n\n return rejectIfCardExistsInVault(this.clientInstancePromise, srcPayload, this.srcButtonConfigurations.messages)\n .then(function () {\n var formData = $addSrcAccountForm.serialize();\n\n return $.ajax({\n url: addSrcFormUrl,\n type: 'post',\n dataType: 'json',\n data: formData\n })\n .then(function (response) {\n if (!response.success) {\n errorHandlingBaseModel.showErrorByMessage(response.error);\n } else {\n location.href = response.redirectUrl;\n }\n });\n })\n .catch(function (error) {\n srcLoader.hide();\n errorHandlingBaseModel.showErrorByMessage(error);\n })\n .finally(function () {\n srcLoader.hide();\n });\n};\n\n// See description of \"srcBaseModel\" for more info\nSrcAccountModel.prototype.initSrcButton = function () {\n var SrcAccountModelInstance = this;\n\n SrcAccountModelInstance.braintreeSrcSdkButtonInit(SrcAccountModelInstance)\n .catch(function (error) {\n SrcAccountModelInstance.errorHandlingModel.srcErrorHandler(error);\n });\n};\n\nmodule.exports = SrcAccountModel;\n","'use strict';\n\nvar braintreeSrcSDK = require('../braintreesdk/braintreeSrcSDK');\nvar braintreeGeneral = require('../../braintreeGeneral');\n\n/**\n * SRC Base Model constructor\n * @param {Promise} clientInstancePromise client instance promise\n * @param {Object} srcButtonConfigurations SRC button configs\n * @param {Object} $braintreeSrcDeviceDataInput BT SRC device data input\n * @param {Object} loader loader instance\n * @param {Object} errorHandlingModel Error handling instance\n */\nfunction SrcBaseModel(clientInstancePromise, srcButtonConfigurations, $braintreeSrcDeviceDataInput, loader, errorHandlingModel) {\n this.clientInstancePromise = clientInstancePromise;\n this.srcButtonConfigurations = srcButtonConfigurations;\n this.$braintreeSrcDeviceDataInput = $braintreeSrcDeviceDataInput;\n this.loader = loader;\n this.errorHandlingModel = errorHandlingModel;\n\n this.braintreeSrcSdkButtonInit = braintreeSrcSDK.visaCheckoutInitialized;\n\n // Prop which will be settled after calling of \"getBasketData\" method\n this.basketData = {\n amount: 0\n };\n}\n\n/**\n * Method is triggers when \"initSrcButton\" is called. Update total basket amount\n * @returns {Promise} Promise of get order data response\n */\nSrcBaseModel.prototype.updateBasketData = function () {\n var SrcBaseModelInstance = this;\n\n return $.ajax({\n url: this.srcButtonConfigurations.getOrderInfoUrl,\n type: 'get',\n dataType: 'json'\n })\n .done(function (data) {\n SrcBaseModelInstance.basketData.amount = data.amount;\n })\n .fail(function () {\n window.location.reload();\n });\n};\n\n/**\n * Retrun Init options which are used in SRC initialization\n * @returns {Object} object with Init options\n */\nSrcBaseModel.prototype.getInitOptionsObject = function () {\n return {\n paymentRequest: {\n currencyCode: this.srcButtonConfigurations.options.currency || 'USD',\n subtotal: this.basketData.amount\n },\n settings: {\n locale: this.srcButtonConfigurations.settings.locale,\n payment: {\n cardBrands: this.srcButtonConfigurations.settings.cardBrands,\n acceptCanadianVisaDebit: this.srcButtonConfigurations.settings.acceptCanadianVisaDebit\n },\n shipping: {\n collectShipping: this.srcButtonConfigurations.options.isShippingAddressRequired\n }\n }\n };\n};\n\n/**\n * Callback which is triggered when SRC approved payment on its side\n * This method will be overridden in scope of each child model\n * @param {Object} srcPayload payload from SRC\n */\n// eslint-disable-next-line no-unused-vars\nSrcBaseModel.prototype.onTokenizeCallback = function (srcPayload) {\n};\n\n/**\n * Method add fraud data in to hidden input (if enabled)\n * @returns {Promise} with the result of operation\n */\nSrcBaseModel.prototype.setFraudData = function () {\n // eslint-disable-next-line no-undef\n var result = Promise.resolve({});\n var SrcBaseModelInstance = this;\n var $braintreeSrcDeviceDataInput = SrcBaseModelInstance.$braintreeSrcDeviceDataInput;\n\n if (this.srcButtonConfigurations.isFraudToolsEnabled && $braintreeSrcDeviceDataInput) {\n result = braintreeGeneral.collectFraudData(this.clientInstancePromise)\n .then(function (dataCollectorInstance) {\n SrcBaseModelInstance.$braintreeSrcDeviceDataInput.value = dataCollectorInstance.deviceData;\n });\n }\n\n return result;\n};\n\n/**\n * Method is called when we want to init SRC button\n * @returns {Promise} Promise with the result of the operation\n */\nSrcBaseModel.prototype.initSrcButton = function () {\n var SrcBaseModelInstance = this;\n\n return SrcBaseModelInstance.updateBasketData()\n .then(function () {\n return SrcBaseModelInstance.setFraudData()\n .then(function () {\n return SrcBaseModelInstance.braintreeSrcSdkButtonInit(SrcBaseModelInstance);\n });\n })\n .catch(function (error) {\n SrcBaseModelInstance.errorHandlingModel.srcErrorHandler(error);\n });\n};\n\nmodule.exports = SrcBaseModel;\n","'use strict';\n\nvar SrcBaseModel = require('./srcBaseModel');\nvar srcHelper = require('../helpers/srcHelper');\nvar srcPaymentProcessingHelper = require('../helpers/srcPaymentProcessingHelper');\n\n// See description of \"srcBaseModel\" for more info\nfunction SrcCartModel(clientInstancePromise, srcButtonConfigurations, $braintreeSrcDeviceDataInput, loader, errorHandlingCartModel) {\n SrcBaseModel.call(\n this,\n clientInstancePromise,\n srcButtonConfigurations,\n $braintreeSrcDeviceDataInput,\n loader,\n errorHandlingCartModel\n );\n}\n\nSrcCartModel.prototype = Object.create(SrcBaseModel.prototype);\n\n// See description of \"srcBaseModel\" for more info\n// Add nonce and billing data to the from and submit to the \"CheckoutService-SubmitPayment\" endpoint\nSrcCartModel.prototype.onTokenizeCallback = function (srcPayload) {\n SrcBaseModel.prototype.onTokenizeCallback.call(this, srcPayload);\n\n this.loader.show();\n\n var $srcButton = document.querySelector('.js_braintree_src_button');\n\n srcPayload.billingAddressString = srcHelper.createSrcBillingAddress(srcPayload.billingAddress, srcPayload.userData);\n\n var paymentMethodName = JSON.parse($srcButton.getAttribute('data-braintree-config')).paymentMethodName;\n var srcFormData = srcHelper.createSrcFormData(srcPayload, paymentMethodName);\n var srcCheckoutFormData = srcHelper.createSrcCheckoutFormData(srcFormData, srcPayload);\n\n srcPaymentProcessingHelper.checkoutFromCartCall(srcCheckoutFormData, srcPayload.userData.userEmail, this.errorHandlingModel)\n .always(function () {\n this.loader.hide();\n });\n};\n\nmodule.exports = SrcCartModel;\n","'use strict';\n\nvar SrcBaseModel = require('./srcBaseModel');\n\n// Helpers\nvar srcHelper = require('../helpers/srcHelper');\nvar helper = require('../../helper');\n\nvar srcSessionAccountComponent = require('../components/srcSessionAccount');\n\n// See description of \"srcBaseModel\" for more info\nfunction SrcCheckoutModel(clientInstancePromise, srcButtonConfigurations, $braintreeSrcDeviceDataInput, loader, errorHandlingCheckoutModel) {\n SrcBaseModel.call(\n this,\n clientInstancePromise,\n srcButtonConfigurations,\n $braintreeSrcDeviceDataInput,\n loader,\n errorHandlingCheckoutModel\n );\n}\n\nSrcCheckoutModel.prototype = Object.create(SrcBaseModel.prototype);\n\n// See description of \"srcBaseModel\" for more info\n// Add nonce and billing data to the from and trigger click on \"SubmitPayment\" button\nSrcCheckoutModel.prototype.onTokenizeCallback = function (srcPayload) {\n SrcBaseModel.prototype.onTokenizeCallback.call(this, srcPayload);\n\n this.loader.show();\n\n // Remove all other Payments session payments\n helper.removeActiveSessionPayment();\n\n var $srcNonce = document.querySelector('#braintreeSRCNonce');\n var $srcBillingAddress = document.querySelector('#braintreeSrcBillingAddress');\n var $continueButton = document.querySelector('button.submit-payment');\n\n var srcBillingData = srcPayload.billingAddress;\n\n srcPayload.billingAddressString = srcHelper.createSrcBillingAddress(srcPayload.billingAddress, srcPayload.userData);\n\n $srcNonce.value = srcPayload.nonce;\n srcBillingData.email = srcPayload.userData.userEmail;\n $srcBillingAddress.value = JSON.stringify(srcBillingData);\n\n srcSessionAccountComponent.showSrcSessionAccount(srcPayload);\n\n // Updating Storefront Billing Form data with SRC Billing\n srcHelper.updateStorefrontBillingData(srcBillingData);\n\n $continueButton.click();\n\n this.loader.hide();\n};\n\nmodule.exports = SrcCheckoutModel;\n","'use strict';\n\nvar braintreeGeneral = require('../braintreeGeneral');\nvar srcHelper = require('./helpers/srcHelper');\n\n// Components\nvar srcAccount = require('./components/srcAccount');\nvar srcCardList = require('./components/srcList');\nvar checkoutComponent = require('./components/srcCheckout');\nvar cartComponent = require('./components/srcCart');\n\n\nvar btClientInstancePromise;\n\n/**\n * Inits SRC functionality on the Account Page\n */\nfunction initAccount() {\n srcAccount.init(btClientInstancePromise);\n}\n\n/**\n * Inits SRC functionality on the Cart Page\n */\nfunction initCartCheckout() {\n cartComponent.init(btClientInstancePromise);\n}\n\n/**\n * Inits SRC functionality on the Billing Page\n */\nfunction initBillingCheckout() {\n checkoutComponent.init(btClientInstancePromise);\n srcCardList.init();\n}\n\n/**\n * Inits braintreeSrcModelBuilder on SRC level\n */\nfunction init() {\n var braintreeSrcConfigs = srcHelper.getBraintreeSRCButtonConfigs();\n var clientToken;\n\n if (braintreeSrcConfigs) {\n clientToken = braintreeSrcConfigs.clientToken;\n btClientInstancePromise = braintreeGeneral.createClientInstance(clientToken);\n }\n}\n\nmodule.exports = {\n initAccount,\n initCartCheckout,\n initBillingCheckout,\n init\n};\n","'use strict';\n\nvar braintreeVenmoSDK = require('./braintreeVenmoSDK');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar venmoProcessing = require('../components/venmoProcessing');\nvar venmoHelper = require('../helpers/venmoHelper');\nvar venmoErrorHandler = require('../errorhandler/venmoErrorHandler');\n\n/* global Promise braintree $ */\n\n// global variables\nvar btClientInstancePromise;\n\n/**\n * Init Braintree Venmo model\n * @param {Promise} braintreeClientInstancePromise Braintreee client instance promise\n */\nfunction init(braintreeClientInstancePromise) {\n braintreeVenmoSDK.init(braintreeClientInstancePromise);\n\n btClientInstancePromise = braintreeClientInstancePromise;\n}\n\n/**\n * Returns fraud data from dataCollector payload\n * @returns {Object} Payload with fraud data\n */\nfunction collectFraudData() {\n var response;\n\n try {\n response = braintreeGeneral.collectFraudData(btClientInstancePromise);\n } catch (error) {\n response = Promise.resolve({\n customMessage: 'Fraud Data collection isn`t enabled via Custom Site Preference'\n });\n }\n\n return response;\n}\n\n/**\n * Checks whether browser supports Venmo\n * @returns {Promise} with isBrowserSupported value\n */\nfunction isBrowserSupported() {\n return braintreeVenmoSDK.isBrowserSupported();\n}\n\n/**\n * Inits Venmo button\n * @param {Element} $venmoButton Venmo button element\n * @param {Booleean} isBillingPage \"true/false\" value to identify flow page\n * @returns {Promise} Promise resolved with a tokenized payload\n *\n */\nfunction initVenmo($venmoButton, isBillingPage) {\n return braintreeVenmoSDK.createVenmo()\n .then(function (venmoInstance) {\n $venmoButton.addEventListener('click', function () {\n // Check billing form to close Venmo pop-up and prevent tokenize action if any error (empty email input)\n // Check if amount is not zero to close Venmo pop-up and show appropriate error\n if (isBillingPage && (!venmoHelper.checkBillingForm() || venmoHelper.checkZeroAmount())) {\n return;\n }\n\n return braintreeVenmoSDK.tokenize(venmoInstance)\n .then(function (payload) {\n return venmoProcessing.processVenmo(payload);\n })\n .catch(function (error) {\n venmoErrorHandler.showVenmoError(error.message);\n });\n });\n });\n}\n\nmodule.exports = {\n init,\n collectFraudData,\n isBrowserSupported,\n initVenmo\n};\n","'use strict';\n\nvar braintreeVenmoModel = require('./braintreeVenmoModel');\nvar braintreeGeneral = require('../../braintreeGeneral');\nvar venmoHelper = require('../helpers/venmoHelper');\n\n/**\n * Initialize Braintree Venmo Model. Pattern Builder is used\n * @returns {Object} object with boolean \"error\" flag and \"message\" attribute with error message\n */\nfunction init() {\n var braintreeVenmoButtonConfigs = venmoHelper.getBraintreeVenmoButtonConfigs();\n var clientToken;\n var btClientInstancePromise;\n var response = {\n error: false,\n message: '',\n btVenmoModel: null\n };\n\n if (braintreeVenmoButtonConfigs) {\n clientToken = braintreeVenmoButtonConfigs.clientToken;\n btClientInstancePromise = braintreeGeneral.createClientInstance(clientToken);\n\n braintreeVenmoModel.init(\n btClientInstancePromise\n );\n\n response.btVenmoModel = braintreeVenmoModel;\n } else {\n response.error = true;\n response.message = 'No Braintree Venmo Configurations';\n }\n\n return response;\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\n/* global braintreeUtils braintree $ */\n\nvar btClientInstancePromise;\nvar venmoClientInstance;\n\n/**\n * Checks whether browser supports Venmo\n * @returns {Promise} with isBrowserSupported value\n */\nfunction isBrowserSupported() {\n return btClientInstancePromise\n .then(function (btClientInstance) {\n venmoClientInstance = btClientInstance;\n\n return braintree.venmo.isBrowserSupported({\n allowNewBrowserTab: false,\n allowDesktop: true\n });\n });\n}\n\n/**\n * Creates Venmo instance\n * @returns {Promise} Promise resolved with Venmo instance\n */\nfunction createVenmo() {\n return braintree.venmo.create({\n client: venmoClientInstance,\n allowNewBrowserTab: false,\n ignoreHistoryChanges: true,\n allowDesktop: true\n });\n}\n/**\n * Tokenizes Venmo payment\n * @param {Object} venmoInstance Venmo instance\n * @returns {Promise} Promise resolved with tokenized payload\n */\nfunction tokenize(venmoInstance) {\n return venmoInstance.tokenize({ processResultsDelay: 10 });\n}\n\n/**\n * Inits braintreeVenmoSDK with client instance promise\n * @param {Promise} braintreeClientInstancePromise Braintree Venmo client instance promise\n */\nfunction init(braintreeClientInstancePromise) {\n btClientInstancePromise = braintreeClientInstancePromise;\n}\n\nmodule.exports = {\n init,\n isBrowserSupported,\n createVenmo,\n tokenize\n\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar loaderInstance = require('../../loaderHelper');\nvar venmoButton = require('../components/venmoButton');\nvar venmoHelper = require('../helpers/venmoHelper');\nvar venmoErrorHandler = require('../errorhandler/venmoErrorHandler');\n\nvar $venmoButton = document.querySelector('.js_braintree_accountVenmoButton');\nvar venmoLoader;\n\n/**\n * Makes Venmo account as default one\n * @param {Event} e event to identify target element\n */\nfunction makeDefaultVenmo(e) {\n var target = e.target;\n var url = target.getAttribute('data-make-default-url');\n var id = target.getAttribute('data-id');\n var paymentMethodID = document.querySelector('.venmo-accounts').getAttribute('data-payment-method-id');\n var $loaderContainter = document.querySelector('#' + target.getAttribute('data-loader'));\n var loader = loaderInstance($loaderContainter);\n\n loader.show();\n\n helper.setDefaultProperty({\n url: url,\n id: id,\n paymentMethodID: paymentMethodID,\n loader: loader\n });\n}\n\n/**\n * Creates Venmo form data on account page\n * @param {string} nonce Braintree Venmo nonce\n * @returns {Object} object with Venmo form data\n */\nfunction createVenmoAccountFormData(nonce) {\n var venmoAccountFormFields = $venmoButton.getAttribute('data-venmo-account-form-fields');\n var csrfToken = document.querySelector('.js_braintree_accountVenmoButton_wrapper #csrf_token');\n\n var venmoAccountFormData = helper.createPaymentFormData(venmoAccountFormFields, {\n nonce: nonce\n });\n\n venmoAccountFormData.append(csrfToken.name, csrfToken.value);\n\n return venmoAccountFormData;\n}\n\n/**\n * Stores new Venmo account\n * @param {Object} data tokenized payload data with Venmo nonce\n * @returns {ajax} call to Braintree-AccountAddVenmoHandle endpoint\n */\nfunction storeNewVenmoAccount(data) {\n var venmoAddAccountHandlerUrl = $venmoButton.getAttribute('data-venmo-add-account-handler');\n var venmoAccountFormData = createVenmoAccountFormData(data.nonce);\n\n venmoLoader.show();\n\n return $.ajax({\n type: 'POST',\n url: venmoAddAccountHandlerUrl,\n data: venmoAccountFormData,\n contentType: false,\n processData: false\n })\n .then((paymentData) => {\n venmoHelper.hideVenmoAccountBtn();\n venmoLoader.hide();\n\n $.get(paymentData.renderAccountsUrl)\n .then((tplData => {\n document.querySelector('.venmo-accounts').innerHTML = tplData;\n document.querySelectorAll('.venmo-accounts .remove-bt-payment').forEach(function (el) {\n el.addEventListener('click', helper.removeBtPayment);\n });\n }));\n })\n .fail(({ responseJSON }) => {\n venmoLoader.hide();\n\n venmoErrorHandler.showVenmoError(responseJSON.error);\n });\n}\n\n/**\n * Inits Venmo functionality\n * @param {Object} btVenmoModel Braintree Venmo model\n */\nfunction init(btVenmoModel) {\n var isVenmoButtonEnabledOnAccountPage = Boolean(document.querySelector('.js_braintree_accountVenmoButton'));\n var $braintreeVenmoLoader = document.querySelector('#braintreeVenmoAccLoader');\n\n venmoLoader = loaderInstance($braintreeVenmoLoader);\n\n if (isVenmoButtonEnabledOnAccountPage) {\n // \"Make default\" button functionality initiation\n $('.venmo-accounts').on('click', '.braintree-make-default-card', makeDefaultVenmo);\n\n // \"Remove\" button functionality initiation\n $('.venmo-accounts').on('click', '.remove-bt-payment', helper.removeBtPayment);\n\n // \"Add New\" Venmo button functionality initiation\n $('.add-venmo-account').click(function () {\n venmoHelper.showVenmoAccountBtn();\n\n if (!window.venmoAccountButtonInited) {\n window.venmoAccountButtonInited = true;\n\n venmoButton.init(btVenmoModel, $venmoButton);\n }\n });\n\n return;\n }\n\n var isVenmoAccountBlockExists = Boolean(document.querySelector('.venmo-accounts'));\n\n if (isVenmoAccountBlockExists) {\n // \"Make default\" button functionality initiation\n $('.venmo-accounts').on('click', '.braintree-make-default-card', makeDefaultVenmo);\n\n // \"Remove\" button functionality initiation\n $('.venmo-accounts').on('click', '.remove-bt-payment', helper.removeBtPayment);\n }\n}\n\nmodule.exports = {\n init,\n storeNewVenmoAccount\n};\n","'use strict';\n\nvar venmoErrorHandler = require('../errorhandler/venmoErrorHandler');\nvar venmoHelper = require('../helpers/venmoHelper');\n\n/**\n * General validation of params needed for initialization of Venmo button\n * @param {Object} braintreeVenmoConfig Braintree Venmo button configurations (they came from server via data attr)\n * @returns {Object} object with \"error\" boolean flag and array of error messages from \"messages\" attr\n */\nfunction generalVenmoValidation(braintreeVenmoConfig) {\n var response = {\n error: false,\n messages: ''\n };\n\n try {\n var isBraintreeVenmoConfigValid = typeof braintreeVenmoConfig !== 'object' || braintreeVenmoConfig !== null;\n\n if (!isBraintreeVenmoConfigValid) {\n response.error = true;\n response.messages = 'Venmo button has not valid data-braintree-config';\n }\n } catch (error) {\n response.error = true;\n response.messages = error;\n }\n\n return response;\n}\n\n/**\n * Init Venmo button functionality\n * @param {Object} btVenmoModel Braintree Venmo model\n * @param {Object} $venmoButton Venmo button element\n * @param {boolean} isBillingPage value to identify flow page\n */\nfunction init(btVenmoModel, $venmoButton, isBillingPage) {\n try {\n var braintreeVenmoConfig = JSON.parse($venmoButton.getAttribute('data-braintree-config'));\n var generalValidation = generalVenmoValidation(braintreeVenmoConfig);\n\n if (generalValidation.error) {\n if (generalValidation.messages.length) {\n throw generalValidation.messages;\n }\n }\n\n // Fraud Data collecting\n // For more details go inside \"btVenmoModel.collectFraudData\" function logic\n btVenmoModel.collectFraudData()\n .then(function (fraudDataPayload) {\n venmoHelper.setVenmoDeviceData(fraudDataPayload.deviceData);\n\n return btVenmoModel.isBrowserSupported()\n .then(function (isBrowserSupported) {\n if (isBrowserSupported) {\n return btVenmoModel.initVenmo($venmoButton, isBillingPage);\n }\n venmoErrorHandler.handleNoBrowserSupport(braintreeVenmoConfig);\n });\n });\n\n // To prevent repeatable Venmo button initialization\n window.venmoCheckoutButtonInited = true;\n } catch (error) {\n venmoErrorHandler.showVenmoError(error);\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar loaderInstance = require('../../loaderHelper');\nvar venmoButton = require('./venmoButton');\nvar venmoList = require('./venmoList');\nvar venmoHelper = require('../helpers/venmoHelper');\nvar venmoSessionAccount = require('./venmoSessionAccount');\nvar venmoErrorHandler = require('../errorhandler/venmoErrorHandler');\n\nvar $braintreeVenmoNonce = document.querySelector('#braintreeVenmoNonce');\nvar $braintreeVenmoUserId = document.querySelector('#braintreeVenmoUserId');\nvar $submitShippingBtn = document.querySelector('.button, .submit-shipping');\nvar $venmoContent = document.querySelector('.js_braintree_venmoContent');\nvar $venmoBillingInput = document.querySelector('#braintreeVenmoBilling');\nvar $continueButton = document.querySelector('button.submit-payment');\nvar $venmoButton = document.querySelector('.js_braintree_venmo_button');\nvar hashChange;\n\n/**\n * Process Venmo on the Billing/Checkout Page\n * @param {Object} data tokenized Venmo payload data\n */\nfunction processCheckoutFlow(data) {\n var $loaderContainer = venmoHelper.createLoaderContainter(document.querySelector('.page'));\n loaderInstance($loaderContainer).show();\n\n $braintreeVenmoNonce.value = data.nonce;\n $braintreeVenmoUserId.value = data.details.username;\n // In case when stage is correct we proceed with usual flow\n if (window.history.state !== 'shipping') {\n $continueButton.click();\n document.querySelector('.venmo-braintree-loader').remove();\n\n return;\n }\n // In case when Venmo has returned from Venmo app to NOT correct stage (for example, to shipping stage)\n // we redirect user to correct stage and set required data\n venmoHelper.updateBillingAddressFormValues(JSON.parse($venmoBillingInput.value));\n // Move to stage payment\n $submitShippingBtn.click();\n $venmoButton.setAttribute('data-is-valid-stage', true);\n document.querySelector('.venmo-braintree-loader').remove();\n}\n\n/**\n * Inits Venmo checkout components\n * @param {Object} btVenmoModel Braintree Venmo model\n */\nfunction init(btVenmoModel) {\n // MutationObserver is triggered on each URL change to avoid conflict between URL passed to Venmo application\n // and URL with already changed stage on storefront (checkout stage)\n // case when user is redirected from Venmo application\n hashChange = new MutationObserver(function (mutations) {\n var mutation = mutations.find(function (element) {\n return element.attributeName === 'data-checkout-stage' && element.target.dataset.checkoutStage === 'payment';\n });\n\n if (!mutation) {\n return false;\n }\n\n if ($braintreeVenmoNonce.value && JSON.parse($venmoButton.getAttribute('data-is-valid-stage'))) {\n $venmoButton.setAttribute('data-is-valid-stage', false);\n $continueButton.click();\n\n return true;\n }\n // Case when user has proceeded with Venmo session account and clicked on \"edit\" button\n if ($venmoContent.classList.contains('active') && mutation.oldValue === 'placeOrder') {\n // Show disabled dropdown with used Venmo session account\n venmoSessionAccount.showVenmoAccount();\n // Set attribute to show \"place order\" button\n $venmoContent.setAttribute('data-paypal-is-hide-continue-button', false);\n // Hide Venmo button\n $venmoButton.setAttribute('data-is-hide-venmo-button', true);\n }\n });\n\n hashChange.observe(document.querySelector('#checkout-main'), { attributeOldValue: true });\n\n // Venmo button functionality is initiated once in case if it was not inited yet\n // based on existence of window.venmoCheckoutButtonInited (set while Venmo button initiation)\n if (!window.venmoCheckoutButtonInited) {\n venmoButton.init(btVenmoModel, $venmoButton, true);\n venmoErrorHandler.init($venmoButton);\n venmoList.init();\n }\n\n var sessionPaymentMethodId = JSON.parse($venmoContent.getAttribute('data-braintree-config')).sessionPaymentMethodId;\n // if exists Venmo session account - we make Venmo tab active on page reload\n if (sessionPaymentMethodId === 'Venmo') {\n document.querySelector('.venmo-tab').click();\n }\n}\n\nmodule.exports = {\n init,\n processCheckoutFlow\n};\n","'use strict';\n\nvar venmoHelper = require('../helpers/venmoHelper');\n\nvar $btVenmoAccountsList = document.querySelector('#braintreeVenmoAccountsList');\nvar $venmoButton = document.querySelector('.js_braintree_venmo_button');\n\n/**\n * Inits Venmo list functionality\n */\nfunction init() {\n // Attribute is set as \"true\" when user has saved Venmo account in wallet\n // or when user has proceeded with Venmo session account\n var isHideVenmoButtonAttribute = JSON.parse($venmoButton.getAttribute('data-is-hide-venmo-button'));\n // Case when we already have session account in disabled dropdown\n // and user returns to the Billing Page from Cart or other page (from not billing page/stages)\n // only in this case we need to hide Venmo button\n // in other cases button and dropdown behavior is handled by venmoContentTabHandler function\n // because disabled dropdown with session Venmo account and with saved Venmo and \"new account\" option are separated\n if (isHideVenmoButtonAttribute && !$btVenmoAccountsList !== 'newaccount') {\n $venmoButton.style.display = 'none';\n }\n\n if ($btVenmoAccountsList) {\n $btVenmoAccountsList.addEventListener('change', function () {\n venmoHelper.venmoContentTabHandler();\n });\n\n venmoHelper.venmoContentTabHandler();\n }\n}\n\nmodule.exports = {\n init\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar venmoAccount = require('./venmoAccount');\nvar venmoCheckout = require('./venmoCheckout');\nvar venmoConstants = require('../constants/venmoConstants');\nvar venmoProcessingHelper = require('../helpers/venmoProcessingHelper');\nvar venmoErrorHandler = require('../errorhandler/venmoErrorHandler');\n\n/**\n * Process Venmo flow for Account/Billing Page flows\n * @param {Object} venmoData Venmo data received from tokenize\n */\nfunction processVenmo(venmoData) {\n venmoErrorHandler.clearVenmoError();\n\n var venmoFlowName = venmoProcessingHelper.getVenmoFlowName();\n\n switch (venmoFlowName) {\n case venmoConstants.FLOW_NAME_ACCOUNT:\n\n venmoAccount.storeNewVenmoAccount(venmoData);\n break;\n\n case venmoConstants.FLOW_NAME_BILLING_CHECKOUT:\n helper.removeActiveSessionPayment();\n venmoCheckout.processCheckoutFlow(venmoData);\n break;\n\n default:\n break;\n }\n}\n\nmodule.exports = {\n processVenmo\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar venmoHelper = require('../helpers/venmoHelper');\n\nvar $venmoButton = document.querySelector('.js_braintree_venmo_button');\nvar $braintreeVenmoSessionAccount = document.getElementById('braintreeVenmoAccount');\nvar $venmoAccountBlock = document.querySelector('.js_braintree_used_venmo_account');\nvar $braintreeVenmoUserId = document.querySelector('#braintreeVenmoUserId');\n\n/**\n * Handles showing Venmo session account\n */\nfunction showVenmoAccount() {\n var btVenmoAccountsList = document.querySelector('#braintreeVenmoAccountsList');\n\n if (!btVenmoAccountsList) {\n $venmoAccountBlock.classList.remove('used-venmo-account-hide');\n $braintreeVenmoSessionAccount.options[0].text = $braintreeVenmoUserId.value;\n }\n\n $venmoButton.style.display = 'none';\n\n helper.continueButtonToggle(false);\n}\n\n/**\n * Removes method was used and change appearance of Venmo tab\n */\nfunction removeSessionNonce() {\n var defaultOption = helper.getOptionByDataDefault('#braintreeVenmoAccountsList');\n var braintreeVenmoNonce = document.querySelector('#braintreeVenmoNonce');\n var braintreeVenmoBilling = document.querySelector('#braintreeVenmoBilling');\n\n if (defaultOption) {\n defaultOption.selected = true;\n\n venmoHelper.venmoContentTabHandler();\n } else {\n $venmoAccountBlock.classList.remove('used-venmo-account');\n $venmoAccountBlock.classList.add('used-venmo-account-hide');\n $venmoButton.style.display = 'block';\n }\n\n braintreeVenmoNonce.value = '';\n braintreeVenmoBilling.value = '';\n}\n\nmodule.exports = {\n showVenmoAccount,\n removeSessionNonce\n};\n","'use strict';\n\nmodule.exports = {\n FLOW_NAME_ACCOUNT: 'account',\n FLOW_NAME_BILLING_CHECKOUT: 'billing'\n};\n","'use strict';\n\nvar $addVenmoAccountBtn = document.querySelector('.add-venmo-account');\nvar $venmoAccountWrapper = document.querySelector('.js_braintree_accountVenmoButton_wrapper');\nvar $venmoErrorContainer = document.querySelector('#venmoAccountErrorContainer');\n\n/**\n * Shows error on the Account Page and hides Venmo block in case when browser is not supported\n * @param {Object} braintreeVenmoConfig Braintree Venmo config\n */\nfunction handleNoBrowserSupportErrorOnAccount(braintreeVenmoConfig) {\n $addVenmoAccountBtn.style.display = 'none';\n $venmoAccountWrapper.style.display = 'block';\n document.querySelector('#venmoAccountErrorContainer').textContent = braintreeVenmoConfig.messages.VENMO_BROWSER_NOT_SUPPORTED;\n\n [].slice.call($venmoAccountWrapper.children).forEach(function (item) {\n if (!item.classList.contains('error')) {\n item.style.display = 'none';\n }\n });\n}\n\n/**\n * Hides Venmo tab on the Billing Page - in case when browser is not supported\n */\nfunction hideVenmoTab() {\n document.querySelector('.js_braintree_venmo_button').parentElement.firstElementChild.style.display = 'none';\n document.querySelector('.payment-options[role=tablist] .nav-item[data-method-id=\"Venmo\"]').style.display = 'none'; // Remove the venmo select payment method radiobutton\n}\n\n/**\n * Handles error flows in case when browser is not supported for Billing/Account Pages\n * @param {Object} braintreeVenmoConfig Braintree Venmo config\n */\nfunction handleNoBrowserSupport(braintreeVenmoConfig) {\n if ($venmoAccountWrapper) {\n handleNoBrowserSupportErrorOnAccount(braintreeVenmoConfig);\n } else {\n hideVenmoTab();\n }\n}\n\n/**\n * Shows error container and passed error message\n * @param {string} error error text\n */\nfunction showVenmoError(error) {\n $venmoErrorContainer.style.display = 'block';\n $venmoErrorContainer.textContent = error;\n}\n\n/**\n * Hides error container and clear existing error\n */\nfunction clearVenmoError() {\n $venmoErrorContainer.textContent = '';\n $venmoErrorContainer.style.display = 'none';\n}\n\n/**\n * Show checkout error message on top of the page\n * @param {string} message Error message\n */\nfunction showCheckoutErrorMsg(message) {\n document.querySelector('.error-message-text').textContent = '';\n document.querySelector('.error-message').style.display = 'block';\n document.querySelector('.error-message-text').append(message);\n\n window.scrollTo(0, 0);\n}\n\n/**\n * Inits Venmo error handler components\n * @param {Element} $venmoButton Venmo button element\n */\nfunction init($venmoButton) {\n // For account page flow error container already exist\n var isVenmoErrorContainerExists = Boolean($venmoErrorContainer);\n\n // For the Billing Page we create error containter\n if (!isVenmoErrorContainerExists) {\n $venmoErrorContainer = document.createElement('div');\n $venmoErrorContainer.className = 'venmo-error';\n $venmoButton.parentNode.insertBefore($venmoErrorContainer, $venmoButton.nextSibling);\n }\n}\n\nmodule.exports = {\n init,\n handleNoBrowserSupport,\n showVenmoError,\n clearVenmoError,\n showCheckoutErrorMsg\n};\n","'use strict';\n\nvar helper = require('../../helper');\nvar venmoErrorHandler = require('../errorhandler/venmoErrorHandler');\n\nvar $addVenmoAccountBtn = document.querySelector('.add-venmo-account');\nvar $venmoAccountWrapper = document.querySelector('.js_braintree_accountVenmoButton_wrapper');\n\n/**\n * Returns Braintree Venmo configs\n * @returns {Object} Braintree Venmo configs\n */\nfunction getBraintreeVenmoButtonConfigs() {\n var braintreeVenmoButtonConfigs = null;\n var $venmoButton = document.querySelector('.js_braintree_venmo_button') || document.querySelector('.js_braintree_accountVenmoButton');\n\n try {\n braintreeVenmoButtonConfigs = JSON.parse($venmoButton.getAttribute('data-braintree-config'));\n } catch (error) {\n return braintreeVenmoButtonConfigs;\n }\n\n return braintreeVenmoButtonConfigs;\n}\n\n/**\n * Creates loader container on the Billing page\n * @param {Element} $target Venmo button target for which loader container is created\n * @returns {Element} created loader container element\n */\nfunction createLoaderContainter($target) {\n var $loaderContainter = document.createElement('div');\n\n $loaderContainter.className = 'venmo-braintree-loader';\n\n helper.continueButtonToggle(true);\n\n return $target.parentNode.insertBefore($loaderContainter, $target);\n}\n\n\n/**\n * Updates the billing address form values within saved billing\n * @param {Object} billingAddress billing address\n */\nfunction updateBillingAddressFormValues(billingAddress) {\n var form = $('form[name=dwfrm_billing]');\n var inputNames = ['firstName', 'lastName', 'address1', 'address2', 'city', 'postalCode', 'country'];\n\n if (!form) {\n return;\n }\n\n $.each(inputNames, function (index, value) {\n $(`input[name$=_${value}]`, form).val(decodeURIComponent(billingAddress[value]));\n });\n\n $('select[name$=_stateCode],input[name$=_stateCode]', form)\n .val(billingAddress.stateCode);\n}\n\n/**\n * Shows Venmo button on the Account Page and hides \"add new\" button\n */\nfunction showVenmoAccountBtn() {\n $addVenmoAccountBtn.style.display = 'none';\n $venmoAccountWrapper.style.display = 'block';\n}\n\n/**\n * Hides Venmo button on the Account Page and shows \"add new\" button\n */\nfunction hideVenmoAccountBtn() {\n $addVenmoAccountBtn.style.display = 'block';\n $venmoAccountWrapper.style.display = 'none';\n}\n\n/**\n * Saves Venmo device (risk) data to hidden input\n * @param {string} deviceData Venmo device (risk) data\n */\nfunction setVenmoDeviceData(deviceData) {\n var $braintreeVenmoDeviceData = document.querySelector('#braintreeVenmoDeviceData');\n\n if ($braintreeVenmoDeviceData) {\n $braintreeVenmoDeviceData.value = deviceData;\n }\n}\n\n/**\n * Checks billing form on the Billing Page\n * If billing form is valid, saves/updates billing address to input\n * If not valid (possible case: empty email) - add error class to email input\n * @returns {boolean} billing form check result value\n */\nfunction checkBillingForm() {\n var $billingForm = document.querySelector('.card-body [id=dwfrm_billing]');\n var $venmoBillingInput = document.querySelector('#braintreeVenmoBilling');\n\n if ($billingForm.checkValidity()) {\n /**\n * Setting current customer Billing address to form\n * For the case when SFCC redirects customer from payment stage to shipping stage\n * after successful Venmo app response\n */\n $venmoBillingInput.value = JSON.stringify(helper.getBillingAddressFormValues());\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Checks zero amount on the Billing Page\n * If amount is zero Venmo pop-up is closed and appropriate error is shown\n * If amount is acceptable by Venmo user could proceed through pop-up\n * @returns {boolean} zero amount check result value\n */\nfunction checkZeroAmount() {\n var $venmoButton = document.querySelector('.js_braintree_venmo_button');\n var venmoButtonConfig = JSON.parse($venmoButton.getAttribute('data-braintree-config'));\n var amount = venmoButtonConfig.options.amount;\n\n if (amount === 0) {\n var errorMessage = venmoButtonConfig.messages.VENMO_ZERO_AMOUNT_ERROR;\n\n venmoErrorHandler.showCheckoutErrorMsg(errorMessage);\n\n return true;\n }\n\n return false;\n}\n\n/**\n * Handles all behavior related to the Venmo content tab\n */\nfunction venmoContentTabHandler() {\n var $btVenmoAccountsList = document.querySelector('#braintreeVenmoAccountsList');\n var $saveVenmoAccountCheckboxContainer = document.querySelector('#braintreeSaveVenmoAccountContainer');\n var $saveVenmoAccountCheckbox = document.querySelector('#braintreeSaveVenmoAccount');\n var $venmoButton = document.querySelector('.js_braintree_venmo_button');\n var $venmoContent = document.querySelector('.js_braintree_venmoContent');\n var venmoOptionId = $btVenmoAccountsList.value;\n\n switch (venmoOptionId) {\n // Case when option \"new account\" is selected in dropdown\n case 'newaccount':\n $venmoButton.style.display = 'block';\n\n helper.continueButtonToggle(true);\n $venmoContent.setAttribute('data-paypal-is-hide-continue-button', true);\n\n break;\n // Case when saved account is selected in dropdown\n default:\n $venmoButton.style.display = 'none';\n\n helper.continueButtonToggle(false);\n $venmoContent.setAttribute('data-paypal-is-hide-continue-button', false);\n // Case when registered user and vaulting is enabled\n if ($saveVenmoAccountCheckboxContainer) {\n $saveVenmoAccountCheckbox.checked = false;\n $saveVenmoAccountCheckboxContainer.style.display = 'none';\n }\n }\n}\n\n\nmodule.exports = {\n getBraintreeVenmoButtonConfigs,\n createLoaderContainter,\n updateBillingAddressFormValues,\n showVenmoAccountBtn,\n hideVenmoAccountBtn,\n setVenmoDeviceData,\n checkBillingForm,\n checkZeroAmount,\n venmoContentTabHandler\n};\n","'use strict';\n\nvar venmoConstants = require('../constants/venmoConstants');\n\n/**\n * Gets Venmo flow name (corresponding page)\n * @returns {string} Flow ID (page) Account/Billing\n */\nfunction getVenmoFlowName() {\n var venmoFlowName;\n var isVenmoEnabledOnAccountPage = Boolean(document.querySelector('.js_braintree_accountVenmoButton'));\n var isVenmoEnabledOnBillingPage = Boolean(document.querySelector('.js_braintree_venmoContent'));\n\n if (isVenmoEnabledOnAccountPage) {\n venmoFlowName = venmoConstants.FLOW_NAME_ACCOUNT;\n } else if (isVenmoEnabledOnBillingPage) {\n venmoFlowName = venmoConstants.FLOW_NAME_BILLING_CHECKOUT;\n }\n\n return venmoFlowName;\n}\n\nmodule.exports = {\n getVenmoFlowName\n};\n","'use strict';\n\n// Braintree SDK model builder, we need to init Braintree Venmo model on this level, since we are using it on step of \"venmoAccount.init()\"\n// and on step of \"venmoCheckout.init()\".\nvar braintreeVenmoModelBuilder = require('./braintreesdk/braintreeVenmoModelBuilder');\n\n// components\nvar venmoAccount = require('./components/venmoAccount');\nvar venmoCheckout = require('./components/venmoCheckout');\n\nvar btVenmoModelResponse;\n\n/**\n * Inits Venmo functionality on the Account Page\n */\nfunction initAccount() {\n venmoAccount.init(btVenmoModelResponse.btVenmoModel);\n}\n\n/**\n * Inits Venmo functionality on the Billing Page\n */\nfunction initBillingCheckout() {\n venmoCheckout.init(btVenmoModelResponse.btVenmoModel);\n}\n\n/**\n * Inits braintreeVenmoModelBuilder on Venmo level\n */\nfunction init() {\n btVenmoModelResponse = braintreeVenmoModelBuilder.init();\n}\n\nmodule.exports = {\n initAccount,\n initBillingCheckout,\n init\n};\n","!function(root, factory) {\n \"function\" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set\n define([], function() {\n return root.svg4everybody = factory();\n }) : \"object\" == typeof module && module.exports ? // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory() : root.svg4everybody = factory();\n}(this, function() {\n /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */\n function embed(parent, svg, target) {\n // if the target exists\n if (target) {\n // create a document fragment to hold the contents of the target\n var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute(\"viewBox\") && target.getAttribute(\"viewBox\");\n // conditionally set the viewBox on the svg\n viewBox && svg.setAttribute(\"viewBox\", viewBox);\n // copy the contents of the clone into the fragment\n for (// clone the target\n var clone = target.cloneNode(!0); clone.childNodes.length; ) {\n fragment.appendChild(clone.firstChild);\n }\n // append the fragment into the svg\n parent.appendChild(fragment);\n }\n }\n function loadreadystatechange(xhr) {\n // listen to changes in the request\n xhr.onreadystatechange = function() {\n // if the request is ready\n if (4 === xhr.readyState) {\n // get the cached html document\n var cachedDocument = xhr._cachedDocument;\n // ensure the cached html document based on the xhr response\n cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(\"\"), \n cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item\n xhr._embeds.splice(0).map(function(item) {\n // get the cached target\n var target = xhr._cachedTarget[item.id];\n // ensure the cached target\n target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), \n // embed the target into the svg\n embed(item.parent, item.svg, target);\n });\n }\n }, // test the ready state change immediately\n xhr.onreadystatechange();\n }\n function svg4everybody(rawopts) {\n function oninterval() {\n // while the index exists in the live collection\n for (// get the cached index\n var index = 0; index < uses.length; ) {\n // get the current \n var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute(\"xlink:href\") || use.getAttribute(\"href\");\n if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), \n svg && src) {\n if (polyfill) {\n if (!opts.validate || opts.validate(src, svg, use)) {\n // remove the element\n parent.removeChild(use);\n // parse the src and get the url and id\n var srcSplit = src.split(\"#\"), url = srcSplit.shift(), id = srcSplit.join(\"#\");\n // if the link is external\n if (url.length) {\n // get the cached xhr request\n var xhr = requests[url];\n // ensure the xhr request exists\n xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open(\"GET\", url), xhr.send(), \n xhr._embeds = []), // add the svg and id as an item to the xhr embeds list\n xhr._embeds.push({\n parent: parent,\n svg: svg,\n id: id\n }), // prepare the xhr ready state change event\n loadreadystatechange(xhr);\n } else {\n // embed the local id into the svg\n embed(parent, svg, document.getElementById(id));\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index, ++numberOfSvgUseElementsToBypass;\n }\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index;\n }\n }\n // continue the interval\n (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame(oninterval, 67);\n }\n var polyfill, opts = Object(rawopts), newerIEUA = /\\bTrident\\/[567]\\b|\\bMSIE (?:9|10)\\.0\\b/, webkitUA = /\\bAppleWebKit\\/(\\d+)\\b/, olderEdgeUA = /\\bEdge\\/12\\.(\\d+)\\b/, edgeUA = /\\bEdge\\/.(\\d+)\\b/, inIframe = window.top !== window.self;\n polyfill = \"polyfill\" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe;\n // create xhr requests object\n var requests = {}, requestAnimationFrame = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName(\"use\"), numberOfSvgUseElementsToBypass = 0;\n // conditionally start the interval if the polyfill is active\n polyfill && oninterval();\n }\n function getSVGAncestor(node) {\n for (var svg = node; \"svg\" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) {}\n return svg;\n }\n return svg4everybody;\n});","// 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\t// no module.id needed\n\t\t// no module.loaded needed\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// Return the exports of the module\n\treturn module.exports;\n}\n\n","require('./braintree/braintreeSFRA')();\n","require('svg4everybody')({});\n"],"names":[],"sourceRoot":""}