{"version":3,"file":"/js/admin.js","mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,qBAAqB;AACxE,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,2DAA2D,uBAAuB;AAClF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,wBAAwB,QAAQ;AAChC,wBAAwB,OAAO;AAC/B,wBAAwB,OAAO;AAC/B,wBAAwB,QAAQ;;AAEhC;AACA;AACA,wDAAwD;AACxD,iBAAiB;AACjB;AACA,kDAAkD,iEAAiE;AACnH,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA,6DAA6D;AAC7D;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,aAAa,QAAQ;AACrB;AACA,uBAAuB,OAAO;AAC9B;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gHAAgH,kBAAkB;AAClI;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gBAAgB,OAAO,4BAA4B;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gGAAgG,cAAc;AAC9G,aAAa,oCAAoC;AACjD;AACA,wCAAwC,cAAc,cAAc;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,qDAAqD,mBAAmB;AACxE;AACA;AACA;AACA;AACA,kEAAkE,QAAQ;AAC1E;AACA;AACA;AACA;AACA;AACA,sBAAsB,aAAa;AACnC;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,sDAAsD,8DAA8D;AACpH;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0BAA0B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,8CAA8C,wBAAwB;AACtE,4CAA4C,sBAAsB;AAClE;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,SAAS;;AAET;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,cAAc;AACd;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B,oBAAoB,OAAO;AAC3B,oBAAoB,QAAQ;AAC5B;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;;AAEb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI,MAAM;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,CAAC,CAAC,oCAAa;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,oCAAoC,iCAAiC;AACrE;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;AACd,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,gBAAgB,eAAe;AAC/B,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B,oBAAoB,OAAO;AAC3B,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,MAAM;AAC1B,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B,oBAAoB,QAAQ;AAC5B,oBAAoB,UAAU;AAC9B,oBAAoB,UAAU;AAC9B,sBAAsB,QAAQ;AAC9B;AACA;AACA,+CAA+C;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;AACA,SAAS;AACT;AACA;;AAEA;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,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,+CAA+C;AAC/F;AACA,aAAa;AACb;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,QAAQ;;AAER;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA4C;AAC5C,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,QAAQ;;AAER;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA,gBAAgB,QAAQ;AACxB,kBAAkB;AAClB;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB,kBAAkB;AAClB;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA,gBAAgB,QAAQ;AACxB,kBAAkB;AAClB;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB,kBAAkB;AAClB;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,6BAA6B;AAC/D;AACA,CAAC,CAAC,oCAAa;;AAEf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;;AAEb;AACA,SAAS;;AAET;AACA,yBAAyB;AACzB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,yDAAyD,qBAAqB;AAC9E;;AAEA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oDAAoD;AACpD;AACA;;AAEA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA,sBAAsB,mCAAmC;AACzD;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA,sBAAsB,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,cAAc;AACpF;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,0EAA0E,cAAc;AACxF;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,uEAAuE,cAAc;AACrF;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,gEAAgE,sBAAsB,GAAG,IAAI;AAC7F;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,qCAAqC;AACrC;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA,mCAAmC;AACnC;AACA,kCAAkC,cAAc,GAAG,cAAc;AACjE;AACA;AACA,sCAAsC,wBAAwB,GAAG,wBAAwB;AACzF,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,qCAAqC,wBAAwB;AAC7D;AACA;AACA,cAAc,QAAQ,SAAS;AAC/B;AACA,iCAAiC,kBAAkB;AACnD,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL,+BAA+B;AAC/B;AACA;AACA,kDAAkD,wBAAwB,GAAG,wBAAwB;AACrG,4DAA4D,+BAA+B;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,aAAa,wBAAwB;AACrC,aAAa;AACb,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW;AAC9B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B,2BAA2B;AAC3B;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC,4BAA4B;AAC/D;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,KAAK;;AAEL,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kBAAkB;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;;AAEL,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,yBAAyB;AACxC,eAAe,0BAA0B;AACzC,eAAe;AACf;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC,eAAe;AAChD;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC,eAAe,0BAA0B;AACzC,eAAe;AACf;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB,0BAA0B;AACnD;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB,gBAAgB;AAChB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,KAAK;;AAEL,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;AACL,mCAAmC;AACnC;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;;AAGf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;;AAGf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;;AAGf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;;AAGf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,iCAAiC,UAAU;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,8BAA8B;AAC/D;AACA;AACA;AACA,KAAK;AACL,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;;AAGf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL,gCAAgC;AAChC,8DAA8D;AAC9D;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,+BAA+B;AAC/B;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gCAAgC;AAC/C,eAAe,gCAAgC;AAC/C,eAAe;AACf;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,iBAAiB;AACjB;AACA,6BAA6B;AAC7B;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA,kDAAkD,sBAAsB;AACxE;AACA,iBAAiB;AACjB;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gEAAgE,SAAS;AACzE;AACA;AACA,oEAAoE,QAAQ;AAC5E;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;;AAE1C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,QAAQ;;AAER;AACA;AACA;;AAEA,2CAA2C;AAC3C;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,aAAa;AACb;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;;AAER;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;;AAEA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA,iDAAiD,qBAAqB;AACtE,yBAAyB;AACzB;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qBAAqB,GAAG,qBAAqB;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uCAAuC,UAAU;AACjD,aAAa;;AAEb;AACA,2CAA2C;;AAE3C;AACA;AACA;AACA;;AAEA,oCAAoC,UAAU;AAC9C;AACA,aAAa;;AAEb;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,gBAAgB;AACzC;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,MAAM;AAC1B,8BAA8B,MAAM;AACpC,kBAAkB;AAClB,8BAA8B,MAAM,iBAAiB,MAAM;AAC3D;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,MAAM;AACtC;AACA;;AAEA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,OAAO;AAC5B;AACA,2BAA2B,MAAM;AACjC,kBAAkB;AAClB,2BAA2B,MAAM;AACjC,kBAAkB;AAClB;AACA,2BAA2B,MAAM;AACjC,kBAAkB;AAClB,2BAA2B,MAAM;AACjC,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC,yBAAyB;AACjE;AACA;AACA;;AAEA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA,iDAAiD,MAAM,qCAAqC,MAAM;AAClG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,0BAA0B,MAAM;AAChC,SAAS;AACT;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,wBAAwB,MAAM;AAC9B,QAAQ;AACR;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA,KAAK;AACL;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,oCAAa;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,0BAA0B;AAC1B,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC,CAAC,oCAAa;;AAEf;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;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;AACH;AACA;AACA;AACA,yBAAyB,cAAc;AACvC;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,yBAAyB,cAAc;AACvC;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,0BAA0B,qBAAqB;AAC/C;AACA;AACA,GAAG;;AAEH;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA,GAAG;;AAEH;AACA,0BAA0B,uCAAuC;AACjE;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,2CAA2C,qBAAqB;AAChE;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D,OAAO;AACP,qCAAqC,sBAAsB;AAC3D;AACA;AACA,qCAAqC,qBAAqB;AAC1D,OAAO;AACP,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D,OAAO;AACP,qCAAqC,sBAAsB;AAC3D;AACA;AACA,qCAAqC,qBAAqB;AAC1D,OAAO;AACP,qCAAqC,sBAAsB;AAC3D;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD,6BAA6B;AAChF;;AAEA;AACA;AACA;;AAEA,iDAAiD,iCAAiC;AAClF;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA,GAAG;AACH;AACA,8CAA8C,qBAAqB;AACnE;AACA;AACA,IAAI;AACJ,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,oCAAoC,aAAa;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,gDAAgD,yBAAyB;AACzE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,0BAA0B,6BAA6B;AACvD,wBAAwB,kCAAkC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,uBAAuB;AACvB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,uCAAuC,SAAS;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,UAAU;AACtD;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF,CAAC,EAAE,oCAAa;;AAEhB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,YAAY;AACZ;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb,SAAS;;AAET;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA,QAAQ;;AAER;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA,KAAK;;AAEL,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;;AAEf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD;AACrD;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,YAAY;AACZ,QAAQ;;AAER;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,KAAK;;AAEL;;AAEA,CAAC,CAAC,oCAAa;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA,CAAC,CAAC,oCAAa;;;;;;;;;;ACjkNf;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,KAA4D,oBAAoB,mBAAO,CAAC,oDAAQ;AAClG,EAAE,CACwH;AAC1H,CAAC,gCAAgC;;AAEjC,uCAAuC,4DAA4D;;AAEnG;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA,oDAAoD;;AAEpD;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sDAAsD;AACtD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA,4FAA4F,uDAAuD,qBAAqB;AACxK;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP,MAAM;AACN;;AAEA;AACA;;AAEA,oDAAoD;;AAEpD;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;;AAGN;;AAEA;AACA;AACA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iDAAiD;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT,QAAQ;AACR;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA,sDAAsD;;AAEtD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,yBAAyB;;AAEjF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;;AAGN;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA,qDAAqD;;AAErD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;;AAGN;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD,MAAM;;;AAGN;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,oDAAoD;;AAEpD;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM;;;AAGN;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf,cAAc;AACd;;AAEA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;;AAEA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA,oDAAoD;;AAEpD;AACA;AACA;AACA;;AAEA;AACA;;AAEA,+FAA+F,aAAa;AAC5G;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;;AAGN;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sDAAsD;;AAEtD;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qDAAqD;;AAErD;AACA;AACA;;AAEA;AACA,MAAM;;;AAGN;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA,sDAAsD;;AAEtD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD;AACA,MAAM;;;AAGN;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,oDAAoD;;AAEpD;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD;AACpD,MAAM;;;AAGN;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA,sDAAsD;;AAEtD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,MAAM;;;AAGN;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yMAAyM;;AAEzM;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,sDAAsD;;AAEtD;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM;;;AAGN;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sDAAsD;;AAEtD;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;;AAGN;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA,sDAAsD;;AAEtD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iDAAiD,aAAa;;AAE9D,CAAC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACj5FAA,MAAM,CAACC,MAAP,GAAgBC,gGAAhB;AACAF,MAAM,CAACG,CAAP,GAAWH,oCAAA,GAAgBE,mBAAO,CAAC,oDAAD,CAAlC;;AACAA,mBAAO,CAAC,gEAAD,CAAP;;AACAA,mBAAO,CAAC,gFAAD,CAAP;;AACAA,mBAAO,CAAC,oGAAD,CAAP;;AACAA,mBAAO,CAAC,+CAAD,CAAP;;AACAA,mBAAO,CAAC,4DAAD,CAAP;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEAS,qBAAuB,GAAGR,CAAC,CAAC,aAAD,CAAD,CAAiBS,IAAjB,CAAsB,MAAtB,CAA1B;AAEAN,yDAAA,CAAmB;AACjBQ,EAAAA,MAAM,EAAE;AAAEC,IAAAA,QAAQ,EAAE,CAAE,oCAAF;AAAZ;AADS,CAAnB;AAIAZ,CAAC,CAAC,YAAM;AACN,MAAMa,KAAK,GAAGb,CAAC,CAAC,qBAAD,CAAD,CAAyBS,IAAzB,CAA8B,SAA9B,CAAd;AAEA,MAAMK,MAAM,GAAGd,CAAC,CAAC,UAAD,CAAhB;;AAEA,MAAIc,MAAM,CAACC,MAAX,EAAmB;AACjBX,IAAAA,kDAAA,CAAoBU,MAApB;AACD;;AAED,MAAMG,SAAS,GAAGjB,CAAC,CAAC,cAAD,CAAnB;;AAEA,MAAIiB,SAAS,CAACF,MAAd,EAAsB;AACpBE,IAAAA,SAAS,CAACC,QAAV,CAAmB;AACjBC,MAAAA,IAAI,EAAE,GADW;AAEjBC,MAAAA,MAAM,EAAE,WAFS;AAGjBC,MAAAA,MAAM,EAAE,SAHS;AAIjBC,MAAAA,KAAK,EAAE,cAJU;AAKjBC,MAAAA,MALiB,oBAKP;AACRvB,QAAAA,CAAC,CAACwB,IAAF,CAAO,mBAAP,EAA4B;AAC1BC,UAAAA,SAAS,EAAER,SAAS,CAACC,QAAV,CAAmB,SAAnB,EAA8B;AAAEQ,YAAAA,SAAS,EAAE;AAAb,WAA9B;AADe,SAA5B;AAGD;AATgB,KAAnB;AAWD;;AAED,MAAMC,SAAS,GAAG3B,CAAC,CAAC,gBAAD,CAAnB;;AAEA,MAAI2B,SAAS,CAACZ,MAAd,EAAsB;AACpBV,IAAAA,+CAAA,CAAiBsB,SAAjB;AACD;;AAED,MAAMC,UAAU,GAAG5B,CAAC,CAAC,cAAD,CAApB;;AAEA,MAAI4B,UAAU,CAACb,MAAf,EAAuB;AACrBT,IAAAA,kDAAA,CAAcsB,UAAd;AACD,GAnCK,CAqCN;;;AACA5B,EAAAA,CAAC,CAAC,aAAD,CAAD,CAAiB6B,EAAjB,CAAoB,OAApB,EAA6B,UAACC,CAAD,EAAO;AAClC,QAAMC,OAAO,GAAG/B,CAAC,CAAC8B,CAAC,CAACE,aAAH,CAAD,CAAmBC,QAAnB,CAA4B,UAA5B,CAAhB;AACAF,IAAAA,OAAO,CAACG,IAAR,CAAa,KAAb,EAAoBD,QAApB,CAA6B,QAA7B;AACAF,IAAAA,OAAO,CAACG,IAAR,CAAa,iBAAb,EAAgCC,WAAhC,CAA4C,QAA5C;AACD,GAJD;AAMAjC,EAAAA,0DAAA,CAAoB;AAAEmC,IAAAA,MAAM,EAAE;AAAV,GAApB;AAEArC,EAAAA,CAAC,CAAC,UAAD,CAAD,CAAc6B,EAAd,CAAiB,QAAjB,EAA2B,iBAA3B,EAA8CS,WAAW,CAAC,2DAAD,CAAzD;AAEAtC,EAAAA,CAAC,CAAC,gBAAD,CAAD,CAAoB6B,EAApB,CAAuB,QAAvB,EAAiCS,WAAW,CAAC,yCAAD,CAA5C,EAhDM,CAkDN;;AACAtC,EAAAA,CAAC,CAAC,eAAD,CAAD,CAAmBuC,YAAnB,CAAgC;AAC9BC,IAAAA,QAAQ,EAAE,UADoB;AAE9BC,IAAAA,QAAQ,EAAE,UAFoB;AAG9BC,IAAAA,KAAK,EAAE,MAHuB;AAI9BC,IAAAA,iBAAiB,EAAE;AAJW,GAAhC,EAKGd,EALH,CAKM,QALN,EAKgB,UAACe,KAAD,EAAW;AACzB,QAAIC,OAAO,GAAG7C,CAAC,CAAC4C,KAAK,CAACE,MAAP,CAAf;AACA9C,IAAAA,CAAC,CAAC+C,IAAF,CAAO;AACLC,MAAAA,IAAI,EAAEH,OAAO,CAACI,IAAR,CAAa,QAAb,KAA0B,KAD3B;AAELC,MAAAA,GAAG,EAAEL,OAAO,CAACI,IAAR,CAAa,KAAb,CAFA;AAGLA,MAAAA,IAAI,sBACDJ,OAAO,CAACpC,IAAR,CAAa,MAAb,CADC,EACsBoC,OAAO,CAACM,GAAR,EADtB;AAHC,KAAP;AAOD,GAdD;AAgBAnD,EAAAA,CAAC,CAACoD,SAAF,CAAY;AACVC,IAAAA,OAAO,EAAE;AAAE,sBAAgBxC;AAAlB;AADC,GAAZ;AAIAb,EAAAA,CAAC,CAACsD,QAAD,CAAD,CAAYC,SAAZ,CAAsB,UAACX,KAAD,EAAQY,KAAR,EAAkB;AACtC,QAAIC,QAAQ,GAAGD,KAAK,CAACE,YAArB;AACA,QAAIC,OAAJ;AAEAC,IAAAA,OAAO,CAACC,KAAR,CAAcJ,QAAd;;AAEA,YAAQD,KAAK,CAACM,MAAd;AACA,WAAK,GAAL;AACEH,QAAAA,OAAO,GAAGI,MAAM,CAACC,IAAP,CAAYP,QAAQ,CAACQ,MAArB,EAA6BC,MAA7B,CAAoC,UAACD,MAAD,EAASJ,KAAT,EAAmB;AAC/DI,UAAAA,MAAM,CAACE,IAAP,CAAYV,QAAQ,CAACQ,MAAT,CAAgBJ,KAAhB,EAAuBO,IAAvB,CAA4B,IAA5B,CAAZ;AACA,iBAAOH,MAAP;AACD,SAHS,EAGP,EAHO,EAGHG,IAHG,CAGE,IAHF,CAAV;AAKA;;AACF;AACET,QAAAA,OAAO,GAAGF,QAAQ,CAACE,OAAnB;AAEA;AAXF;;AAcAzD,IAAAA,oDAAA,CAAc;AACZoE,MAAAA,KAAK,EAAE,YAAYd,KAAK,CAACM,MADb;AAEZH,MAAAA,OAAO,EAAPA,OAFY;AAGZY,MAAAA,SAAS,EAAE,oBAHC;AAIZC,MAAAA,OAAO,EAAE;AACPC,QAAAA,EAAE,EAAE;AACFF,UAAAA,SAAS,EAAE;AADT;AADG;AAJG,KAAd;AAUD,GA9BD,EAvEM,CAuGN;;AAEAvE,EAAAA,CAAC,CAAC,YAAD,CAAD,CAAgB6B,EAAhB,CAAmB,QAAnB,EAA6B,UAACC,CAAD,EAAO;AAClC,QAAM4C,OAAO,GAAG1E,CAAC,CAAC8B,CAAC,CAACgB,MAAH,CAAjB;AACA,QAAM6B,IAAI,GAAGD,OAAO,CAACjE,IAAR,CAAa,MAAb,CAAb;AACA,QAAMmE,MAAM,GAAGF,OAAO,CAACjE,IAAR,CAAa,QAAb,KAA0B,OAAzC;AACA,QAAMyC,GAAG,GAAGwB,OAAO,CAACzB,IAAR,CAAa,KAAb,CAAZ;AACA,QAAM4B,MAAM,GAAGH,OAAO,CAACzB,IAAR,CAAa,QAAb,KAA0B,CAAC,CAAD,EAAI,CAAJ,CAAzC;AACA,QAAM6B,KAAK,GAAGJ,OAAO,CAACK,EAAR,CAAW,UAAX,CAAd;AACA,QAAMC,KAAK,GAAGH,MAAM,CAAC,CAACC,KAAF,CAApB;;AAEA,QAAI,CAAC5B,GAAL,EAAU;AACR;AACD;;AAEDlD,IAAAA,CAAC,CAAC+C,IAAF,CAAO;AACLG,MAAAA,GAAG,EAAEA,GADA;AAEL+B,MAAAA,QAAQ,EAAE,MAFL;AAGLL,MAAAA,MAAM,EAAEA,MAHH;AAIL3B,MAAAA,IAAI,sBAAK0B,IAAL,EAAYK,KAAZ,CAJC;AAKLE,MAAAA,OAAO,EAAE,mBAAM;AACbR,QAAAA,OAAO,CAACS,QAAR,CAAiB,OAAjB,EAA0BC,IAA1B,CAA+B,UAACC,KAAD,EAAQD,IAAR;AAAA,iBAAiBA,IAAI,IAAIJ,KAAzB;AAAA,SAA/B;AACD;AAPI,KAAP;AASD,GAtBD;;AAwBA,MAAIhF,CAAC,CAAC,UAAD,CAAD,CAAce,MAAlB,EAA0B;AACxBR,IAAAA,kDAAA;AACD;;AAEDP,EAAAA,CAAC,CAAC,uBAAD,CAAD,CAA2BsF,eAA3B,CAA2C;AACzCjD,IAAAA,MAAM,EAAE;AACNkD,MAAAA,UAAU,EAAE,SADN;AAENC,MAAAA,WAAW,EAAE,SAFP;AAGNC,MAAAA,MAAM,EAAE,YAHF;AAINC,MAAAA,SAAS,EAAE,KAJL;AAKNC,MAAAA,OAAO,EAAE,OALH;AAMNC,MAAAA,gBAAgB,EAAE,QANZ;AAONC,MAAAA,QAAQ,EAAE;AAPJ;AADiC,GAA3C;AAYA7F,EAAAA,CAAC,CAAC,wBAAD,CAAD,CAA4BsF,eAA5B,CAA4C;AAC1CjD,IAAAA,MAAM,EAAE;AACNkD,MAAAA,UAAU,EAAE,SADN;AAENC,MAAAA,WAAW,EAAE,SAFP;AAGNC,MAAAA,MAAM,EAAE,kBAHF;AAINC,MAAAA,SAAS,EAAE,KAJL;AAKNC,MAAAA,OAAO,EAAE,OALH;AAMNC,MAAAA,gBAAgB,EAAE,QANZ;AAONC,MAAAA,QAAQ,EAAE;AAPJ,KADkC;AAU1CC,IAAAA,UAAU,EAAE,IAV8B;AAW1CC,IAAAA,mBAAmB,EAAE,EAXqB;AAY1CC,IAAAA,gBAAgB,EAAE,IAZwB;AAa1CC,IAAAA,iBAAiB,EAAE;AAbuB,GAA5C;AAgBAjG,EAAAA,CAAC,CAAC,UAAD,CAAD,CAAcsF,eAAd,CAA8B;AAC5BY,IAAAA,gBAAgB,EAAE,IADU;AAE5BC,IAAAA,eAAe,EAAE,KAFW;AAG5B9D,IAAAA,MAAM,EAAE;AACNkD,MAAAA,UAAU,EAAE,SADN;AAENC,MAAAA,WAAW,EAAE,SAFP;AAGNC,MAAAA,MAAM,EAAE,YAHF;AAINC,MAAAA,SAAS,EAAE,KAJL;AAKNC,MAAAA,OAAO,EAAE,OALH;AAMNC,MAAAA,gBAAgB,EAAE,QANZ;AAONC,MAAAA,QAAQ,EAAE;AAPJ;AAHoB,GAA9B,EAYGhE,EAZH,CAYM,uBAZN,EAY+B,UAACuE,EAAD,EAAKC,MAAL,EAAgB;AAC7CrG,IAAAA,CAAC,CAACqG,MAAM,CAACC,OAAR,CAAD,CAAkBnD,GAAlB,CAAsBkD,MAAM,CAACE,SAAP,CAAiBd,MAAjB,CAAwB,YAAxB,CAAtB;AACD,GAdD;AAeD,CAhLA,CAAD;AAkLA;AACA;AACA;;AACA,SAASnD,WAAT,CAAqBkE,GAArB,EAA0B;AACxB;AACF;AACA;AACA;AACA;AACE,SAAO,UAAC5D,KAAD,EAAQ6D,SAAR,EAAsB;AAC3B,QAAIA,SAAJ,EAAe;AACb;AACD;;AAED7D,IAAAA,KAAK,CAAC8D,cAAN;AAEAxG,IAAAA,sDAAA,CAAgBsG,GAAhB,EAAqB,UAACI,MAAD,EAAY;AAC/B,UAAIA,MAAJ,EAAY;AACV5G,QAAAA,CAAC,CAAC4C,KAAK,CAACE,MAAP,CAAD,CAAgB+D,OAAhB,CAAwB,QAAxB,EAAkC,IAAlC;AACD;AACF,KAJD;AAKD,GAZD;AAaD;;;;;;;;;;;;;;;;;;ACpOD;AAEA;AACA;AACA;AACA;AACA;;AACO,SAAS7F,IAAT,CAAe8F,EAAf,EAAmB;AACxB9G,EAAAA,CAAC,CAAC8G,EAAD,CAAD,CAAMC,cAAN,CAAqB;AACnB1F,IAAAA,MAAM,EAAE,SADW;AAEnBC,IAAAA,KAAK,EAAE,kBAFY;AAGnB0F,IAAAA,gBAAgB,EAAE,8BAHC;AAInBC,IAAAA,QAAQ,EAAE,KAJS;AAKnB1F,IAAAA,MAAM,EAAE2F;AALW,GAArB;AAOD;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,SAASA,eAAT,CAAyBtE,KAAzB,EAAgCuE,EAAhC,EAAoC;AAClCnH,EAAAA,CAAC,CAAC+C,IAAF,CAAO;AACLG,IAAAA,GAAG,EAAE,uBADA;AAEL0B,IAAAA,MAAM,EAAE,MAFH;AAGL3B,IAAAA,IAAI,EAAE;AACJmE,MAAAA,QAAQ,EAAED,EAAE,CAACE,IAAH,CAAQC,OAAR,CAAgB,UAAhB,EAA4B7G,IAA5B,CAAiC,IAAjC,CADN;AAEJ8G,MAAAA,KAAK,EAAEvH,CAAC,CAAC,IAAD,CAAD,CAAQ+G,cAAR,CAAuB,aAAvB;AAFH;AAHD,GAAP;AAQD;;;;;;;;;;;;;;;;;;;;;;IChCKzG;AACJ,oBAAYwG,EAAZ,EAAgB;AAAA;;AAAA;;AACd,SAAKU,KAAL,GAAaxH,CAAC,CAAC8G,EAAD,CAAd;AACA,SAAKW,QAAL,GAAgB,KAAKD,KAAL,CAAWtF,IAAX,CAAgB,aAAhB,CAAhB;AACA,SAAKwF,QAAL,GAAgB,KAAKF,KAAL,CAAWtF,IAAX,CAAgB,mBAAhB,CAAhB;AAEA,SAAKuF,QAAL,CAAc5F,EAAd,CAAiB,QAAjB,EAA2B;AAAA,aAAM,KAAI,CAACN,MAAL,EAAN;AAAA,KAA3B;AAEA,SAAKiG,KAAL,CAAW3F,EAAX,CAAc,OAAd,EAAuB,eAAvB,EAAwC,UAACe,KAAD,EAAW;AACjD,UAAIC,OAAO,GAAG7C,CAAC,CAAC4C,KAAK,CAACE,MAAP,CAAf;;AAEA,WAAI,CAAC4E,QAAL,CAAcvE,GAAd,CAAkBN,OAAO,CAACI,IAAR,CAAa,IAAb,CAAlB;;AAEA,WAAI,CAAC1B,MAAL,GAAcoG,IAAd,CAAmB,YAAM;AACvB,aAAI,CAACH,KAAL,CAAWtF,IAAX,CAAgB,SAAhB,EAA2BC,WAA3B,CAAuC,QAAvC;;AACAU,QAAAA,OAAO,CAACyE,OAAR,CAAgB,IAAhB,EAAsBrF,QAAtB,CAA+B,QAA/B;AACD,OAHD;;AAKAW,MAAAA,KAAK,CAAC8D,cAAN;AACD,KAXD;AAYD;;;;WAED,kBAAS;AAAA;;AACP,aAAO1G,CAAC,CAAC+C,IAAF,CAAO;AACZG,QAAAA,GAAG,EAAE,KAAKsE,KAAL,CAAW/G,IAAX,CAAgB,QAAhB,CADO;AAEZmE,QAAAA,MAAM,EAAE,KAFI;AAGZ3B,QAAAA,IAAI,EAAE,KAAKuE,KAAL,CAAWI,cAAX,EAHM;AAIZC,QAAAA,UAAU,EAAE,sBAAM;AAChB,gBAAI,CAACL,KAAL,CAAWtF,IAAX,CAAgB,KAAhB,EACGC,WADH,CACe,UADf,EAEGF,QAFH,CAEY,2BAFZ;AAGD,SARW;AASZ6F,QAAAA,QAAQ,EAAE,oBAAM;AACd,gBAAI,CAACN,KAAL,CAAWtF,IAAX,CAAgB,KAAhB,EACGC,WADH,CACe,2BADf,EAEGF,QAFH,CAEY,UAFZ;AAGD,SAbW;AAcZiD,QAAAA,OAAO,EAAE,mBAAM;AACb,gBAAI,CAACsC,KAAL,CAAWtF,IAAX,CAAgB,aAAhB,EACGD,QADH,CACY,aADZ;;AAGA,gBAAI,CAACuF,KAAL,CAAWtF,IAAX,CAAgB,MAAhB,EACGC,WADH,CACe,aADf,EAEGF,QAFH,CAEY,aAFZ;AAGD;AArBW,OAAP,CAAP;AAuBD;;;;;;AAGI,SAASjB,IAAT,CAAcY,UAAd,EAA0B;AAC/BA,EAAAA,UAAU,CAACmG,IAAX,CAAgB,UAAC1C,KAAD,EAAQ2C,QAAR,EAAqB;AACnC,QAAI1H,QAAJ,CAAa0H,QAAb;AACD,GAFD;AAGD;;;;;;;;;;;;;;;;;;;;ACrDD;AAEA;AACA;AACA;;AACA,IAAIrG,SAAS,GAAG3B,CAAC,CAAC,oBAAD,CAAjB;AACA,IAAIiI,SAAJ;AAEA;AACA;AACA;AACA;AACA;;AACO,SAASjH,IAAT,CAAekH,GAAf,EAAoB;AACzBD,EAAAA,SAAS,GAAGC,GAAZ;;AAEAC,EAAAA,WAAW;;AACXC,EAAAA,OAAO;AACR;;AAED,SAASC,aAAT,CAAuBvE,MAAvB,EAA+B;AAC7B,MAAGA,MAAM,CAACwE,EAAV,EAAc;AACZ,WAAO3G,SAAS,CAAC4G,EAAV,CAAazE,MAAM,CAACwE,EAAP,GAAY,CAAzB,EAA4BE,KAA5B,EAAP;AACD;AACF;AAED;AACA;AACA;;;AACA,SAASL,WAAT,GAAwB;AACtBF,EAAAA,SAAS,CAACpG,EAAV,CAAa,QAAb,EAAuB4G,aAAvB;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASA,aAAT,CAAwB7F,KAAxB,EAA+B;AAC7B,MAAIC,OAAO,GAAG7C,CAAC,CAAC4C,KAAK,CAACE,MAAP,CAAf;AAEA9C,EAAAA,CAAC,CAAC+C,IAAF,CAAO;AACLC,IAAAA,IAAI,EAAEH,OAAO,CAACI,IAAR,CAAa,QAAb,KAA0B,KAD3B;AAELC,IAAAA,GAAG,EAAEL,OAAO,CAACI,IAAR,CAAa,KAAb,CAFA;AAGLA,IAAAA,IAAI,sBACDJ,OAAO,CAACpC,IAAR,CAAa,MAAb,CADC,EACsBoC,OAAO,CAACM,GAAR,EADtB;AAHC,GAAP;AAOD;AAED;AACA;AACA;;;AACA,SAASiF,OAAT,GAAoB;AAClBH,EAAAA,SAAS,CAACS,OAAV,CAAkB;AAChBhG,IAAAA,KAAK,EAAE,MADS;AAEhBiG,IAAAA,cAAc,EAAEN,aAFA;AAGhBO,IAAAA,iBAAiB,EAAEP;AAHH,GAAlB;AAMA;AACF;AACA;AACA;AACA;;AACEJ,EAAAA,SAAS,CAACpG,EAAV,CAAa,iCAAb,EAAgD,YAAM;AACpDoG,IAAAA,SAAS,CAACY,MAAV,GACG3G,IADH,CACQ,wBADR,EAEG4G,IAFH,CAEQ,UAFR,EAEoB,IAFpB;AAGD,GAJD;AAKD;;;;;;;;;;;;;;;;;;ACtED;AAEA,IAAIE,GAAJ,EAASC,SAAT,EAAoBC,aAApB;AAEA,IAAMC,MAAM,GAAG,IAAIJ,yDAAJ,CAAe;AAC5BK,EAAAA,cAAc,EAAEL,mFADY;AAE5BS,EAAAA,cAAc,EAAET,+EAFY;AAG5BU,EAAAA,QAAQ,EAAE,kBAAAC,OAAO;AAAA,WAAIA,OAAO,CAACpB,EAAZ;AAAA,GAHW;AAI5BqB,EAAAA,KAAK,EAAE,GAJqB;AAK5BC,EAAAA,MAAM,EAAE;AACN1G,IAAAA,GAAG,EAAE,2BADC;AAEN2G,IAAAA,QAAQ,EAAE;AAFJ;AALoB,CAAf,CAAf;AAWA,IAAMC,OAAO,GAAG;AACdnF,EAAAA,IAAI,EAAE,UADQ;AAEdoF,EAAAA,OAAO,EAAE,sBAFK;AAGdC,EAAAA,MAAM,EAAEb,MAHM;AAIdQ,EAAAA,KAAK,EAAE,EAJO;AAKdM,EAAAA,SAAS,EAAE;AACTC,IAAAA,UADS,sBACGC,OADH,EACY;AACnB,kIAGkBA,OAAO,CAACT,OAAR,CAAgBU,SAHlC,sBAGqDD,OAAO,CAACE,oBAH7D,8IAMoCF,OAAO,CAACE,oBAN5C,8EAQUF,OAAO,CAACT,OAAR,CAAgBY,MAAhB,CAAuBC,GAAvB,CAA2B,UAAAC,KAAK;AAAA,eAAIA,KAAK,CAAC7F,IAAV;AAAA,OAAhC,EAAgDP,IAAhD,CAAqD,IAArD,CARV;AAYD;AAdQ;AALG,CAAhB;AAuBO,SAASpD,IAAT,GAAiB;AACtBgI,EAAAA,GAAG,GAAGhJ,CAAC,CAAC,aAAD,CAAP;AACAiJ,EAAAA,SAAS,GAAGjJ,CAAC,CAAC,UAAD,CAAb;AACAkJ,EAAAA,aAAa,GAAGlJ,CAAC,CAAC,eAAD,CAAjB;AAEA;AACF;AACA;;AACEiJ,EAAAA,SAAS,CAACwB,SAAV,CAAoB;AAClBC,IAAAA,SAAS,EAAE,IADO;AAElBC,IAAAA,IAAI,EAAE,IAFY;AAGlBC,IAAAA,SAAS,EAAE;AAHO,GAApB,EAIGd,OAJH;;AAMA3B,EAAAA,WAAW;AACZ;;AAED,SAASA,WAAT,GAAwB;AACtBc,EAAAA,SAAS,CAACpH,EAAV,CAAa,kBAAb,EAAiC,UAACC,CAAD,EAAIqI,OAAJ,EAAgB;AAC/CnB,IAAAA,GAAG,CAAC7F,GAAJ,CAAQgH,OAAO,CAAC7B,EAAhB;AACAY,IAAAA,aAAa,CAAC2B,IAAd,CAAmBV,OAAO,CAACW,YAA3B;AACD,GAHD,EAGGjJ,EAHH,CAGM,wBAHN,EAGgC,UAACe,KAAD,EAAW;AACzC,QAAImI,QAAQ,GAAG/K,CAAC,CAAC4C,KAAK,CAACE,MAAP,CAAhB;AAEAiI,IAAAA,QAAQ,CAACzD,OAAT,CAAiB,aAAjB,EAAgCrF,QAAhC,CAAyC,0BAAzC;AACA8I,IAAAA,QAAQ,CAACC,KAAT,CAAe,8CAAf;AACD,GARD,EAQGnJ,EARH,CAQM,kBARN,EAQ0B,UAACe,KAAD,EAAW;AACnC,QAAImI,QAAQ,GAAG/K,CAAC,CAAC4C,KAAK,CAACE,MAAP,CAAhB;AAEAiI,IAAAA,QAAQ,CAACzD,OAAT,CAAiB,aAAjB,EAAgCnF,WAAhC,CAA4C,0BAA5C;AACA4I,IAAAA,QAAQ,CAACzD,OAAT,CAAiB,aAAjB,EAAgCpF,IAAhC,CAAqC,KAArC,EAA4C+I,MAA5C;AACD,GAbD;AAcD;;;;;;;;;;;;;;;;;;;ACtED;AACA;AAEAjL,CAAC,CAAC,YAAM;AACNA,EAAAA,CAAC,CAAC,eAAD,CAAD,CAAmBkL,YAAnB,CAAgC;AAC9BC,IAAAA,QAAQ,EAAE;AADoB,GAAhC,EADM,CAKN;;AACAnL,EAAAA,CAAC,CAAC,aAAD,CAAD,CAAiBoL,UAAjB,CAA4B;AAC1BlI,IAAAA,GAAG,EAAElD,CAAC,CAAC,KAAD,CAAD,CAAQiD,IAAR,CAAa,KAAb,CADqB;AAE1BgC,IAAAA,QAAQ,EAAE,MAFgB;AAG1BoG,IAAAA,KAH0B,iBAGnBzI,KAHmB,EAGZ;AACZ,UAAI0I,MAAM,GAAGtL,CAAC,CAAC4C,KAAK,CAACE,MAAP,CAAd;AAEA9C,MAAAA,CAAC,CAAC,qBAAD,CAAD,CAAyBmC,WAAzB,CAAqC,QAArC;AAEAmJ,MAAAA,MAAM,CAAChE,OAAP,CAAe,MAAf,EACGpF,IADH,CACQ,KADR,EAEGC,WAFH,CAEe,WAFf,EAGGF,QAHH,CAGY,2BAHZ;AAID,KAZyB;AAa1BsJ,IAAAA,WAb0B,uBAabzJ,CAba,EAaVmB,IAbU,EAaJ;AACpB,UAAIuI,QAAQ,GAAGC,QAAQ,CAACxI,IAAI,CAACyI,MAAL,GAAczI,IAAI,CAAC0I,KAAnB,GAA2B,GAA5B,EAAiC,EAAjC,CAAvB;AACA3L,MAAAA,CAAC,CAAC,yBAAD,CAAD,CAA6B4L,GAA7B,CAAiC,OAAjC,EAA0CJ,QAAQ,GAAG,GAArD;AACD,KAhByB;AAiB1B7D,IAAAA,IAjB0B,kBAiBlB;AAAEkE,MAAAA,QAAQ,CAACC,MAAT;AAAoB;AAjBJ,GAA5B;AAmBD,CAzBA,CAAD;;;;;;;;;;;;;;;;;;ACHAjM,MAAM,CAACG,CAAP,GAAWH,oCAAA,GAAgBE,mBAAO,CAAC,oDAAD,CAAlC;AACA;AACA;AAEA,IAAIiM,OAAJ;AAEA,IAAMC,OAAO,GAAG;AACdC,EAAAA,SAAS,EAAE,IAAInD,yDAAJ,CAAe;AACxBK,IAAAA,cAAc,EAAEL,iFAAA,CAAqC,MAArC,CADQ;AAExBS,IAAAA,cAAc,EAAET,+EAFQ;AAGxBU,IAAAA,QAAQ,EAAE,kBAAA0C,QAAQ;AAAA,aAAIA,QAAQ,CAAC7D,EAAb;AAAA,KAHM;AAIxBqB,IAAAA,KAAK,EAAE,GAJiB;AAKxBC,IAAAA,MAAM,EAAE;AACN1G,MAAAA,GAAG,EAAE,4BADC;AAEN2G,MAAAA,QAAQ,EAAE,QAFJ;AAGNuC,MAAAA,SAHM,qBAGK3I,QAHL,EAGe;AACnB,eAAOA,QAAQ,CAAC8G,GAAT,CAAa,UAAA4B,QAAQ,EAAI;AAC9BA,UAAAA,QAAQ,CAACjJ,GAAT,GAAe,gBAAgBiJ,QAAQ,CAAC7D,EAAxC;AACA,iBAAO6D,QAAP;AACD,SAHM,CAAP;AAID;AARK;AALgB,GAAf,CADG;AAkBdE,EAAAA,MAAM,EAAE,IAAItD,yDAAJ,CAAe;AACrBK,IAAAA,cAAc,EAAEL,iFAAA,CAAqC,MAArC,CADK;AAErBS,IAAAA,cAAc,EAAET,+EAFK;AAGrBU,IAAAA,QAAQ,EAAE,kBAAA6C,KAAK;AAAA,aAAIA,KAAK,CAAChE,EAAV;AAAA,KAHM;AAIrBqB,IAAAA,KAAK,EAAE,GAJc;AAKrBC,IAAAA,MAAM,EAAE;AACN1G,MAAAA,GAAG,EAAE,yBADC;AAEN2G,MAAAA,QAAQ,EAAE,QAFJ;AAGNuC,MAAAA,SAHM,qBAGK3I,QAHL,EAGe;AACnB,eAAOA,QAAQ,CAAC8G,GAAT,CAAa,UAAA+B,KAAK,EAAI;AAC3BA,UAAAA,KAAK,CAACpJ,GAAN,GAAY,aAAaoJ,KAAK,CAAChE,EAA/B;AACA,iBAAOgE,KAAP;AACD,SAHM,CAAP;AAID;AARK;AALa,GAAf,CAlBM;AAmCdC,EAAAA,QAAQ,EAAE,IAAIxD,yDAAJ,CAAe;AACvBK,IAAAA,cAAc,EAAEL,mFADO;AAEvBS,IAAAA,cAAc,EAAET,+EAFO;AAGvBU,IAAAA,QAAQ,EAAE,kBAAAC,OAAO;AAAA,aAAIA,OAAO,CAACpB,EAAZ;AAAA,KAHM;AAIvBqB,IAAAA,KAAK,EAAE,GAJgB;AAKvBC,IAAAA,MAAM,EAAE;AACN1G,MAAAA,GAAG,EAAE,2BADC;AAEN2G,MAAAA,QAAQ,EAAE,QAFJ;AAGNuC,MAAAA,SAHM,qBAGK3I,QAHL,EAGe;AACnB,eAAOA,QAAQ,CAAC8G,GAAT,CAAa,UAAAb,OAAO,EAAI;AAC7BA,UAAAA,OAAO,CAACxG,GAAR,GAAc,eAAewG,OAAO,CAACpB,EAArC;AACA,iBAAOoB,OAAP;AACD,SAHM,CAAP;AAID;AARK;AALe,GAAf;AAnCI,CAAhB;AAqDA,IAAM8C,QAAQ,GAAG;AACfN,EAAAA,SAAS,EAAE;AACTvH,IAAAA,IAAI,EAAE,WADG;AAEToF,IAAAA,OAAO,EAAE,MAFA;AAGTJ,IAAAA,KAAK,EAAE,EAHE;AAITK,IAAAA,MAAM,EAAEiC,OAAO,CAACC,SAJP;AAKTjC,IAAAA,SAAS,EAAE;AACTwC,MAAAA,QAAQ,EAAE,6DADD;AAETC,MAAAA,MAAM,EAAE,gDAFC;AAGTxC,MAAAA,UAHS,sBAGGiC,QAHH,EAGa;AACpB,gEAEcA,QAAQ,CAACQ,SAFvB,cAEoCR,QAAQ,CAACS,UAF7C,mEAGmCT,QAAQ,CAACU,KAAT,IAAkB,EAHrD,iBAG8DV,QAAQ,CAACW,KAAT,IAAkBX,QAAQ,CAACY,MAHzF;AAKD;AATQ;AALF,GADI;AAmBfV,EAAAA,MAAM,EAAE;AACN1H,IAAAA,IAAI,EAAE,QADA;AAENoF,IAAAA,OAAO,EAAE,IAFH;AAGNC,IAAAA,MAAM,EAAEiC,OAAO,CAACI,MAHV;AAIN1C,IAAAA,KAAK,EAAE,EAJD;AAKNM,IAAAA,SAAS,EAAE;AACTwC,MAAAA,QAAQ,EAAE,iEADD;AAETC,MAAAA,MAAM,EAAE,oDAFC;AAGTxC,MAAAA,UAHS,sBAGGoC,KAHH,EAGU;AACjB,gEAEcA,KAAK,CAAChE,EAFpB,mEAGoCgE,KAAK,CAACK,SAH1C,cAGyDL,KAAK,CAACM,UAH/D,iEAIoCb,6CAAM,CAACO,KAAK,CAACU,IAAP,CAAN,CAAmBvH,MAAnB,CAA0B,IAA1B,CAJpC;AAMD;AAVQ;AALL,GAnBO;AAsCf8G,EAAAA,QAAQ,EAAE;AACR5H,IAAAA,IAAI,EAAE,UADE;AAERoF,IAAAA,OAAO,EAAE,MAFD;AAGRC,IAAAA,MAAM,EAAEiC,OAAO,CAACM,QAHR;AAIR5C,IAAAA,KAAK,EAAE,EAJC;AAKRM,IAAAA,SAAS,EAAE;AACTwC,MAAAA,QAAQ,EAAE,8DADD;AAETC,MAAAA,MAAM,EAAE,wDAFC;AAGTxC,MAAAA,UAHS,sBAGGR,OAHH,EAGY;AACnB,0IAGkBA,OAAO,CAACU,SAH1B,sBAG6CV,OAAO,CAAC/E,IAHrD,oJAMoC+E,OAAO,CAAC/E,IAN5C,kFAQU+E,OAAO,CAACY,MAAR,CAAeC,GAAf,CAAmB,UAAAC,KAAK;AAAA,iBAAIA,KAAK,CAAC7F,IAAV;AAAA,SAAxB,EAAwCP,IAAxC,CAA6C,IAA7C,CARV;AAYD;AAhBQ;AALH;AAtCK,CAAjB;AAgEApE,CAAC,CAAC;AAAA,SAAMgB,IAAI,EAAV;AAAA,CAAD,CAAD;;AAEA,SAASA,IAAT,GAAgB;AACdgL,EAAAA,OAAO,GAAGhM,CAAC,CAAC,SAAD,CAAX;AAEAgM,EAAAA,OAAO,CAAC9J,IAAR,CAAa,OAAb,EAAsBuI,SAAtB,CAAgC;AAC9BwC,IAAAA,KAAK,EAAE,IADuB;AAE9BvC,IAAAA,SAAS,EAAE,IAFmB;AAG9BC,IAAAA,IAAI,EAAE,IAHwB;AAI9BC,IAAAA,SAAS,EAAE;AAJmB,GAAhC,EAMA4B,QAAQ,CAACH,MANT,EAOAG,QAAQ,CAACN,SAPT,EAQAM,QAAQ,CAACD,QART;;AAWApE,EAAAA,WAAW;AACZ;;AAED,SAASA,WAAT,GAAuB;AACrB6D,EAAAA,OAAO,CACJnK,EADH,CACM,kBADN,EAC0BqL,SAD1B,EAEGrL,EAFH,CAEM,wBAFN,EAEgC,YAAM;AAClCmK,IAAAA,OAAO,CAAC9J,IAAR,CAAa,OAAb,EAAsBD,QAAtB,CAA+B,SAA/B;AACD,GAJH,EAKGJ,EALH,CAKM,kBALN,EAK0B,YAAM;AAC5BmK,IAAAA,OAAO,CAAC9J,IAAR,CAAa,OAAb,EAAsBC,WAAtB,CAAkC,SAAlC;AACD,GAPH;AAQD;;AAED,SAAS+K,SAAT,CAAmBpL,CAAnB,EAAsBoI,UAAtB,EAAkC;AAChCrK,EAAAA,MAAM,CAACgM,QAAP,CAAgBsB,IAAhB,GAAuBjD,UAAU,CAAChH,GAAlC;AACD;;;;;;;;;;;;;;AC3JDrD,MAAM,CAACG,CAAP,GAAWH,oCAAA,GAAgBE,mBAAO,CAAC,oDAAD,CAAlC;;AACAA,mBAAO,CAAC,8EAAD,CAAP;;AACAA,mBAAO,CAAC,8IAAD,CAAP;;AAEAC,CAAC,CAACoN,EAAF,CAAKC,YAAL,CAAkB7I,OAAlB;AAQAxE,CAAC,CAACoN,EAAF,CAAKE,QAAL,CAAcC,QAAd,CAAuBC,WAAvB,GAAqC;AAAExK,EAAAA,IAAI,EAAE;AAAR,CAArC;AAEAhD,CAAC,CAACoN,EAAF,CAAKE,QAAL,CAAcC,QAAd,CAAuBE,SAAvB,GAAmC,MAAnC;;AAEAzN,CAAC,CAACoN,EAAF,CAAKE,QAAL,CAAcC,QAAd,CAAuBxD,OAAvB,GAAiC,UAAU/E,KAAV,EAAiB;AAChD,MAAI0I,QAAQ,GAAG1N,CAAC,CAAC,IAAD,CAAhB;;AAEA,UAAO0N,QAAQ,CAACzK,IAAT,CAAc,QAAd,CAAP;AACA,SAAK,UAAL;AACEyK,MAAAA,QAAQ,CAACtI,IAAT,CAAc,OAAOJ,KAArB;AACA;;AACF,SAAK,YAAL;AACE0I,MAAAA,QAAQ,CAACtI,IAAT,CAAcJ,KAAK,GAAG,GAAtB;AACA;;AACF;AACE0I,MAAAA,QAAQ,CAACtI,IAAT,CAAcJ,KAAd;AARF;AAUD,CAbD;;AAeAhF,CAAC,CAACoN,EAAF,CAAKE,QAAL,CAAcC,QAAd,CAAuBrI,OAAvB,GAAiC,YAAY;AAC3C,MAAGlF,CAAC,CAAC,IAAD,CAAD,CAAQiD,IAAR,CAAa,SAAb,CAAH,EAA4B;AAC1B4I,IAAAA,QAAQ,CAACC,MAAT;AACD;;AAED,SAAO,IAAP;AACD,CAND;;AAQA9L,CAAC,CAAC,YAAM;AACNA,EAAAA,CAAC,CAAC,aAAD,CAAD,CAAiBsN,QAAjB,CAA0B;AACxBK,IAAAA,MAAM,EAAE,sBAAqB;AAAA,UAAlBhJ,IAAkB,QAAlBA,IAAkB;AAAA,UAAZK,KAAY,QAAZA,KAAY;AAC3B,iCAAUL,IAAV,EAAiBK,KAAjB;AACD;AAHuB,GAA1B;AAKD,CANA,CAAD;;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,CAAC;AACD;AACA,QAAQ,IAA0C;AAClD;AACA,QAAQ,iCAAO;AACf,YAAY,yEAAQ;AACpB,YAAY,uFAAqB;AACjC,SAAS,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AACnB,MAAM,KAAK,EASN;AACL,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE,qBAAqB;AACrB;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;;AAEb;;AAEA;AACA,4CAA4C;;AAE5C;AACA,0CAA0C;;AAE1C;AACA,0CAA0C;;AAE1C;AACA,0CAA0C;;AAE1C;AACA,4CAA4C;;AAE5C;AACA,8CAA8C;;AAE9C;AACA,iDAAiD;;AAEjD;AACA,qCAAqC;;AAErC;AACA,oCAAoC;;AAEpC;AACA,4CAA4C;;AAE5C;AACA,2CAA2C;;AAE3C;AACA,0CAA0C;;AAE1C;AACA,wCAAwC;;AAExC;AACA,qDAAqD;;AAErD;AACA,+CAA+C;;AAE/C;AACA,+CAA+C;;AAE/C;AACA,+CAA+C;;AAE/C;AACA,iDAAiD;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,yBAAyB;AAC5D,iBAAiB;AACjB;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,kBAAkB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,kBAAkB;AAC9D;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA,kBAAkB;AAClB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,qCAAqC;AACrC;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,kBAAkB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,kBAAkB;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,kBAAkB;AACtD;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,qBAAqB;AACrB;AACA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iCAAiC;AAC3D,cAAc;AACd;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,kBAAkB;AAC7D;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,0CAA0C,kBAAkB;AAC5D;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,kBAAkB;AAC/D;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,8BAA8B,IAAI;AAClC,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,+BAA+B,iBAAiB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;AACd;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL,CAAC;;;;;;;;;;;AC9/CD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAA0C;AAChD;AACA,IAAI,iCAAO,CAAC,yEAAQ,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AAC/B,IAAI,KAAK,EAMN;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gBAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,gBAAgB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE;AAClC;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;ACj5CD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,IAA0C;AAClD;AACA,QAAQ,iCAAO,CAAC,oEAAQ,EAAE,yEAAQ,CAAC,mCAAE;AACrC,4CAA4C;AAC5C;AACA;AACA,SAAS;AAAA,kGAAC;AACV,MAAM,KAAK,uBAaN;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,QAAQ;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,8CAA8C,GAAG;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,cAAc;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,SAAS;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,SAAS;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,UAAU;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,qBAAqB;AACrB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,kBAAkB;AAClB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4DAA4D,uBAAuB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,eAAe;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;ACziDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAA0C;AAChD;AACA,IAAI,iCAAO,CAAC,yEAAQ,CAAC,mCAAE;AACvB;AACA,KAAK;AAAA,kGAAC;AACN,IAAI,KAAK,EAON;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uIAAuI;AACvI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,SAAS;AAC1D;AACA;AACA,8CAA8C,UAAU;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,UAAU;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA,eAAe;AACf;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,aAAa;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,SAAS;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,SAAS;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,yBAAyB;AAC/B;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,cAAc;AACd,cAAc;AACd,gBAAgB;AAChB,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,EAAE;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,gBAAgB;AAChB,iBAAiB;AACjB,cAAc;AACd;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,EAAE;AAC5C;AACA,oCAAoC,GAAG,mBAAmB,GAAG;AAC7D,KAAK;AACL;AACA;AACA,yCAAyC,GAAG,8BAA8B,GAAG;AAC7E,iDAAiD,GAAG,oCAAoC,GAAG;AAC3F;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6FAA6F;AAC7F,wDAAwD;AACxD;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,wBAAwB;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA,2DAA2D,SAAS;AACpE;AACA;AACA;AACA,4BAA4B;AAC5B,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,SAAS;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,0BAA0B;AACnF,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,+BAA+B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,EAAE,uCAAuC,EAAE;AAChF,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2CAA2C;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mDAAmD;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,kCAAkC,6BAA6B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,0DAA0D,EAAE;AAC5D,6DAA6D,EAAE;AAC/D;AACA,yBAAyB,KAAK;AAC9B;AACA;AACA,8CAA8C,IAAI;AAClD,oDAAoD,IAAI;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,wCAAwC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,cAAc;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,SAAS;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,yDAAyD;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,UAAU,yDAAyD;AACnE;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2CAA2C;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kFAAkF,yCAAyC;AAC3H,kFAAkF,yCAAyC;AAC3H,kFAAkF,yCAAyC;AAC3H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,yDAAyD;AAC3F,uCAAuC,wGAAwG;AAC/I;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH,CAAC;AACD;AACA;AACA,CAAC;AACD;;;;;;;;;;AC5pGA;AACA;AACA;AACA,6DAA6D;AAC7D;;;AAGA;AACA,QAAQ,IAA0C;AAClD,QAAQ,iCAAO,EAAE,yEAAQ,EAAE,mCAAE;AAC7B;AACA,SAAS;AAAA,kGAAC;AACV,MAAM,KAAK,EAIN;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA,+CAA+C,EAAE;AACjD,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA,wCAAwC;AACxC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,sCAAsC,KAAK;AAC3C;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,SAAS;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,qBAAqB;AACrB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA,CAAC;;AAED;AACA,QAAQ,IAA0C;AAClD,QAAQ,iCAAO,EAAE,yEAAQ,EAAE,mCAAE;AAC7B;AACA,SAAS;AAAA,kGAAC;AACV,MAAM,KAAK,EAIN;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA,+CAA+C,EAAE;AACjD,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA,wCAAwC;AACxC,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD,iBAAiB;AACjB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,uBAAuB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,cAAc;AACd;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0BAA0B;AAC1D;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,SAAS;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,GAAG;AACpE;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,kBAAkB;AAClB;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;;;;;;;;;;;AChlFD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;;AAEA,kCAAkC;;AAElC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C,sBAAsB;AACpE,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,6BAA6B,QAAQ,EAAE,sBAAsB,EAAE,sBAAsB;AACrF;AACA;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA,kBAAkB;AAClB;AACA,wBAAwB,qDAAqD;AAC7E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,wBAAwB;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC,EAAE,oCAAa;;;;;;;;;;ACtKhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAQ,EAAE,yEAAQ,EAAE,8EAAW,EAAE,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AAC9C,GAAG,KAAK,EAIN;AACF,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,EAAE;AACF,EAAE;;;;;;;;;;;ACtCF;AACA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAQ,EAAE,yEAAQ,EAAE,8EAAW,EAAE,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AAC9C,GAAG,KAAK,EAIN;AACF,EAAE;;AAEF;AACA;AACA,EAAE;;;;;;;;;;;ACdF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAQ,EAAE,yEAAQ,EAAE,8EAAW,EAAE,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AAC9C,GAAG,KAAK,EAIN;AACF,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA,EAAE;;;;;;;;;;;AC5CF;AACA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAQ,EAAE,yEAAQ,EAAE,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AACjC,GAAG,KAAK,EAIN;AACF,EAAE;;AAEF;;AAEA;;AAEA,EAAE;;;;;;;;;;;AChBF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAQ,EAAE,yEAAQ,EAAE,8EAAW,EAAE,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AAC9C,GAAG,KAAK,EAIN;AACF,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA,eAAe,+BAA+B;AAC9C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,0BAA0B;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA,yBAAyB;;AAEzB;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa;AACb;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA,EAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,6BAA6B;AAC7B;;AAEA;;AAEA,+CAA+C,OAAO;AACtD;AACA;AACA;AACA;AACA,oDAAoD;AACpD,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA,6BAA6B,kBAAkB;AAC/C,EAAE;;AAEF;AACA,6BAA6B,iBAAiB;AAC9C,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,EAAE;;AAEF;AACA;AACA,EAAE;;AAEF;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAU,iCAAiC;AAC3C;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,EAAE;;AAEF;;AAEA,EAAE;;;;;;;;;;;AC5tBF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAQ;AACV,GAAG,yEAAQ;AACX,GAAG,qEAAO;AACV,GAAG,+EAAY;AACf,GAAG,6EAAW;AACd,GAAG,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AACd,GAAG,KAAK,EAIN;AACF,CAAC;;AAED;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,EAAE;;AAEF;AACA,wCAAwC;AACxC,uCAAuC;AACvC,uCAAuC;AACvC,0CAA0C;AAC1C,EAAE;;AAEF,EAAE;;;;;;;;;;;ACjOF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAQ;AACV,GAAG,yEAAQ;AACX,GAAG,kFAAS;AACZ,GAAG,yEAAS;AACZ,GAAG,qEAAO;AACV,GAAG,2FAAkB;AACrB,GAAG,+EAAY;AACf,GAAG,6EAAW;AACd,GAAG,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AACd,GAAG,KAAK,EAIN;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,EAAE;;AAEF;AACA;;AAEA,uCAAuC,QAAQ;AAC/C;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY;AACZ;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2CAA2C;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA,kBAAkB,sCAAsC;AACxD;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAEA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC,QAAQ;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA,EAAE;;AAEF;;AAEA;;AAEA,4CAA4C,eAAe;;AAE3D;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA,EAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;;AAEA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,sDAAsD;;AAEtD;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,QAAQ;AAC7C;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,gDAAgD;AACjF;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,QAAQ;AACxC;AACA;;AAEA;;AAEA,EAAE;;AAEF;;AAEA;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ,EAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yDAAyD,yBAAyB;AAClF;AACA;;AAEA;AACA;AACA,qCAAqC,QAAQ;AAC7C;AACA,8BAA8B,QAAQ;AACtC;AACA;AACA;AACA;AACA,2CAA2C,yBAAyB;AACpE;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC,QAAQ;AACxC;AACA;;AAEA,iDAAiD,mBAAmB;AACpE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mCAAmC,QAAQ;AAC3C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ,yCAAyC,QAAQ;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,EAAE;;AAEF;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA,IAAI;AACJ,EAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA,wCAAwC,QAAQ;;AAEhD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,YAAY;AACZ;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ,EAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,qCAAqC;AACrC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,4BAA4B;;AAE5C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,EAAE;;AAEF;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF,EAAE;;;;;;;;;;;ACjhDF;AACA;AACA,+BAA+B;AAC/B;AACA,MAAM,IAA0C;AAChD;AACA,IAAI,iCAAO,CAAC,yEAAQ,CAAC,mCAAE;AACvB;AACA,KAAK;AAAA,kGAAC;AACN,IAAI,KAAK,EAON;AACH,CAAC;;AAED;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,cAAc;AACd;AACA;AACA,kBAAkB;AAClB;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb,SAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,wBAAwB;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;;AAET;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gBAAgB,QAAQ;AACxB,iBAAiB,QAAQ;AACzB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA,UAAU;;AAEV;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,qBAAqB;AACzC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,QAAQ;AACxB,gBAAgB,SAAS;AACzB,gBAAgB,SAAS;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,kBAAkB;AAClB;AACA,kBAAkB;AAClB;AACA;;AAEA;;AAEA,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb,SAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,QAAQ;AACxB,gBAAgB,SAAS;AACzB,gBAAgB,SAAS;AACzB,gBAAgB,QAAQ;AACxB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;;AAEA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB,cAAc;;AAEd;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA;AACA;;AAEA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,iBAAiB;;AAEjB,cAAc;AACd;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,aAAa;AACb;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,cAAc;;AAEd;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,aAAa;AACb;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,SAAS;;AAET;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA;;AAEA,aAAa;;AAEb;AACA;AACA,aAAa;;AAEb;;AAEA;AACA;AACA;AACA;AACA;;AAEA,aAAa;;AAEb;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA,CAAC;;;AAGD,CAAC;;;;;;;;;;;ACj2CD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACnSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM,IAA0C;;AAEhD;AACA,EAAE,iCAAO;AACT,GAAG,yEAAQ;AACX,GAAG,mGAAuB;AAC1B,GAAG,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAE;AACd,GAAG,KAAK,EAIN;AACF,CAAC;AACD;;AAEA;AACA;AACA;;AAEA,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA,SAAS;AACT;AACA;AACA,QAAQ;AACR;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D;AAC9D,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;AAC3C;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA,GAAG;;AAEH;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;AACA,IAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;;AAEA,8BAA8B,sBAAsB;;AAEpD;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ,mCAAmC,2BAA2B;;AAE9D;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA,EAAE;;AAEF;AACA,IAAI;AACJ;AACA;AACA;AACA,CAAC;;;;;;;;;;;;AC14BD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,MAAM,IAA0C;AAChD;AACA,IAAI,iCAAO,CAAC,yEAAQ,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AAC/B,IAAI,KAAK,EAqBN;AACH,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAe;AACtB,WAAW,WAAW,OAAO;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB,oBAAoB;AACpB,mBAAmB;AACnB,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,uCAAuC,OAAO;AAC9C;;AAEA;AACA;AACA;AACA,+CAA+C,OAAO;AACtD;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,cAAc;AACd,0CAA0C;AAC1C;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA,kBAAkB;AAClB,uFAAuF;AACvF;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;;AAEA;AACA;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;AACA;AACA,CAAC;;AAED,yBAAyB,qBAAqB;AAC9C;AACA,CAAC;AACD,gCAAgC;;AAEhC;AACA;AACA,qBAAqB,CAAC;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA,sBAAsB;;AAEtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAoB,yBAAyB;AAC7C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,oBAAoB,6BAA6B;AACjD;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,SAAS;AACrD;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,oBAAoB,YAAY;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB,iBAAiB;AACjB,gBAAgB;AAChB,gBAAgB;AAChB,kBAAkB;AAClB,kBAAkB;AAClB,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,oCAAoC;AACpC,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;;AAEA,oBAAoB,yBAAyB;AAC7C;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;;AAEP,KAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,sBAAsB,0BAA0B;AAChD;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAAgC;AAChC,QAAQ;AACR;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV,kCAAkC;AAClC;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,wBAAwB,iBAAiB;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP,MAAM;AACN;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,sBAAsB,wBAAwB;AAC9C;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB,sBAAsB;AAC5C;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;AACtB;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;AACA;;AAEA;AACA,uCAAuC;;AAEvC;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAsB;AACtB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,OAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,sBAAsB,iBAAiB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC;AAClC;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kCAAkC,QAAQ;AAC1C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA4B,GAAG,QAAQ;;AAEvC;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,oBAAoB,6BAA6B;AACjD;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA,+CAA+C,QAAQ;AACvD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA,oBAAoB,sBAAsB;AAC1C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,oBAAoB,sBAAsB;AAC1C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB,gCAAgC;AACvD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC;;AAEA;AACA,gCAAgC;;AAEhC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,gCAAgC;;AAEhC,wCAAwC,OAAO;AAC/C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,+BAA+B;AAC/B;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU;AACV,2CAA2C;;AAE3C;AACA,UAAU;AACV,2CAA2C;;AAE3C;AACA,UAAU;AACV,6CAA6C;;AAE7C;AACA,UAAU;AACV,yCAAyC;;AAEzC;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gCAAgC;AAChC,MAAM;AACN,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,sBAAsB,iCAAiC;AACvD;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B,qBAAqB;AACjD;;AAEA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iDAAiD;;AAEjD;AACA,SAAS;;AAET;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC","sources":["webpack://contraversus-assets/./node_modules/X-editable/dist/bootstrap4-editable/js/bootstrap-editable.js","webpack://contraversus-assets/./node_modules/admin-lte/dist/js/adminlte.js","webpack://contraversus-assets/./resources/assets/js/admin/main.js","webpack://contraversus-assets/./resources/assets/js/admin/nested-sortable.js","webpack://contraversus-assets/./resources/assets/js/admin/order-shipment.js","webpack://contraversus-assets/./resources/assets/js/admin/order-status.js","webpack://contraversus-assets/./resources/assets/js/admin/product-search.js","webpack://contraversus-assets/./resources/assets/js/admin/product.js","webpack://contraversus-assets/./resources/assets/js/admin/search.js","webpack://contraversus-assets/./resources/assets/js/admin/x-editable.js","webpack://contraversus-assets/./node_modules/blueimp-file-upload/js/jquery.fileupload.js","webpack://contraversus-assets/./node_modules/bootbox/bootbox.all.js","webpack://contraversus-assets/./node_modules/bootstrap-daterangepicker/daterangepicker.js","webpack://contraversus-assets/./node_modules/bootstrap-select/dist/js/bootstrap-select.js","webpack://contraversus-assets/./node_modules/corejs-typeahead/dist/typeahead.bundle.js","webpack://contraversus-assets/./node_modules/jquery-chained/jquery.chained.remote.js","webpack://contraversus-assets/./node_modules/jquery-ui/ui/data.js","webpack://contraversus-assets/./node_modules/jquery-ui/ui/ie.js","webpack://contraversus-assets/./node_modules/jquery-ui/ui/scroll-parent.js","webpack://contraversus-assets/./node_modules/jquery-ui/ui/version.js","webpack://contraversus-assets/./node_modules/jquery-ui/ui/widget.js","webpack://contraversus-assets/./node_modules/jquery-ui/ui/widgets/mouse.js","webpack://contraversus-assets/./node_modules/jquery-ui/ui/widgets/sortable.js","webpack://contraversus-assets/./node_modules/lightgallery/dist/js/lightgallery.js","webpack://contraversus-assets//home/user2/seb/contraversus/node_modules/moment/locale|sync|/^\\.\\/.*$/","webpack://contraversus-assets/./node_modules/nestedSortable/jquery.mjs.nestedSortable.js","webpack://contraversus-assets/./node_modules/select2/dist/js/select2.js"],"sourcesContent":["/*! X-editable - v1.5.3 \n* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery\n* http://github.com/vitalets/x-editable\n* Copyright (c) 2018 Vitaliy Potapov; Licensed MIT */\n/**\nForm with single input element, two buttons and two states: normal/loading.\nApplied as jQuery method to DIV tag (not to form tag!). This is because form can be in loading state when spinner shown.\nEditableform is linked with one of input types, e.g. 'text', 'select' etc.\n\n@class editableform\n@uses text\n@uses textarea\n**/\n(function ($) {\n    \"use strict\";\n    \n    var EditableForm = function (div, options) {\n        this.options = $.extend({}, $.fn.editableform.defaults, options);\n        this.$div = $(div); //div, containing form. Not form tag. Not editable-element.\n        if(!this.options.scope) {\n            this.options.scope = this;\n        }\n        //nothing shown after init\n    };\n\n    EditableForm.prototype = {\n        constructor: EditableForm,\n        initInput: function() {  //called once\n            //take input from options (as it is created in editable-element)\n            this.input = this.options.input;\n            \n            //set initial value\n            //todo: may be add check: typeof str === 'string' ? \n            this.value = this.input.str2value(this.options.value); \n            \n            //prerender: get input.$input\n            this.input.prerender();\n        },\n        initTemplate: function() {\n            this.$form = $($.fn.editableform.template); \n        },\n        initButtons: function() {\n            var $btn = this.$form.find('.editable-buttons');\n            $btn.append($.fn.editableform.buttons);\n            if(this.options.showbuttons === 'bottom') {\n                $btn.addClass('editable-buttons-bottom');\n            }\n        },\n        /**\n        Renders editableform\n\n        @method render\n        **/        \n        render: function() {\n            //init loader\n            this.$loading = $($.fn.editableform.loading);        \n            this.$div.empty().append(this.$loading);\n            \n            //init form template and buttons\n            this.initTemplate();\n            if(this.options.showbuttons) {\n                this.initButtons();\n            } else {\n                this.$form.find('.editable-buttons').remove();\n            }\n\n            //show loading state\n            this.showLoading();            \n            \n            //flag showing is form now saving value to server. \n            //It is needed to wait when closing form.\n            this.isSaving = false;\n            \n            /**        \n            Fired when rendering starts\n            @event rendering \n            @param {Object} event event object\n            **/            \n            this.$div.triggerHandler('rendering');\n            \n            //init input\n            this.initInput();\n            \n            //append input to form\n            this.$form.find('div.editable-input').append(this.input.$tpl);            \n            \n            //append form to container\n            this.$div.append(this.$form);\n            \n            //render input\n            $.when(this.input.render())\n            .then($.proxy(function () {\n                //setup input to submit automatically when no buttons shown\n                if(!this.options.showbuttons) {\n                    this.input.autosubmit(); \n                }\n                 \n                //attach 'cancel' handler\n                this.$form.find('.editable-cancel').click($.proxy(this.cancel, this));\n                \n                if(this.input.error) {\n                    this.error(this.input.error);\n                    this.$form.find('.editable-submit').attr('disabled', true);\n                    this.input.$input.attr('disabled', true);\n                    //prevent form from submitting\n                    this.$form.submit(function(e){ e.preventDefault(); });\n                } else {\n                    this.error(false);\n                    this.input.$input.removeAttr('disabled');\n                    this.$form.find('.editable-submit').removeAttr('disabled');\n                    var value = (this.value === null || this.value === undefined || this.value === '') ? this.options.defaultValue : this.value;\n                    this.input.value2input(value);\n                    //attach submit handler\n                    this.$form.submit($.proxy(this.submit, this));\n                }\n\n                /**        \n                Fired when form is rendered\n                @event rendered\n                @param {Object} event event object\n                **/            \n                this.$div.triggerHandler('rendered');                \n\n                this.showForm();\n                \n                //call postrender method to perform actions required visibility of form\n                if(this.input.postrender) {\n                    this.input.postrender();\n                }                \n            }, this));\n        },\n        cancel: function() {   \n            /**        \n            Fired when form was cancelled by user\n            @event cancel \n            @param {Object} event event object\n            **/              \n            this.$div.triggerHandler('cancel');\n        },\n        showLoading: function() {\n            var w, h;\n            if(this.$form) {\n                //set loading size equal to form\n                w = this.$form.outerWidth();\n                h = this.$form.outerHeight(); \n                if(w) {\n                    this.$loading.width(w);\n                }\n                if(h) {\n                    this.$loading.height(h);\n                }\n                this.$form.hide();\n            } else {\n                //stretch loading to fill container width\n                w = this.$loading.parent().width();\n                if(w) {\n                    this.$loading.width(w);\n                }\n            }\n            this.$loading.show(); \n        },\n\n        showForm: function(activate) {\n            this.$loading.hide();\n            this.$form.show();\n            if(activate !== false) {\n                this.input.activate(); \n            }\n            /**        \n            Fired when form is shown\n            @event show \n            @param {Object} event event object\n            **/                    \n            this.$div.triggerHandler('show');\n        },\n\n        error: function(msg) {\n            var $group = this.$form.find('.control-group'),\n                $block = this.$form.find('.editable-error-block'),\n                lines;\n\n            if(msg === false) {\n                $group.removeClass($.fn.editableform.errorGroupClass);\n                $block.removeClass($.fn.editableform.errorBlockClass).empty().hide(); \n            } else {\n                //convert newline to <br> for more pretty error display\n                if(msg) {\n                    lines = (''+msg).split('\\n');\n                    for (var i = 0; i < lines.length; i++) {\n                        lines[i] = $('<div>').text(lines[i]).html();\n                    }\n                    msg = lines.join('<br>');\n                }\n                $group.addClass($.fn.editableform.errorGroupClass);\n                $block.addClass($.fn.editableform.errorBlockClass).html(msg).show();\n            }\n        },\n\n        submit: function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            \n            //get new value from input\n            var newValue = this.input.input2value(); \n\n            //validation: if validate returns string or truthy value - means error\n            //if returns object like {newValue: '...'} => submitted value is reassigned to it\n            var error = this.validate(newValue);\n            if ($.type(error) === 'object' && error.newValue !== undefined) {\n                newValue = error.newValue;\n                this.input.value2input(newValue);\n                if(typeof error.msg === 'string') {\n                    this.error(error.msg);\n                    this.showForm();\n                    return;\n                }\n            } else if (error) {\n                this.error(error);\n                this.showForm();\n                return;\n            } \n            \n            //if value not changed --> trigger 'nochange' event and return\n            /*jslint eqeq: true*/\n            if (!this.options.savenochange && this.input.value2str(newValue) === this.input.value2str(this.value)) {\n            /*jslint eqeq: false*/                \n                /**        \n                Fired when value not changed but form is submitted. Requires savenochange = false.\n                @event nochange \n                @param {Object} event event object\n                **/                    \n                this.$div.triggerHandler('nochange');            \n                return;\n            } \n\n            //convert value for submitting to server\n            var submitValue = this.input.value2submit(newValue);\n            \n            this.isSaving = true;\n            \n            //sending data to server\n            $.when(this.save(submitValue))\n            .done($.proxy(function(response) {\n                this.isSaving = false;\n\n                //run success callback\n                var res = typeof this.options.success === 'function' ? this.options.success.call(this.options.scope, response, newValue) : null;\n\n                //if success callback returns false --> keep form open and do not activate input\n                if(res === false) {\n                    this.error(false);\n                    this.showForm(false);\n                    return;\n                }\n\n                //if success callback returns string -->  keep form open, show error and activate input               \n                if(typeof res === 'string') {\n                    this.error(res);\n                    this.showForm();\n                    return;\n                }\n\n                //if success callback returns object like {newValue: <something>} --> use that value instead of submitted\n                //it is useful if you want to chnage value in url-function\n                if(res && typeof res === 'object' && res.hasOwnProperty('newValue')) {\n                    newValue = res.newValue;\n                }\n\n                //clear error message\n                this.error(false);   \n                this.value = newValue;\n                /**        \n                Fired when form is submitted\n                @event save \n                @param {Object} event event object\n                @param {Object} params additional params\n                @param {mixed} params.newValue raw new value\n                @param {mixed} params.submitValue submitted value as string\n                @param {Object} params.response ajax response\n\n                @example\n                $('#form-div').on('save'), function(e, params){\n                    if(params.newValue === 'username') {...}\n                });\n                **/\n                this.$div.triggerHandler('save', {newValue: newValue, submitValue: submitValue, response: response});\n            }, this))\n            .fail($.proxy(function(xhr) {\n                this.isSaving = false;\n\n                var msg;\n                if(typeof this.options.error === 'function') {\n                    msg = this.options.error.call(this.options.scope, xhr, newValue);\n                } else {\n                    msg = typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!';\n                }\n\n                this.error(msg);\n                this.showForm();\n            }, this));\n        },\n\n        save: function(submitValue) {\n            //try parse composite pk defined as json string in data-pk \n            this.options.pk = $.fn.editableutils.tryParseJson(this.options.pk, true); \n            \n            var pk = (typeof this.options.pk === 'function') ? this.options.pk.call(this.options.scope) : this.options.pk,\n            /*\n              send on server in following cases:\n              1. url is function\n              2. url is string AND (pk defined OR send option = always) \n            */\n            send = !!(typeof this.options.url === 'function' || (this.options.url && ((this.options.send === 'always') || (this.options.send === 'auto' && pk !== null && pk !== undefined)))),\n            params;\n\n            if (send) { //send to server\n                this.showLoading();\n\n                //standard params\n                params = {\n                    name: this.options.name || '',\n                    value: submitValue,\n                    pk: pk \n                };\n\n                //additional params\n                if(typeof this.options.params === 'function') {\n                    params = this.options.params.call(this.options.scope, params);  \n                } else {\n                    //try parse json in single quotes (from data-params attribute)\n                    this.options.params = $.fn.editableutils.tryParseJson(this.options.params, true);   \n                    $.extend(params, this.options.params);\n                }\n\n                if(typeof this.options.url === 'function') { //user's function\n                    return this.options.url.call(this.options.scope, params);\n                } else {  \n                    //send ajax to server and return deferred object\n                    return $.ajax($.extend({\n                        url     : this.options.url,\n                        data    : params,\n                        type    : 'POST'\n                    }, this.options.ajaxOptions));\n                }\n            }\n        }, \n\n        validate: function (value) {\n            if (value === undefined) {\n                value = this.value;\n            }\n            if (typeof this.options.validate === 'function') {\n                return this.options.validate.call(this.options.scope, value);\n            }\n        },\n\n        option: function(key, value) {\n            if(key in this.options) {\n                this.options[key] = value;\n            }\n            \n            if(key === 'value') {\n                this.setValue(value);\n            }\n            \n            //do not pass option to input as it is passed in editable-element\n        },\n\n        setValue: function(value, convertStr) {\n            if(convertStr) {\n                this.value = this.input.str2value(value);\n            } else {\n                this.value = value;\n            }\n            \n            //if form is visible, update input\n            if(this.$form && this.$form.is(':visible')) {\n                this.input.value2input(this.value);\n            }            \n        }               \n    };\n\n    /*\n    Initialize editableform. Applied to jQuery object.\n\n    @method $().editableform(options)\n    @params {Object} options\n    @example\n    var $form = $('&lt;div&gt;').editableform({\n        type: 'text',\n        name: 'username',\n        url: '/post',\n        value: 'vitaliy'\n    });\n\n    //to display form you should call 'render' method\n    $form.editableform('render');     \n    */\n    $.fn.editableform = function (option) {\n        var args = arguments;\n        return this.each(function () {\n            var $this = $(this), \n            data = $this.data('editableform'), \n            options = typeof option === 'object' && option; \n            if (!data) {\n                $this.data('editableform', (data = new EditableForm(this, options)));\n            }\n\n            if (typeof option === 'string') { //call method \n                data[option].apply(data, Array.prototype.slice.call(args, 1));\n            } \n        });\n    };\n\n    //keep link to constructor to allow inheritance\n    $.fn.editableform.Constructor = EditableForm;    \n\n    //defaults\n    $.fn.editableform.defaults = {\n        /* see also defaults for input */\n\n        /**\n        Type of input. Can be <code>text|textarea|select|date|checklist</code>\n\n        @property type \n        @type string\n        @default 'text'\n        **/\n        type: 'text',\n        /**\n        Url for submit, e.g. <code>'/post'</code>  \n        If function - it will be called instead of ajax. Function should return deferred object to run fail/done callbacks.\n\n        @property url \n        @type string|function\n        @default null\n        @example\n        url: function(params) {\n            var d = new $.Deferred;\n            if(params.value === 'abc') {\n                return d.reject('error message'); //returning error via deferred object\n            } else {\n                //async saving data in js model\n                someModel.asyncSaveMethod({\n                   ..., \n                   success: function(){\n                      d.resolve();\n                   }\n                }); \n                return d.promise();\n            }\n        } \n        **/        \n        url:null,\n        /**\n        Additional params for submit. If defined as <code>object</code> - it is **appended** to original ajax data (pk, name and value).  \n        If defined as <code>function</code> - returned object **overwrites** original ajax data.\n        @example\n        params: function(params) {\n            //originally params contain pk, name and value\n            params.a = 1;\n            return params;\n        }\n\n        @property params \n        @type object|function\n        @default null\n        **/          \n        params:null,\n        /**\n        Name of field. Will be submitted on server. Can be taken from <code>id</code> attribute\n\n        @property name \n        @type string\n        @default null\n        **/         \n        name: null,\n        /**\n        Primary key of editable object (e.g. record id in database). For composite keys use object, e.g. <code>{id: 1, lang: 'en'}</code>.\n        Can be calculated dynamically via function.\n\n        @property pk \n        @type string|object|function\n        @default null\n        **/         \n        pk: null,\n        /**\n        Initial value. If not defined - will be taken from element's content.\n        For __select__ type should be defined (as it is ID of shown text).\n\n        @property value \n        @type string|object\n        @default null\n        **/        \n        value: null,\n        /**\n        Value that will be displayed in input if original field value is empty (`null|undefined|''`).\n\n        @property defaultValue \n        @type string|object\n        @default null\n        @since 1.4.6\n        **/        \n        defaultValue: null,\n        /**\n        Strategy for sending data on server. Can be `auto|always|never`.\n        When 'auto' data will be sent on server **only if pk and url defined**, otherwise new value will be stored locally.\n\n        @property send \n        @type string\n        @default 'auto'\n        **/          \n        send: 'auto', \n        /**\n        Function for client-side validation. If returns string - means validation not passed and string showed as error.\n        Since 1.5.1 you can modify submitted value by returning object from `validate`: \n        `{newValue: '...'}` or `{newValue: '...', msg: '...'}`\n\n        @property validate \n        @type function\n        @default null\n        @example\n        validate: function(value) {\n            if($.trim(value) == '') {\n                return 'This field is required';\n            }\n        }\n        **/         \n        validate: null,\n        /**\n        Success callback. Called when value successfully sent on server and **response status = 200**.  \n        Usefull to work with json response. For example, if your backend response can be <code>{success: true}</code>\n        or `{success: false, msg: \"server error\"}` you can check it inside this callback.  \n        If it returns **string** - means error occured and string is shown as error message.  \n        If it returns **object like** `{newValue: &lt;something&gt;}` - it overwrites value, submitted by user\n        (useful when server changes value).  \n        Otherwise newValue simply rendered into element.\n        \n        @property success \n        @type function\n        @default null\n        @example\n        success: function(response, newValue) {\n            if(!response.success) return response.msg;\n        }\n        **/          \n        success: null,\n        /**\n        Error callback. Called when request failed (response status != 200).  \n        Usefull when you want to parse error response and display a custom message.\n        Must return **string** - the message to be displayed in the error block.\n                \n        @property error \n        @type function\n        @default null\n        @since 1.4.4\n        @example\n        error: function(response, newValue) {\n            if(response.status === 500) {\n                return 'Service unavailable. Please try later.';\n            } else {\n                return response.responseText;\n            }\n        }\n        **/          \n        error: null,\n        /**\n        Additional options for submit ajax request.\n        List of values: http://api.jquery.com/jQuery.ajax\n        \n        @property ajaxOptions \n        @type object\n        @default null\n        @since 1.1.1        \n        @example \n        ajaxOptions: {\n            type: 'put',\n            dataType: 'json'\n        }        \n        **/        \n        ajaxOptions: null,\n        /**\n        Where to show buttons: left(true)|bottom|false  \n        Form without buttons is auto-submitted.\n\n        @property showbuttons \n        @type boolean|string\n        @default true\n        @since 1.1.1\n        **/         \n        showbuttons: true,\n        /**\n        Scope for callback methods (success, validate).  \n        If <code>null</code> means editableform instance itself. \n\n        @property scope \n        @type DOMElement|object\n        @default null\n        @since 1.2.0\n        @private\n        **/            \n        scope: null,\n        /**\n        Whether to save or cancel value when it was not changed but form was submitted\n\n        @property savenochange \n        @type boolean\n        @default false\n        @since 1.2.0\n        **/\n        savenochange: false\n    };   \n\n    /*\n    Note: following params could redefined in engine: bootstrap or jqueryui:\n    Classes 'control-group' and 'editable-error-block' must always present!\n    */      \n    $.fn.editableform.template = '<form class=\"form-inline editableform\">'+\n    '<div class=\"control-group\">' + \n    '<div><div class=\"editable-input\"></div><div class=\"editable-buttons\"></div></div>'+\n    '<div class=\"editable-error-block\"></div>' + \n    '</div>' + \n    '</form>';\n\n    //loading div\n    $.fn.editableform.loading = '<div class=\"editableform-loading\"></div>';\n\n    //buttons\n    $.fn.editableform.buttons = '<button type=\"submit\" class=\"editable-submit\">ok</button>'+\n    '<button type=\"button\" class=\"editable-cancel\">cancel</button>';      \n\n    //error class attached to control-group\n    $.fn.editableform.errorGroupClass = null;  \n\n    //error class attached to editable-error-block\n    $.fn.editableform.errorBlockClass = 'editable-error';\n    \n    //engine\n    $.fn.editableform.engine = 'jquery';\n}(window.jQuery));\n\n/**\n* EditableForm utilites\n*/\n(function ($) {\n    \"use strict\";\n    \n    //utils\n    $.fn.editableutils = {\n        /**\n        * classic JS inheritance function\n        */  \n        inherit: function (Child, Parent) {\n            var F = function() { };\n            F.prototype = Parent.prototype;\n            Child.prototype = new F();\n            Child.prototype.constructor = Child;\n            Child.superclass = Parent.prototype;\n        },\n\n        /**\n        * set caret position in input\n        * see http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area\n        */        \n        setCursorPosition: function(elem, pos) {\n            if (elem.setSelectionRange) {\n                try { elem.setSelectionRange(pos, pos); } catch (e) {}\n            } else if (elem.createTextRange) {\n                var range = elem.createTextRange();\n                range.collapse(true);\n                range.moveEnd('character', pos);\n                range.moveStart('character', pos);\n                range.select();\n            }\n        },\n\n        /**\n        * function to parse JSON in *single* quotes. (jquery automatically parse only double quotes)\n        * That allows such code as: <a data-source=\"{'a': 'b', 'c': 'd'}\">\n        * safe = true --> means no exception will be thrown\n        * for details see http://stackoverflow.com/questions/7410348/how-to-set-json-format-to-html5-data-attributes-in-the-jquery\n        */\n        tryParseJson: function(s, safe) {\n            if (typeof s === 'string' && s.length && s.match(/^[\\{\\[].*[\\}\\]]$/)) {\n                if (safe) {\n                    try {\n                        /*jslint evil: true*/\n                        s = (new Function('return ' + s))();\n                        /*jslint evil: false*/\n                    } catch (e) {} finally {\n                        return s;\n                    }\n                } else {\n                    /*jslint evil: true*/\n                    s = (new Function('return ' + s))();\n                    /*jslint evil: false*/\n                }\n            }\n            return s;\n        },\n\n        /**\n        * slice object by specified keys\n        */\n        sliceObj: function(obj, keys, caseSensitive /* default: false */) {\n            var key, keyLower, newObj = {};\n\n            if (!$.isArray(keys) || !keys.length) {\n                return newObj;\n            }\n\n            for (var i = 0; i < keys.length; i++) {\n                key = keys[i];\n                if (obj.hasOwnProperty(key)) {\n                    newObj[key] = obj[key];\n                }\n\n                if(caseSensitive === true) {\n                    continue;\n                }\n\n                //when getting data-* attributes via $.data() it's converted to lowercase.\n                //details: http://stackoverflow.com/questions/7602565/using-data-attributes-with-jquery\n                //workaround is code below.\n                keyLower = key.toLowerCase();\n                if (obj.hasOwnProperty(keyLower)) {\n                    newObj[key] = obj[keyLower];\n                }\n            }\n\n            return newObj;\n        },\n\n        /*\n        exclude complex objects from $.data() before pass to config\n        */\n        getConfigData: function($element) {\n            var data = {};\n            $.each($element[0].dataset, function(k, v) {\n                if(typeof v !== 'object' || (v && typeof v === 'object' && (v.constructor === Object || v.constructor === Array))) {\n                    data[k] = v;\n                }\n            });\n            return data;\n        },\n\n        /*\n         returns keys of object\n        */\n        objectKeys: function(o) {\n            if (Object.keys) {\n                return Object.keys(o);  \n            } else {\n                if (o !== Object(o)) {\n                    throw new TypeError('Object.keys called on a non-object');\n                }\n                var k=[], p;\n                for (p in o) {\n                    if (Object.prototype.hasOwnProperty.call(o,p)) {\n                        k.push(p);\n                    }\n                }\n                return k;\n            }\n\n        },\n        \n       /**\n        method to escape html.\n       **/\n       escape: function(str) {\n           return $('<div>').text(str).html();\n       },\n       \n       /*\n        returns array items from sourceData having value property equal or inArray of 'value'\n       */\n       itemsByValue: function(value, sourceData, valueProp) {\n           if(!sourceData || value === null) {\n               return [];\n           }\n           \n           if (typeof(valueProp) !== \"function\") {\n               var idKey = valueProp || 'value';\n               valueProp = function (e) { return e[idKey]; };\n           }\n                      \n           var isValArray = $.isArray(value),\n           result = [], \n           that = this;\n\n           $.each(sourceData, function(i, o) {\n               if(o.children) {\n                   result = result.concat(that.itemsByValue(value, o.children, valueProp));\n               } else {\n                   /*jslint eqeq: true*/\n                   if(isValArray) {\n                       if($.grep(value, function(v){  return v == (o && typeof o === 'object' ? valueProp(o) : o); }).length) {\n                           result.push(o); \n                       }\n                   } else {\n                       var itemValue = (o && (typeof o === 'object')) ? valueProp(o) : o;\n                       if(value == itemValue) {\n                           result.push(o); \n                       }\n                   }\n                   /*jslint eqeq: false*/\n               }\n           });\n           \n           return result;\n       },\n       \n       /*\n       Returns input by options: type, mode. \n       */\n       createInput: function(options) {\n           var TypeConstructor, typeOptions, input,\n           type = options.type;\n\n           //`date` is some kind of virtual type that is transformed to one of exact types\n           //depending on mode and core lib\n           if(type === 'date') {\n               //inline\n               if(options.mode === 'inline') {\n                   if($.fn.editabletypes.datefield) {\n                       type = 'datefield';\n                   } else if($.fn.editabletypes.dateuifield) {\n                       type = 'dateuifield';\n                   }\n               //popup\n               } else {\n                   if($.fn.editabletypes.date) {\n                       type = 'date';\n                   } else if($.fn.editabletypes.dateui) {\n                       type = 'dateui';\n                   }\n               }\n               \n               //if type still `date` and not exist in types, replace with `combodate` that is base input\n               if(type === 'date' && !$.fn.editabletypes.date) {\n                   type = 'combodate';\n               } \n           }\n           \n           //`datetime` should be datetimefield in 'inline' mode\n           if(type === 'datetime' && options.mode === 'inline') {\n             type = 'datetimefield';  \n           }           \n\n           //change wysihtml5 to textarea for jquery UI and plain versions\n           if(type === 'wysihtml5' && !$.fn.editabletypes[type]) {\n               type = 'textarea';\n           }\n\n           //create input of specified type. Input will be used for converting value, not in form\n           if(typeof $.fn.editabletypes[type] === 'function') {\n               TypeConstructor = $.fn.editabletypes[type];\n               typeOptions = this.sliceObj(options, this.objectKeys(TypeConstructor.defaults));\n               input = new TypeConstructor(typeOptions);\n               return input;\n           } else {\n               $.error('Unknown type: '+ type);\n               return false; \n           }  \n       },\n       \n       //see http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr\n       supportsTransitions: function () {\n           var b = document.body || document.documentElement,\n               s = b.style,\n               p = 'transition',\n               v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms'];\n               \n           if(typeof s[p] === 'string') {\n               return true; \n           }\n\n           // Tests for vendor specific prop\n           p = p.charAt(0).toUpperCase() + p.substr(1);\n           for(var i=0; i<v.length; i++) {\n               if(typeof s[v[i] + p] === 'string') { \n                   return true; \n               }\n           }\n           return false;\n       }            \n       \n    };      \n}(window.jQuery));\n\n/**\nAttaches stand-alone container with editable-form to HTML element. Element is used only for positioning, value is not stored anywhere.<br>\nThis method applied internally in <code>$().editable()</code>. You should subscribe on it's events (save / cancel) to get profit of it.<br>\nFinal realization can be different: bootstrap-popover, jqueryui-tooltip, poshytip, inline-div. It depends on which js file you include.<br>\nApplied as jQuery method.\n\n@class editableContainer\n@uses editableform\n**/\n(function ($) {\n    \"use strict\";\n\n    var Popup = function (element, options) {\n        this.init(element, options);\n    };\n    \n    var Inline = function (element, options) {\n        this.init(element, options);\n    };    \n\n    //methods\n    Popup.prototype = {\n        containerName: null, //method to call container on element\n        containerDataName: null, //object name in element's .data()\n        innerCss: null, //tbd in child class\n        containerClass: 'editable-container editable-popup', //css class applied to container element\n        defaults: {}, //container itself defaults\n        \n        init: function(element, options) {\n            this.$element = $(element);\n            //since 1.4.1 container do not use data-* directly as they already merged into options.\n            this.options = $.extend({}, $.fn.editableContainer.defaults, options);         \n            this.splitOptions();\n            \n            //set scope of form callbacks to element\n            this.formOptions.scope = this.$element[0]; \n            \n            this.initContainer();\n            \n            //flag to hide container, when saving value will finish\n            this.delayedHide = false;\n\n            //bind 'destroyed' listener to destroy container when element is removed from dom\n            this.$element.on('destroyed', $.proxy(function(){\n                this.destroy();\n            }, this)); \n            \n            //attach document handler to close containers on click / escape\n            if(!$(document).data('editable-handlers-attached')) {\n                //close all on escape\n                $(document).on('keyup.editable', function (e) {\n                    if (e.which === 27) {\n                        $('.editable-open').editableContainer('hide', 'cancel');\n                        //todo: return focus on element \n                    }\n                });\n\n                //close containers when click outside \n                //(mousedown could be better than click, it closes everything also on drag drop)\n                $(document).on('click.editable', function(e) {\n                    var $target = $(e.target), i,\n                        exclude_classes = ['.editable-container', \n                                           '.ui-datepicker-header', \n                                           '.datepicker', //in inline mode datepicker is rendered into body\n                                           '.modal-backdrop', \n                                           '.bootstrap-wysihtml5-insert-image-modal', \n                                           '.bootstrap-wysihtml5-insert-link-modal'\n                                           ];\n\n                    // select2 has extra body click in IE\n                    // see: https://github.com/ivaynberg/select2/issues/1058 \n                    if ($('.select2-drop-mask').is(':visible')) {\n                        return;\n                    }\n\n                    //check if element is detached. It occurs when clicking in bootstrap datepicker\n                    if (!$.contains(document.documentElement, e.target)) {\n                        return;\n                    }\n\n                    //for some reason FF 20 generates extra event (click) in select2 widget with e.target = document\n                    //we need to filter it via construction below. See https://github.com/vitalets/x-editable/issues/199\n                    //Possibly related to http://stackoverflow.com/questions/10119793/why-does-firefox-react-differently-from-webkit-and-ie-to-click-event-on-selec\n                    if($target.is(document)) {\n                        return;\n                    }\n                    \n                    //if click inside one of exclude classes --> no nothing\n                    for(i=0; i<exclude_classes.length; i++) {\n                         if($target.is(exclude_classes[i]) || $target.parents(exclude_classes[i]).length) {\n                             return;\n                         }\n                    }\n                      \n                    //close all open containers (except one - target)\n                    Popup.prototype.closeOthers(e.target);\n                });\n                \n                $(document).data('editable-handlers-attached', true);\n            }                        \n        },\n\n        //split options on containerOptions and formOptions\n        splitOptions: function() {\n            this.containerOptions = {};\n            this.formOptions = {};\n            \n            if(!$.fn[this.containerName]) {\n                throw new Error(this.containerName + ' not found. Have you included corresponding js file?');   \n            }\n            \n            //keys defined in container defaults go to container, others go to form\n            for(var k in this.options) {\n              if(k in this.defaults) {\n                 this.containerOptions[k] = this.options[k];\n              } else {\n                 this.formOptions[k] = this.options[k];\n              } \n            }\n        },\n        \n        /*\n        Returns jquery object of container\n        @method tip()\n        */         \n        tip: function() {\n            return this.container() ? this.container().$tip : null;\n        },\n\n        /* returns container object */\n        container: function() {\n            var container;\n            //first, try get it by `containerDataName`\n            if(this.containerDataName) {\n                if(container = this.$element.data(this.containerDataName)) {\n                    return container;\n                }\n            }\n            //second, try `containerName`\n            container = this.$element.data(this.containerName);\n            return container;\n        },\n\n        /* call native method of underlying container, e.g. this.$element.popover('method') */ \n        call: function() {\n            this.$element[this.containerName].apply(this.$element, arguments); \n        },        \n        \n        initContainer: function(){\n            this.call(this.containerOptions);\n        },\n\n        renderForm: function() {\n            this.$form\n            .editableform(this.formOptions)\n            .on({\n                save: $.proxy(this.save, this), //click on submit button (value changed)\n                nochange: $.proxy(function(){ this.hide('nochange'); }, this), //click on submit button (value NOT changed)                \n                cancel: $.proxy(function(){ this.hide('cancel'); }, this), //click on cancel button\n                show: $.proxy(function() {\n                    if(this.delayedHide) {\n                        this.hide(this.delayedHide.reason);\n                        this.delayedHide = false;\n                    } else {\n                        this.setPosition();\n                    }\n                }, this), //re-position container every time form is shown (occurs each time after loading state)\n                rendering: $.proxy(this.setPosition, this), //this allows to place container correctly when loading shown\n                resize: $.proxy(this.setPosition, this), //this allows to re-position container when form size is changed \n                rendered: $.proxy(function(){\n                    /**        \n                    Fired when container is shown and form is rendered (for select will wait for loading dropdown options).  \n                    **Note:** Bootstrap popover has own `shown` event that now cannot be separated from x-editable's one.\n                    The workaround is to check `arguments.length` that is always `2` for x-editable.                     \n                    \n                    @event shown \n                    @param {Object} event event object\n                    @example\n                    $('#username').on('shown', function(e, editable) {\n                        editable.input.$input.val('overwriting value of input..');\n                    });                     \n                    **/                      \n                    /*\n                     TODO: added second param mainly to distinguish from bootstrap's shown event. It's a hotfix that will be solved in future versions via namespaced events.  \n                    */\n                    this.$element.triggerHandler('shown', $(this.options.scope).data('editable')); \n                }, this) \n            })\n            .editableform('render');\n        },        \n\n        /**\n        Shows container with form\n        @method show()\n        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.\n        **/\n        /* Note: poshytip owerwrites this method totally! */          \n        show: function (closeAll) {\n            this.$element.addClass('editable-open');\n            if(closeAll !== false) {\n                //close all open containers (except this)\n                this.closeOthers(this.$element[0]);  \n            }\n            \n            //show container itself\n            this.innerShow();\n            this.tip().addClass(this.containerClass);\n\n            /*\n            Currently, form is re-rendered on every show. \n            The main reason is that we dont know, what will container do with content when closed:\n            remove(), detach() or just hide() - it depends on container.\n            \n            Detaching form itself before hide and re-insert before show is good solution, \n            but visually it looks ugly --> container changes size before hide.  \n            */             \n            \n            //if form already exist - delete previous data \n            if(this.$form) {\n                //todo: destroy prev data!\n                //this.$form.destroy();\n            }\n\n            this.$form = $('<div>');\n            \n            //insert form into container body\n            if(this.tip().is(this.innerCss)) {\n                //for inline container\n                this.tip().append(this.$form); \n            } else {\n                this.tip().find(this.innerCss).append(this.$form);\n            } \n            \n            //render form\n            this.renderForm();\n        },\n\n        /**\n        Hides container with form\n        @method hide()\n        @param {string} reason Reason caused hiding. Can be <code>save|cancel|onblur|nochange|undefined (=manual)</code>\n        **/         \n        hide: function(reason) {  \n            if(!this.tip() || !this.tip().is(':visible') || !this.$element.hasClass('editable-open')) {\n                return;\n            }\n            \n            //if form is saving value, schedule hide\n            if(this.$form.data('editableform').isSaving) {\n                this.delayedHide = {reason: reason};\n                return;    \n            } else {\n                this.delayedHide = false;\n            }\n\n            this.$element.removeClass('editable-open');   \n            this.innerHide();\n\n            /**\n            Fired when container was hidden. It occurs on both save or cancel.  \n            **Note:** Bootstrap popover has own `hidden` event that now cannot be separated from x-editable's one.\n            The workaround is to check `arguments.length` that is always `2` for x-editable. \n\n            @event hidden \n            @param {object} event event object\n            @param {string} reason Reason caused hiding. Can be <code>save|cancel|onblur|nochange|manual</code>\n            @example\n            $('#username').on('hidden', function(e, reason) {\n                if(reason === 'save' || reason === 'cancel') {\n                    //auto-open next editable\n                    $(this).closest('tr').next().find('.editable').editable('show');\n                } \n            });\n            **/\n            this.$element.triggerHandler('hidden', reason || 'manual');   \n        },\n\n        /* internal show method. To be overwritten in child classes */\n        innerShow: function () {\n             \n        },        \n\n        /* internal hide method. To be overwritten in child classes */\n        innerHide: function () {\n\n        },\n        \n        /**\n        Toggles container visibility (show / hide)\n        @method toggle()\n        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.\n        **/          \n        toggle: function(closeAll) {\n            if(this.container() && this.tip() && this.tip().is(':visible')) {\n                this.hide();\n            } else {\n                this.show(closeAll);\n            } \n        },\n\n        /*\n        Updates the position of container when content changed.\n        @method setPosition()\n        */       \n        setPosition: function() {\n            //tbd in child class\n        },\n\n        save: function(e, params) {\n            /**        \n            Fired when new value was submitted. You can use <code>$(this).data('editableContainer')</code> inside handler to access to editableContainer instance\n            \n            @event save \n            @param {Object} event event object\n            @param {Object} params additional params\n            @param {mixed} params.newValue submitted value\n            @param {Object} params.response ajax response\n            @example\n            $('#username').on('save', function(e, params) {\n                //assuming server response: '{success: true}'\n                var pk = $(this).data('editableContainer').options.pk;\n                if(params.response && params.response.success) {\n                    alert('value: ' + params.newValue + ' with pk: ' + pk + ' saved!');\n                } else {\n                    alert('error!'); \n                } \n            });\n            **/             \n            this.$element.triggerHandler('save', params);\n            \n            //hide must be after trigger, as saving value may require methods of plugin, applied to input\n            this.hide('save');\n        },\n\n        /**\n        Sets new option\n        \n        @method option(key, value)\n        @param {string} key \n        @param {mixed} value \n        **/         \n        option: function(key, value) {\n            this.options[key] = value;\n            if(key in this.containerOptions) {\n                this.containerOptions[key] = value;\n                this.setContainerOption(key, value); \n            } else {\n                this.formOptions[key] = value;\n                if(this.$form) {\n                    this.$form.editableform('option', key, value);  \n                }\n            }\n        },\n        \n        setContainerOption: function(key, value) {\n            this.call('option', key, value);\n        },\n\n        /**\n        Destroys the container instance\n        @method destroy()\n        **/        \n        destroy: function() {\n            this.hide();\n            this.innerDestroy();\n            this.$element.off('destroyed');\n            this.$element.removeData('editableContainer');\n        },\n        \n        /* to be overwritten in child classes */\n        innerDestroy: function() {\n            \n        }, \n        \n        /*\n        Closes other containers except one related to passed element. \n        Other containers can be cancelled or submitted (depends on onblur option)\n        */\n        closeOthers: function(element) {\n            $('.editable-open').each(function(i, el){\n                //do nothing with passed element and it's children\n                if(el === element || $(el).find(element).length) {\n                    return;\n                }\n\n                //otherwise cancel or submit all open containers \n                var $el = $(el),\n                ec = $el.data('editableContainer');\n\n                if(!ec) {\n                    return;  \n                }\n                \n                if(ec.options.onblur === 'cancel') {\n                    $el.data('editableContainer').hide('onblur');\n                } else if(ec.options.onblur === 'submit') {\n                    $el.data('editableContainer').tip().find('form').submit();\n                }\n            });\n\n        },\n        \n        /**\n        Activates input of visible container (e.g. set focus)\n        @method activate()\n        **/         \n        activate: function() {\n            if(this.tip && this.tip().is(':visible') && this.$form) {\n               this.$form.data('editableform').input.activate(); \n            }\n        } \n\n    };\n\n    /**\n    jQuery method to initialize editableContainer.\n    \n    @method $().editableContainer(options)\n    @params {Object} options\n    @example\n    $('#edit').editableContainer({\n        type: 'text',\n        url: '/post',\n        pk: 1,\n        value: 'hello'\n    });\n    **/  \n    $.fn.editableContainer = function (option) {\n        var args = arguments;\n        return this.each(function () {\n            var $this = $(this),\n            dataKey = 'editableContainer', \n            data = $this.data(dataKey),\n            options = typeof option === 'object' && option,\n            Constructor = (options.mode === 'inline') ? Inline : Popup;             \n\n            if (!data) {\n                $this.data(dataKey, (data = new Constructor(this, options)));\n            }\n\n            if (typeof option === 'string') { //call method \n                data[option].apply(data, Array.prototype.slice.call(args, 1));\n            }            \n        });\n    };     \n\n    //store constructors\n    $.fn.editableContainer.Popup = Popup;\n    $.fn.editableContainer.Inline = Inline;\n\n    //defaults\n    $.fn.editableContainer.defaults = {\n        /**\n        Initial value of form input\n\n        @property value \n        @type mixed\n        @default null\n        @private\n        **/        \n        value: null,\n        /**\n        Placement of container relative to element. Can be <code>top|right|bottom|left</code>. Not used for inline container.\n\n        @property placement \n        @type string\n        @default 'top'\n        **/        \n        placement: 'top',\n        /**\n        Whether to hide container on save/cancel.\n\n        @property autohide \n        @type boolean\n        @default true\n        @private \n        **/        \n        autohide: true,\n        /**\n        Action when user clicks outside the container. Can be <code>cancel|submit|ignore</code>.  \n        Setting <code>ignore</code> allows to have several containers open. \n\n        @property onblur \n        @type string\n        @default 'cancel'\n        @since 1.1.1\n        **/        \n        onblur: 'cancel',\n        \n        /**\n        Animation speed (inline mode only)\n        @property anim \n        @type string\n        @default false\n        **/        \n        anim: false,\n        \n        /**\n        Mode of editable, can be `popup` or `inline` \n        \n        @property mode \n        @type string         \n        @default 'popup'\n        @since 1.4.0        \n        **/        \n        mode: 'popup'        \n    };\n\n    /* \n    * workaround to have 'destroyed' event to destroy popover when element is destroyed\n    * see http://stackoverflow.com/questions/2200494/jquery-trigger-event-when-an-element-is-removed-from-the-dom\n    */\n    jQuery.event.special.destroyed = {\n        remove: function(o) {\n            if (o.handler) {\n                o.handler();\n            }\n        }\n    };    \n\n}(window.jQuery));\n\n/**\n* Editable Inline \n* ---------------------\n*/\n(function ($) {\n    \"use strict\";\n    \n    //copy prototype from EditableContainer\n    //extend methods\n    $.extend($.fn.editableContainer.Inline.prototype, $.fn.editableContainer.Popup.prototype, {\n        containerName: 'editableform',\n        innerCss: '.editable-inline',\n        containerClass: 'editable-container editable-inline', //css class applied to container element\n                 \n        initContainer: function(){\n            //container is <span> element\n            this.$tip = $('<span></span>');\n            \n            //convert anim to miliseconds (int)\n            if(!this.options.anim) {\n                this.options.anim = 0;\n            }         \n        },\n        \n        splitOptions: function() {\n            //all options are passed to form\n            this.containerOptions = {};\n            this.formOptions = this.options;\n        },\n        \n        tip: function() {\n           return this.$tip; \n        },\n        \n        innerShow: function () {\n            this.$element.hide();\n            this.tip().insertAfter(this.$element).show();\n        }, \n        \n        innerHide: function () {\n            this.$tip.hide(this.options.anim, $.proxy(function() {\n                this.$element.show();\n                this.innerDestroy();\n            }, this)); \n        },\n        \n        innerDestroy: function() {\n            if(this.tip()) {\n                this.tip().empty().remove();\n            }\n        } \n    });\n\n}(window.jQuery));\n/**\nMakes editable any HTML element on the page. Applied as jQuery method.\n\n@class editable\n@uses editableContainer\n**/\n(function ($) {\n    \"use strict\";\n\n    var Editable = function (element, options) {\n        this.$element = $(element);\n        //data-* has more priority over js options: because dynamically created elements may change data-* \n        this.options = $.extend({}, $.fn.editable.defaults, options, $.fn.editableutils.getConfigData(this.$element));  \n        if(this.options.selector) {\n            this.initLive();\n        } else {\n            this.init();\n        }\n        \n        //check for transition support\n        if(this.options.highlight && !$.fn.editableutils.supportsTransitions()) {\n            this.options.highlight = false;\n        }\n    };\n\n    Editable.prototype = {\n        constructor: Editable, \n        init: function () {\n            var isValueByText = false, \n                doAutotext, finalize;\n\n            //name\n            this.options.name = this.options.name || this.$element.attr('id');\n             \n            //create input of specified type. Input needed already here to convert value for initial display (e.g. show text by id for select)\n            //also we set scope option to have access to element inside input specific callbacks (e. g. source as function)\n            this.options.scope = this.$element[0]; \n            this.input = $.fn.editableutils.createInput(this.options);\n            if(!this.input) {\n                return; \n            }            \n\n            //set value from settings or by element's text\n            if (this.options.value === undefined || this.options.value === null) {\n                this.value = this.input.html2value($.trim(this.$element.html()));\n                isValueByText = true;\n            } else {\n                /*\n                  value can be string when received from 'data-value' attribute\n                  for complext objects value can be set as json string in data-value attribute, \n                  e.g. data-value=\"{city: 'Moscow', street: 'Lenina'}\"\n                */\n                this.options.value = $.fn.editableutils.tryParseJson(this.options.value, true); \n                if(typeof this.options.value === 'string') {\n                    this.value = this.input.str2value(this.options.value);\n                } else {\n                    this.value = this.options.value;\n                }\n            }\n            \n            //add 'editable' class to every editable element\n            this.$element.addClass('editable');\n            \n            //specifically for \"textarea\" add class .editable-pre-wrapped to keep linebreaks\n            if(this.input.type === 'textarea') {\n                this.$element.addClass('editable-pre-wrapped');\n            }\n            \n            //attach handler activating editable. In disabled mode it just prevent default action (useful for links)\n            if(this.options.toggle !== 'manual') {\n                this.$element.addClass('editable-click');\n                this.$element.on(this.options.toggle + '.editable', $.proxy(function(e){\n                    //prevent following link if editable enabled\n                    if(!this.options.disabled) {\n                        e.preventDefault();\n                    }\n                    \n                    //stop propagation not required because in document click handler it checks event target\n                    //e.stopPropagation();\n                    \n                    if(this.options.toggle === 'mouseenter') {\n                        //for hover only show container\n                        this.show();\n                    } else {\n                        //when toggle='click' we should not close all other containers as they will be closed automatically in document click listener\n                        var closeAll = (this.options.toggle !== 'click');\n                        this.toggle(closeAll);\n                    }\n                }, this));\n            } else {\n                this.$element.attr('tabindex', -1); //do not stop focus on element when toggled manually\n            }\n            \n            //if display is function it's far more convinient to have autotext = always to render correctly on init\n            //see https://github.com/vitalets/x-editable-yii/issues/34\n            if(typeof this.options.display === 'function') {\n                this.options.autotext = 'always';\n            }\n            \n            //check conditions for autotext:\n            switch(this.options.autotext) {\n              case 'always':\n               doAutotext = true;\n              break;\n              case 'auto':\n                //if element text is empty and value is defined and value not generated by text --> run autotext\n                doAutotext = !$.trim(this.$element.text()).length && this.value !== null && this.value !== undefined && !isValueByText;\n              break;\n              default:\n               doAutotext = false;\n            }\n\n            //depending on autotext run render() or just finilize init\n            $.when(doAutotext ? this.render() : true).then($.proxy(function() {\n                if(this.options.disabled) {\n                    this.disable();\n                } else {\n                    this.enable(); \n                }\n               /**        \n               Fired when element was initialized by `$().editable()` method. \n               Please note that you should setup `init` handler **before** applying `editable`. \n                              \n               @event init \n               @param {Object} event event object\n               @param {Object} editable editable instance (as here it cannot accessed via data('editable'))\n               @since 1.2.0\n               @example\n               $('#username').on('init', function(e, editable) {\n                   alert('initialized ' + editable.options.name);\n               });\n               $('#username').editable();\n               **/                  \n                this.$element.triggerHandler('init', this);\n            }, this));\n        },\n\n        /*\n         Initializes parent element for live editables \n        */\n        initLive: function() {\n           //store selector \n           var selector = this.options.selector;\n           //modify options for child elements\n           this.options.selector = false; \n           this.options.autotext = 'never';\n           //listen toggle events\n           this.$element.on(this.options.toggle + '.editable', selector, $.proxy(function(e){\n               var $target = $(e.target).closest(selector);\n               if(!$target.data('editable')) {\n                   //if delegated element initially empty, we need to clear it's text (that was manually set to `empty` by user)\n                   //see https://github.com/vitalets/x-editable/issues/137 \n                   if($target.hasClass(this.options.emptyclass)) {\n                      $target.empty();\n                   }\n                   $target.editable(this.options).trigger(e);\n               }\n           }, this)); \n        },\n        \n        /*\n        Renders value into element's text.\n        Can call custom display method from options.\n        Can return deferred object.\n        @method render()\n        @param {mixed} response server response (if exist) to pass into display function\n        */          \n        render: function(response) {\n            //do not display anything\n            if(this.options.display === false) {\n                return;\n            }\n            \n            //if input has `value2htmlFinal` method, we pass callback in third param to be called when source is loaded\n            if(this.input.value2htmlFinal) {\n                return this.input.value2html(this.value, this.$element[0], this.options.display, response); \n            //if display method defined --> use it    \n            } else if(typeof this.options.display === 'function') {\n                return this.options.display.call(this.$element[0], this.value, response);\n            //else use input's original value2html() method    \n            } else {\n                return this.input.value2html(this.value, this.$element[0]); \n            }\n        },\n        \n        /**\n        Enables editable\n        @method enable()\n        **/          \n        enable: function() {\n            this.options.disabled = false;\n            this.$element.removeClass('editable-disabled');\n            this.handleEmpty(this.isEmpty);\n            if(this.options.toggle !== 'manual') {\n                if(this.$element.attr('tabindex') === '-1') {    \n                    this.$element.removeAttr('tabindex');                                \n                }\n            }\n        },\n        \n        /**\n        Disables editable\n        @method disable()\n        **/         \n        disable: function() {\n            this.options.disabled = true; \n            this.hide();           \n            this.$element.addClass('editable-disabled');\n            this.handleEmpty(this.isEmpty);\n            //do not stop focus on this element\n            this.$element.attr('tabindex', -1);                \n        },\n        \n        /**\n        Toggles enabled / disabled state of editable element\n        @method toggleDisabled()\n        **/         \n        toggleDisabled: function() {\n            if(this.options.disabled) {\n                this.enable();\n            } else { \n                this.disable(); \n            }\n        },  \n        \n        /**\n        Sets new option\n        \n        @method option(key, value)\n        @param {string|object} key option name or object with several options\n        @param {mixed} value option new value\n        @example\n        $('.editable').editable('option', 'pk', 2);\n        **/          \n        option: function(key, value) {\n            //set option(s) by object\n            if(key && typeof key === 'object') {\n               $.each(key, $.proxy(function(k, v){\n                  this.option($.trim(k), v); \n               }, this)); \n               return;\n            }\n\n            //set option by string             \n            this.options[key] = value;                          \n            \n            //disabled\n            if(key === 'disabled') {\n               return value ? this.disable() : this.enable();\n            } \n            \n            //value\n            if(key === 'value') {\n                this.setValue(value);\n            }\n            \n            //transfer new option to container! \n            if(this.container) {\n                this.container.option(key, value);  \n            }\n             \n            //pass option to input directly (as it points to the same in form)\n            if(this.input.option) {\n                this.input.option(key, value);\n            }\n            \n        },              \n        \n        /*\n        * set emptytext if element is empty\n        */\n        handleEmpty: function (isEmpty) {\n            //do not handle empty if we do not display anything\n            if(this.options.display === false) {\n                return;\n            }\n\n            /* \n            isEmpty may be set directly as param of method.\n            It is required when we enable/disable field and can't rely on content \n            as node content is text: \"Empty\" that is not empty %)\n            */\n            if(isEmpty !== undefined) { \n                this.isEmpty = isEmpty;\n            } else {\n                //detect empty\n                //for some inputs we need more smart check\n                //e.g. wysihtml5 may have <br>, <p></p>, <img>\n                if(typeof(this.input.isEmpty) === 'function') {\n                    this.isEmpty = this.input.isEmpty(this.$element);                    \n                } else {\n                    this.isEmpty = $.trim(this.$element.html()) === '';\n                }\n            }           \n            \n            //emptytext shown only for enabled\n            if(!this.options.disabled) {\n                if (this.isEmpty) {\n                    this.$element.html(this.options.emptytext);\n                    if(this.options.emptyclass) {\n                        this.$element.addClass(this.options.emptyclass);\n                    }\n                } else if(this.options.emptyclass) {\n                    this.$element.removeClass(this.options.emptyclass);\n                }\n            } else {\n                //below required if element disable property was changed\n                if(this.isEmpty) {\n                    this.$element.empty();\n                    if(this.options.emptyclass) {\n                        this.$element.removeClass(this.options.emptyclass);\n                    }\n                }\n            }\n        },        \n        \n        /**\n        Shows container with form\n        @method show()\n        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.\n        **/  \n        show: function (closeAll) {\n            if(this.options.disabled) {\n                return;\n            }\n            \n            //init editableContainer: popover, tooltip, inline, etc..\n            if(!this.container) {\n                var containerOptions = $.extend({}, this.options, {\n                    value: this.value,\n                    input: this.input //pass input to form (as it is already created)\n                });\n                this.$element.editableContainer(containerOptions);\n                //listen `save` event \n                this.$element.on(\"save.internal\", $.proxy(this.save, this));\n                this.container = this.$element.data('editableContainer'); \n            } else if(this.container.tip().is(':visible')) {\n                return;\n            }      \n            \n            //show container\n            this.container.show(closeAll);\n        },\n        \n        /**\n        Hides container with form\n        @method hide()\n        **/       \n        hide: function () {   \n            if(this.container) {  \n                this.container.hide();\n            }\n        },\n        \n        /**\n        Toggles container visibility (show / hide)\n        @method toggle()\n        @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true.\n        **/  \n        toggle: function(closeAll) {\n            if(this.container && this.container.tip().is(':visible')) {\n                this.hide();\n            } else {\n                this.show(closeAll);\n            }\n        },\n        \n        /*\n        * called when form was submitted\n        */          \n        save: function(e, params) {\n            //mark element with unsaved class if needed\n            if(this.options.unsavedclass) {\n                /*\n                 Add unsaved css to element if:\n                  - url is not user's function \n                  - value was not sent to server\n                  - params.response === undefined, that means data was not sent\n                  - value changed \n                */\n                var sent = false;\n                sent = sent || typeof this.options.url === 'function';\n                sent = sent || this.options.display === false; \n                sent = sent || params.response !== undefined; \n                sent = sent || (this.options.savenochange && this.input.value2str(this.value) !== this.input.value2str(params.newValue)); \n                \n                if(sent) {\n                    this.$element.removeClass(this.options.unsavedclass); \n                } else {\n                    this.$element.addClass(this.options.unsavedclass);                    \n                }\n            }\n            \n            //highlight when saving\n            if(this.options.highlight) {\n                var $e = this.$element,\n                    bgColor = $e.css('background-color');\n                    \n                $e.css('background-color', this.options.highlight);\n                setTimeout(function(){\n                    if(bgColor === 'transparent') {\n                        bgColor = ''; \n                    }\n                    $e.css('background-color', bgColor);\n                    $e.addClass('editable-bg-transition');\n                    setTimeout(function(){\n                       $e.removeClass('editable-bg-transition');  \n                    }, 1700);\n                }, 10);\n            }\n            \n            //set new value\n            this.setValue(params.newValue, false, params.response);\n            \n            /**        \n            Fired when new value was submitted. You can use <code>$(this).data('editable')</code> to access to editable instance\n            \n            @event save \n            @param {Object} event event object\n            @param {Object} params additional params\n            @param {mixed} params.newValue submitted value\n            @param {Object} params.response ajax response\n            @example\n            $('#username').on('save', function(e, params) {\n                alert('Saved value: ' + params.newValue);\n            });\n            **/\n            //event itself is triggered by editableContainer. Description here is only for documentation              \n        },\n\n        validate: function () {\n            if (typeof this.options.validate === 'function') {\n                return this.options.validate.call(this, this.value);\n            }\n        },\n        \n        /**\n        Sets new value of editable\n        @method setValue(value, convertStr)\n        @param {mixed} value new value \n        @param {boolean} convertStr whether to convert value from string to internal format\n        **/         \n        setValue: function(value, convertStr, response) {\n            if(convertStr) {\n                this.value = this.input.str2value(value);\n            } else {\n                this.value = value;\n            }\n            if(this.container) {\n                this.container.option('value', this.value);\n            }\n            $.when(this.render(response))\n            .then($.proxy(function() {\n                this.handleEmpty();\n            }, this));\n        },\n        \n        /**\n        Activates input of visible container (e.g. set focus)\n        @method activate()\n        **/         \n        activate: function() {\n            if(this.container) {\n               this.container.activate(); \n            }\n        },\n        \n        /**\n        Removes editable feature from element\n        @method destroy()\n        **/        \n        destroy: function() {\n            this.disable();\n            \n            if(this.container) {\n               this.container.destroy(); \n            }\n            \n            this.input.destroy();\n\n            if(this.options.toggle !== 'manual') {\n                this.$element.removeClass('editable-click');\n                this.$element.off(this.options.toggle + '.editable');\n            } \n            \n            this.$element.off(\"save.internal\");\n            \n            this.$element.removeClass('editable editable-open editable-disabled');\n            this.$element.removeData('editable');\n        }        \n    };\n\n    /* EDITABLE PLUGIN DEFINITION\n    * ======================= */\n\n    /**\n    jQuery method to initialize editable element.\n    \n    @method $().editable(options)\n    @params {Object} options\n    @example\n    $('#username').editable({\n        type: 'text',\n        url: '/post',\n        pk: 1\n    });\n    **/\n    $.fn.editable = function (option) {\n        //special API methods returning non-jquery object\n        var result = {}, args = arguments, datakey = 'editable';\n        switch (option) {\n            /**\n            Runs client-side validation for all matched editables\n            \n            @method validate()\n            @returns {Object} validation errors map\n            @example\n            $('#username, #fullname').editable('validate');\n            // possible result:\n            {\n              username: \"username is required\",\n              fullname: \"fullname should be minimum 3 letters length\"\n            }\n            **/\n            case 'validate':\n                this.each(function () {\n                    var $this = $(this), data = $this.data(datakey), error;\n                    if (data && (error = data.validate())) {\n                        result[data.options.name] = error;\n                    }\n                });\n            return result;\n\n            /**\n            Returns current values of editable elements.   \n            Note that it returns an **object** with name-value pairs, not a value itself. It allows to get data from several elements.    \n            If value of some editable is `null` or `undefined` it is excluded from result object.\n            When param `isSingle` is set to **true** - it is supposed you have single element and will return value of editable instead of object.   \n             \n            @method getValue()\n            @param {bool} isSingle whether to return just value of single element\n            @returns {Object} object of element names and values\n            @example\n            $('#username, #fullname').editable('getValue');\n            //result:\n            {\n            username: \"superuser\",\n            fullname: \"John\"\n            }\n            //isSingle = true\n            $('#username').editable('getValue', true);\n            //result \"superuser\" \n            **/\n            case 'getValue':\n                if(arguments.length === 2 && arguments[1] === true) { //isSingle = true\n                    result = this.eq(0).data(datakey).value;\n                } else {\n                    this.each(function () {\n                        var $this = $(this), data = $this.data(datakey);\n                        if (data && data.value !== undefined && data.value !== null) {\n                            result[data.options.name] = data.input.value2submit(data.value);\n                        }\n                    });\n                }\n            return result;\n\n            /**\n            This method collects values from several editable elements and submit them all to server.   \n            Internally it runs client-side validation for all fields and submits only in case of success.  \n            See <a href=\"#newrecord\">creating new records</a> for details.  \n            Since 1.5.1 `submit` can be applied to single element to send data programmatically. In that case\n            `url`, `success` and `error` is taken from initial options and you can just call `$('#username').editable('submit')`. \n            \n            @method submit(options)\n            @param {object} options \n            @param {object} options.url url to submit data \n            @param {object} options.data additional data to submit\n            @param {object} options.ajaxOptions additional ajax options\n            @param {function} options.error(obj) error handler \n            @param {function} options.success(obj,config) success handler\n            @returns {Object} jQuery object\n            **/\n            case 'submit':  //collects value, validate and submit to server for creating new record\n                var config = arguments[1] || {},\n                $elems = this,\n                errors = this.editable('validate');\n\n                // validation ok\n                if($.isEmptyObject(errors)) {\n                    var ajaxOptions = {};\n                                                      \n                    // for single element use url, success etc from options\n                    if($elems.length === 1) {\n                        var editable = $elems.data('editable');\n                        //standard params\n                        var params = {\n                            name: editable.options.name || '',\n                            value: editable.input.value2submit(editable.value),\n                            pk: (typeof editable.options.pk === 'function') ? \n                                editable.options.pk.call(editable.options.scope) : \n                                editable.options.pk \n                        };\n\n                        //additional params\n                        if(typeof editable.options.params === 'function') {\n                            params = editable.options.params.call(editable.options.scope, params);  \n                        } else {\n                            //try parse json in single quotes (from data-params attribute)\n                            editable.options.params = $.fn.editableutils.tryParseJson(editable.options.params, true);   \n                            $.extend(params, editable.options.params);\n                        }\n\n                        ajaxOptions = {\n                            url: editable.options.url,\n                            data: params,\n                            type: 'POST'  \n                        };\n                        \n                        // use success / error from options \n                        config.success = config.success || editable.options.success;\n                        config.error = config.error || editable.options.error;\n                        \n                    // multiple elements\n                    } else {\n                        var values = this.editable('getValue'); \n                        \n                        ajaxOptions = {\n                            url: config.url,\n                            data: values, \n                            type: 'POST'\n                        };                        \n                    }                    \n\n                    // ajax success callabck (response 200 OK)\n                    ajaxOptions.success = typeof config.success === 'function' ? function(response) {\n                            config.success.call($elems, response, config);\n                        } : $.noop;\n                                  \n                    // ajax error callabck\n                    ajaxOptions.error = typeof config.error === 'function' ? function() {\n                             config.error.apply($elems, arguments);\n                        } : $.noop;\n                       \n                    // extend ajaxOptions    \n                    if(config.ajaxOptions) { \n                        $.extend(ajaxOptions, config.ajaxOptions);\n                    }\n                    \n                    // extra data \n                    if(config.data) {\n                        $.extend(ajaxOptions.data, config.data);\n                    }                     \n                    \n                    // perform ajax request\n                    $.ajax(ajaxOptions);\n                } else { //client-side validation error\n                    if(typeof config.error === 'function') {\n                        config.error.call($elems, errors);\n                    }\n                }\n            return this;\n        }\n\n        //return jquery object\n        return this.each(function () {\n            var $this = $(this), \n                data = $this.data(datakey), \n                options = typeof option === 'object' && option;\n\n            //for delegated targets do not store `editable` object for element\n            //it's allows several different selectors.\n            //see: https://github.com/vitalets/x-editable/issues/312    \n            if(options && options.selector) {\n                data = new Editable(this, options);\n                return; \n            }    \n            \n            if (!data) {\n                $this.data(datakey, (data = new Editable(this, options)));\n            }\n\n            if (typeof option === 'string') { //call method \n                data[option].apply(data, Array.prototype.slice.call(args, 1));\n            } \n        });\n    };    \n            \n\n    $.fn.editable.defaults = {\n        /**\n        Type of input. Can be <code>text|textarea|select|date|checklist</code> and more\n\n        @property type \n        @type string\n        @default 'text'\n        **/\n        type: 'text',        \n        /**\n        Sets disabled state of editable\n\n        @property disabled \n        @type boolean\n        @default false\n        **/         \n        disabled: false,\n        /**\n        How to toggle editable. Can be <code>click|dblclick|mouseenter|manual</code>.   \n        When set to <code>manual</code> you should manually call <code>show/hide</code> methods of editable.    \n        **Note**: if you call <code>show</code> or <code>toggle</code> inside **click** handler of some DOM element, \n        you need to apply <code>e.stopPropagation()</code> because containers are being closed on any click on document.\n        \n        @example\n        $('#edit-button').click(function(e) {\n            e.stopPropagation();\n            $('#username').editable('toggle');\n        });\n\n        @property toggle \n        @type string\n        @default 'click'\n        **/          \n        toggle: 'click',\n        /**\n        Text shown when element is empty.\n\n        @property emptytext \n        @type string\n        @default 'Empty'\n        **/         \n        emptytext: 'Empty',\n        /**\n        Allows to automatically set element's text based on it's value. Can be <code>auto|always|never</code>. Useful for select and date.\n        For example, if dropdown list is <code>{1: 'a', 2: 'b'}</code> and element's value set to <code>1</code>, it's html will be automatically set to <code>'a'</code>.  \n        <code>auto</code> - text will be automatically set only if element is empty.  \n        <code>always|never</code> - always(never) try to set element's text.\n\n        @property autotext \n        @type string\n        @default 'auto'\n        **/          \n        autotext: 'auto', \n        /**\n        Initial value of input. If not set, taken from element's text.  \n        Note, that if element's text is empty - text is automatically generated from value and can be customized (see `autotext` option).  \n        For example, to display currency sign:\n        @example\n        <a id=\"price\" data-type=\"text\" data-value=\"100\"></a>\n        <script>\n        $('#price').editable({\n            ...\n            display: function(value) {\n              $(this).text(value + '$');\n            } \n        }) \n        </script>\n                \n        @property value \n        @type mixed\n        @default element's text\n        **/\n        value: null,\n        /**\n        Callback to perform custom displaying of value in element's text.  \n        If `null`, default input's display used.  \n        If `false`, no displaying methods will be called, element's text will never change.  \n        Runs under element's scope.  \n        _**Parameters:**_  \n        \n        * `value` current value to be displayed\n        * `response` server response (if display called after ajax submit), since 1.4.0\n         \n        For _inputs with source_ (select, checklist) parameters are different:  \n          \n        * `value` current value to be displayed\n        * `sourceData` array of items for current input (e.g. dropdown items) \n        * `response` server response (if display called after ajax submit), since 1.4.0\n                  \n        To get currently selected items use `$.fn.editableutils.itemsByValue(value, sourceData)`.\n        \n        @property display \n        @type function|boolean\n        @default null\n        @since 1.2.0\n        @example\n        display: function(value, sourceData) {\n           //display checklist as comma-separated values\n           var html = [],\n               checked = $.fn.editableutils.itemsByValue(value, sourceData);\n               \n           if(checked.length) {\n               $.each(checked, function(i, v) { html.push($.fn.editableutils.escape(v.text)); });\n               $(this).html(html.join(', '));\n           } else {\n               $(this).empty(); \n           }\n        }\n        **/          \n        display: null,\n        /**\n        Css class applied when editable text is empty.\n\n        @property emptyclass \n        @type string\n        @since 1.4.1        \n        @default editable-empty\n        **/        \n        emptyclass: 'editable-empty',\n        /**\n        Css class applied when value was stored but not sent to server (`pk` is empty or `send = 'never'`).  \n        You may set it to `null` if you work with editables locally and submit them together.  \n\n        @property unsavedclass \n        @type string\n        @since 1.4.1        \n        @default editable-unsaved\n        **/        \n        unsavedclass: 'editable-unsaved',\n        /**\n        If selector is provided, editable will be delegated to the specified targets.  \n        Usefull for dynamically generated DOM elements.  \n        **Please note**, that delegated targets can't be initialized with `emptytext` and `autotext` options, \n        as they actually become editable only after first click.  \n        You should manually set class `editable-click` to these elements.  \n        Also, if element originally empty you should add class `editable-empty`, set `data-value=\"\"` and write emptytext into element:\n\n        @property selector \n        @type string\n        @since 1.4.1        \n        @default null\n        @example\n        <div id=\"user\">\n          <!-- empty -->\n          <a href=\"#\" data-name=\"username\" data-type=\"text\" class=\"editable-click editable-empty\" data-value=\"\" title=\"Username\">Empty</a>\n          <!-- non-empty -->\n          <a href=\"#\" data-name=\"group\" data-type=\"select\" data-source=\"/groups\" data-value=\"1\" class=\"editable-click\" title=\"Group\">Operator</a>\n        </div>     \n        \n        <script>\n        $('#user').editable({\n            selector: 'a',\n            url: '/post',\n            pk: 1\n        });\n        </script>\n        **/         \n        selector: null,\n        /**\n        Color used to highlight element after update. Implemented via CSS3 transition, works in modern browsers.\n        \n        @property highlight \n        @type string|boolean\n        @since 1.4.5        \n        @default #FFFF80 \n        **/\n        highlight: '#FFFF80'\n    };\n    \n}(window.jQuery));\n\n/**\nAbstractInput - base class for all editable inputs.\nIt defines interface to be implemented by any input type.\nTo create your own input you can inherit from this class.\n\n@class abstractinput\n**/\n(function ($) {\n    \"use strict\";\n\n    //types\n    $.fn.editabletypes = {};\n\n    var AbstractInput = function () { };\n\n    AbstractInput.prototype = {\n       /**\n        Initializes input\n\n        @method init() \n        **/\n       init: function(type, options, defaults) {\n           this.type = type;\n           this.options = $.extend({}, defaults, options);\n       },\n\n       /*\n       this method called before render to init $tpl that is inserted in DOM\n       */\n       prerender: function() {\n           this.$tpl = $(this.options.tpl); //whole tpl as jquery object    \n           this.$input = this.$tpl;         //control itself, can be changed in render method\n           this.$clear = null;              //clear button\n           this.error = null;               //error message, if input cannot be rendered           \n       },\n       \n       /**\n        Renders input from tpl. Can return jQuery deferred object.\n        Can be overwritten in child objects\n\n        @method render()\n       **/\n       render: function() {\n\n       }, \n\n       /**\n        Sets element's html by value. \n\n        @method value2html(value, element)\n        @param {mixed} value\n        @param {DOMElement} element\n       **/\n       value2html: function(value, element) {\n           $(element)[this.options.escape ? 'text' : 'html']($.trim(value));\n       },\n\n       /**\n        Converts element's html to value\n\n        @method html2value(html)\n        @param {string} html\n        @returns {mixed}\n       **/\n       html2value: function(html) {\n           return $('<div>').html(html).text();\n       },\n\n       /**\n        Converts value to string (for internal compare). For submitting to server used value2submit().\n\n        @method value2str(value) \n        @param {mixed} value\n        @returns {string}\n       **/\n       value2str: function(value) {\n           return String(value);\n       }, \n\n       /**\n        Converts string received from server into value. Usually from `data-value` attribute.\n\n        @method str2value(str)\n        @param {string} str\n        @returns {mixed}\n       **/\n       str2value: function(str) {\n           return str;\n       }, \n       \n       /**\n        Converts value for submitting to server. Result can be string or object.\n\n        @method value2submit(value) \n        @param {mixed} value\n        @returns {mixed}\n       **/\n       value2submit: function(value) {\n           return value;\n       },\n\n       /**\n        Sets value of input.\n\n        @method value2input(value) \n        @param {mixed} value\n       **/\n       value2input: function(value) {\n           this.$input.val(value);\n       },\n\n       /**\n        Returns value of input. Value can be object (e.g. datepicker)\n\n        @method input2value() \n       **/\n       input2value: function() { \n           return this.$input.val();\n       }, \n\n       /**\n        Activates input. For text it sets focus.\n\n        @method activate() \n       **/\n       activate: function() {\n           if(this.$input.is(':visible')) {\n               this.$input.focus();\n           }\n       },\n\n       /**\n        Creates input.\n\n        @method clear() \n       **/        \n       clear: function() {\n           this.$input.val(null);\n       },\n\n       /**\n        method to escape html.\n       **/\n       escape: function(str) {\n           return $('<div>').text(str).html();\n       },\n       \n       /**\n        attach handler to automatically submit form when value changed (useful when buttons not shown)\n       **/\n       autosubmit: function() {\n        \n       },\n       \n       /**\n       Additional actions when destroying element \n       **/\n       destroy: function() {\n       },\n\n       // -------- helper functions --------\n       setClass: function() {          \n           if(this.options.inputclass) {\n               this.$input.addClass(this.options.inputclass); \n           } \n       },\n\n       setAttr: function(attr) {\n           if (this.options[attr] !== undefined && this.options[attr] !== null) {\n               this.$input.attr(attr, this.options[attr]);\n           } \n       },\n       \n       option: function(key, value) {\n            this.options[key] = value;\n       }\n       \n    };\n        \n    AbstractInput.defaults = {  \n        /**\n        HTML template of input. Normally you should not change it.\n\n        @property tpl \n        @type string\n        @default ''\n        **/   \n        tpl: '',\n        /**\n        CSS class automatically applied to input\n        \n        @property inputclass \n        @type string\n        @default null\n        **/         \n        inputclass: null,\n        \n        /**\n        If `true` - html will be escaped in content of element via $.text() method.  \n        If `false` - html will not be escaped, $.html() used.  \n        When you use own `display` function, this option obviosly has no effect.\n        \n        @property escape \n        @type boolean\n        @since 1.5.0\n        @default true\n        **/         \n        escape: true,\n                \n        //scope for external methods (e.g. source defined as function)\n        //for internal use only\n        scope: null,\n        \n        //need to re-declare showbuttons here to get it's value from common config (passed only options existing in defaults)\n        showbuttons: true \n    };\n    \n    $.extend($.fn.editabletypes, {abstractinput: AbstractInput});\n        \n}(window.jQuery));\n\n/**\nList - abstract class for inputs that have source option loaded from js array or via ajax\n\n@class list\n@extends abstractinput\n**/\n(function ($) {\n    \"use strict\";\n    \n    var List = function (options) {\n       \n    };\n\n    $.fn.editableutils.inherit(List, $.fn.editabletypes.abstractinput);\n\n    $.extend(List.prototype, {\n        render: function () {\n            var deferred = $.Deferred();\n\n            this.error = null;\n            this.onSourceReady(function () {\n                this.renderList();\n                deferred.resolve();\n            }, function () {\n                this.error = this.options.sourceError;\n                deferred.resolve();\n            });\n\n            return deferred.promise();\n        },\n\n        html2value: function (html) {\n            return null; //can't set value by text\n        },\n        \n        value2html: function (value, element, display, response) {\n            var deferred = $.Deferred(),\n                success = function () {\n                    if(typeof display === 'function') {\n                        //custom display method\n                        display.call(element, value, this.sourceData, response); \n                    } else {\n                        this.value2htmlFinal(value, element);\n                    }\n                    deferred.resolve();\n               };\n            \n            //for null value just call success without loading source\n            if(value === null) {\n               success.call(this);   \n            } else {\n               this.onSourceReady(success, function () { deferred.resolve(); });\n            }\n\n            return deferred.promise();\n        },  \n\n        // ------------- additional functions ------------\n\n        onSourceReady: function (success, error) {\n            //run source if it function\n            var source;\n            if ($.isFunction(this.options.source)) {\n                source = this.options.source.call(this.options.scope);\n                this.sourceData = null;\n                //note: if function returns the same source as URL - sourceData will be taken from cahce and no extra request performed\n            } else {\n                source = this.options.source;\n            }            \n            \n            //if allready loaded just call success\n            if(this.options.sourceCache && $.isArray(this.sourceData)) {\n                success.call(this);\n                return; \n            }\n\n            //try parse json in single quotes (for double quotes jquery does automatically)\n            try {\n                source = $.fn.editableutils.tryParseJson(source, false);\n            } catch (e) {\n                error.call(this);\n                return;\n            }\n\n            //loading from url\n            if (typeof source === 'string') {\n                //try to get sourceData from cache\n                if(this.options.sourceCache) {\n                    var cacheID = source,\n                    cache;\n\n                    if (!$(document).data(cacheID)) {\n                        $(document).data(cacheID, {});\n                    }\n                    cache = $(document).data(cacheID);\n\n                    //check for cached data\n                    if (cache.loading === false && cache.sourceData) { //take source from cache\n                        this.sourceData = cache.sourceData;\n                        this.doPrepend();\n                        success.call(this);\n                        return;\n                    } else if (cache.loading === true) { //cache is loading, put callback in stack to be called later\n                        cache.callbacks.push($.proxy(function () {\n                            this.sourceData = cache.sourceData;\n                            this.doPrepend();\n                            success.call(this);\n                        }, this));\n\n                        //also collecting error callbacks\n                        cache.err_callbacks.push($.proxy(error, this));\n                        return;\n                    } else { //no cache yet, activate it\n                        cache.loading = true;\n                        cache.callbacks = [];\n                        cache.err_callbacks = [];\n                    }\n                }\n                \n                //ajaxOptions for source. Can be overwritten bt options.sourceOptions\n                var ajaxOptions = $.extend({\n                    url: source,\n                    type: 'get',\n                    cache: false,\n                    dataType: 'json',\n                    success: $.proxy(function (data) {\n                        if(cache) {\n                            cache.loading = false;\n                        }\n                        this.sourceData = this.makeArray(data);\n                        if($.isArray(this.sourceData)) {\n                            if(cache) {\n                                //store result in cache\n                                cache.sourceData = this.sourceData;\n                                //run success callbacks for other fields waiting for this source\n                                $.each(cache.callbacks, function () { this.call(); }); \n                            }\n                            this.doPrepend();\n                            success.call(this);\n                        } else {\n                            error.call(this);\n                            if(cache) {\n                                //run error callbacks for other fields waiting for this source\n                                $.each(cache.err_callbacks, function () { this.call(); }); \n                            }\n                        }\n                    }, this),\n                    error: $.proxy(function () {\n                        error.call(this);\n                        if(cache) {\n                             cache.loading = false;\n                             //run error callbacks for other fields\n                             $.each(cache.err_callbacks, function () { this.call(); }); \n                        }\n                    }, this)\n                }, this.options.sourceOptions);\n                \n                //loading sourceData from server\n                $.ajax(ajaxOptions);\n                \n            } else { //options as json/array\n                this.sourceData = this.makeArray(source);\n                    \n                if($.isArray(this.sourceData)) {\n                    this.doPrepend();\n                    success.call(this);   \n                } else {\n                    error.call(this);\n                }\n            }\n        },\n\n        doPrepend: function () {\n            if(this.options.prepend === null || this.options.prepend === undefined) {\n                return;  \n            }\n            \n            if(!$.isArray(this.prependData)) {\n                //run prepend if it is function (once)\n                if ($.isFunction(this.options.prepend)) {\n                    this.options.prepend = this.options.prepend.call(this.options.scope);\n                }\n              \n                //try parse json in single quotes\n                this.options.prepend = $.fn.editableutils.tryParseJson(this.options.prepend, true);\n                \n                //convert prepend from string to object\n                if (typeof this.options.prepend === 'string') {\n                    this.options.prepend = {'': this.options.prepend};\n                }\n                \n                this.prependData = this.makeArray(this.options.prepend);\n            }\n\n            if($.isArray(this.prependData) && $.isArray(this.sourceData)) {\n                this.sourceData = this.prependData.concat(this.sourceData);\n            }\n        },\n\n        /*\n         renders input list\n        */\n        renderList: function() {\n            // this method should be overwritten in child class\n        },\n       \n         /*\n         set element's html by value\n        */\n        value2htmlFinal: function(value, element) {\n            // this method should be overwritten in child class\n        },        \n\n        /**\n        * convert data to array suitable for sourceData, e.g. [{value: 1, text: 'abc'}, {...}]\n        */\n        makeArray: function(data) {\n            var count, obj, result = [], item, iterateItem;\n            if(!data || typeof data === 'string') {\n                return null; \n            }\n\n            if($.isArray(data)) { //array\n                /* \n                   function to iterate inside item of array if item is object.\n                   Caclulates count of keys in item and store in obj. \n                */\n                iterateItem = function (k, v) {\n                    obj = {value: k, text: v};\n                    if(count++ >= 2) {\n                        return false;// exit from `each` if item has more than one key.\n                    }\n                };\n            \n                for(var i = 0; i < data.length; i++) {\n                    item = data[i]; \n                    if(typeof item === 'object') {\n                        count = 0; //count of keys inside item\n                        $.each(item, iterateItem);\n                        //case: [{val1: 'text1'}, {val2: 'text2} ...]\n                        if(count === 1) { \n                            result.push(obj); \n                            //case: [{value: 1, text: 'text1'}, {value: 2, text: 'text2'}, ...]\n                        } else if(count > 1) {\n                            //removed check of existance: item.hasOwnProperty('value') && item.hasOwnProperty('text')\n                            if(item.children) {\n                                item.children = this.makeArray(item.children);   \n                            }\n                            result.push(item);\n                        }\n                    } else {\n                        //case: ['text1', 'text2' ...]\n                        result.push({value: item, text: item}); \n                    }\n                }\n            } else {  //case: {val1: 'text1', val2: 'text2, ...}\n                $.each(data, function (k, v) {\n                    result.push({value: k, text: v});\n                });  \n            }\n            return result;\n        },\n        \n        option: function(key, value) {\n            this.options[key] = value;\n            if(key === 'source') {\n                this.sourceData = null;\n            }\n            if(key === 'prepend') {\n                this.prependData = null;\n            }            \n        }        \n\n    });      \n\n    List.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        /**\n        Source data for list.  \n        If **array** - it should be in format: `[{value: 1, text: \"text1\"}, {value: 2, text: \"text2\"}, ...]`  \n        For compability, object format is also supported: `{\"1\": \"text1\", \"2\": \"text2\" ...}` but it does not guarantee elements order.\n        \n        If **string** - considered ajax url to load items. In that case results will be cached for fields with the same source and name. See also `sourceCache` option.\n          \n        If **function**, it should return data in format above (since 1.4.0).\n        \n        Since 1.4.1 key `children` supported to render OPTGROUP (for **select** input only):  \n        @example\n        [\n          {text: \"group1\", children: [\n            {value: 1, text: \"text1\"}, \n            {value: 2, text: \"text2\"}\n          ]}, \n          ...\n        ] \n\n\t\t\n        @property source \n        @type string | array | object | function\n        @default null\n        **/         \n        source: null, \n        /**\n        Data automatically prepended to the beginning of dropdown list.\n        \n        @property prepend \n        @type string | array | object | function\n        @default false\n        **/         \n        prepend: false,\n        /**\n        Error message when list cannot be loaded (e.g. ajax error)\n        \n        @property sourceError \n        @type string\n        @default Error when loading list\n        **/          \n        sourceError: 'Error when loading list',\n        /**\n        if `true` and source is **string url** - results will be cached for fields with the same source.    \n        Usefull for editable column in grid to prevent extra requests.\n        \n        @property sourceCache \n        @type boolean\n        @default true\n        @since 1.2.0\n        **/        \n        sourceCache: true,\n        /**\n        Additional ajax options to be used in $.ajax() when loading list from server.\n        Useful to send extra parameters or change request method.\n        \n        @property sourceOptions \n        @type object|function\n        @default null\n        @since 1.5.0\n        @example\n        sourceOptions: {\n            data: {param: 123},\n            type: 'post'\n        }\n        \n        **/        \n        sourceOptions: null\n    });\n\n    $.fn.editabletypes.list = List;      \n\n}(window.jQuery));\n\n/**\nText input\n\n@class text\n@extends abstractinput\n@final\n@example\n<a href=\"#\" id=\"username\" data-type=\"text\" data-pk=\"1\">awesome</a>\n<script>\n$(function(){\n    $('#username').editable({\n        url: '/post',\n        title: 'Enter username'\n    });\n});\n</script>\n**/\n(function ($) {\n    \"use strict\";\n\n    var Text = function (options) {\n        this.init('text', options, Text.defaults);\n    };\n\n    $.fn.editableutils.inherit(Text, $.fn.editabletypes.abstractinput);\n\n    $.extend(Text.prototype, {\n        render: function() {\n           this.renderClear();\n           this.setClass();\n           this.setAttr('placeholder');\n        },\n\n        activate: function() {\n            if(this.$input.is(':visible')) {\n                this.$input.focus();\n//                if (this.$input.is('input,textarea') && !this.$input.is('[type=\"checkbox\"],[type=\"range\"],[type=\"number\"],[type=\"email\"]')) {\n                if (this.$input.is('input,textarea') && !this.$input.is('[type=\"checkbox\"],[type=\"range\"]')) {\n                    $.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length);\n                }\n\n                if(this.toggleClear) {\n                    this.toggleClear();\n                }\n            }\n        },\n\n        //render clear button\n        renderClear:  function() {\n           if (this.options.clear) {\n               this.$clear = $('<span class=\"editable-clear-x\"></span>');\n               this.$input.after(this.$clear)\n                          .css('padding-right', 24)\n                          .keyup($.proxy(function(e) {\n                              //arrows, enter, tab, etc\n                              if(~$.inArray(e.keyCode, [40,38,9,13,27])) {\n                                return;\n                              }\n\n                              clearTimeout(this.t);\n                              var that = this;\n                              this.t = setTimeout(function() {\n                                that.toggleClear(e);\n                              }, 100);\n\n                          }, this))\n                          .parent().css('position', 'relative');\n\n               this.$clear.click($.proxy(this.clear, this));\n           }\n        },\n\n        postrender: function() {\n            /*\n            //now `clear` is positioned via css\n            if(this.$clear) {\n                //can position clear button only here, when form is shown and height can be calculated\n//                var h = this.$input.outerHeight(true) || 20,\n                var h = this.$clear.parent().height(),\n                    delta = (h - this.$clear.height()) / 2;\n\n                //this.$clear.css({bottom: delta, right: delta});\n            }\n            */\n        },\n\n        //show / hide clear button\n        toggleClear: function(e) {\n            if(!this.$clear) {\n                return;\n            }\n\n            var len = this.$input.val().length,\n                visible = this.$clear.is(':visible');\n\n            if(len && !visible) {\n                this.$clear.show();\n            }\n\n            if(!len && visible) {\n                this.$clear.hide();\n            }\n        },\n\n        clear: function() {\n           this.$clear.hide();\n           this.$input.val('').focus();\n        }\n    });\n\n    Text.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        /**\n        @property tpl\n        @default <input type=\"text\">\n        **/\n        tpl: '<input type=\"text\">',\n        /**\n        Placeholder attribute of input. Shown when input is empty.\n\n        @property placeholder\n        @type string\n        @default null\n        **/\n        placeholder: null,\n\n        /**\n        Whether to show `clear` button\n\n        @property clear\n        @type boolean\n        @default true\n        **/\n        clear: true\n    });\n\n    $.fn.editabletypes.text = Text;\n\n}(window.jQuery));\n\n/**\nTextarea input\n\n@class textarea\n@extends abstractinput\n@final\n@example\n<a href=\"#\" id=\"comments\" data-type=\"textarea\" data-pk=\"1\">awesome comment!</a>\n<script>\n$(function(){\n    $('#comments').editable({\n        url: '/post',\n        title: 'Enter comments',\n        rows: 10\n    });\n});\n</script>\n**/\n(function ($) {\n    \"use strict\";\n    \n    var Textarea = function (options) {\n        this.init('textarea', options, Textarea.defaults);\n    };\n\n    $.fn.editableutils.inherit(Textarea, $.fn.editabletypes.abstractinput);\n\n    $.extend(Textarea.prototype, {\n        render: function () {\n            this.setClass();\n            this.setAttr('placeholder');\n            this.setAttr('rows');                        \n            \n            //ctrl + enter\n            this.$input.keydown(function (e) {\n                if (e.ctrlKey && e.which === 13) {\n                    $(this).closest('form').submit();\n                }\n            });\n        },\n        \n       //using `white-space: pre-wrap` solves \\n  <--> BR conversion very elegant!\n       /* \n       value2html: function(value, element) {\n            var html = '', lines;\n            if(value) {\n                lines = value.split(\"\\n\");\n                for (var i = 0; i < lines.length; i++) {\n                    lines[i] = $('<div>').text(lines[i]).html();\n                }\n                html = lines.join('<br>');\n            }\n            $(element).html(html);\n        },\n       \n        html2value: function(html) {\n            if(!html) {\n                return '';\n            }\n\n            var regex = new RegExp(String.fromCharCode(10), 'g');\n            var lines = html.split(/<br\\s*\\/?>/i);\n            for (var i = 0; i < lines.length; i++) {\n                var text = $('<div>').html(lines[i]).text();\n\n                // Remove newline characters (\\n) to avoid them being converted by value2html() method\n                // thus adding extra <br> tags\n                text = text.replace(regex, '');\n\n                lines[i] = text;\n            }\n            return lines.join(\"\\n\");\n        },\n         */\n        activate: function() {\n            $.fn.editabletypes.text.prototype.activate.call(this);\n        }\n    });\n\n    Textarea.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        /**\n        @property tpl\n        @default <textarea></textarea>\n        **/\n        tpl:'<textarea></textarea>',\n        /**\n        @property inputclass\n        @default input-large\n        **/\n        inputclass: 'input-large',\n        /**\n        Placeholder attribute of input. Shown when input is empty.\n\n        @property placeholder\n        @type string\n        @default null\n        **/\n        placeholder: null,\n        /**\n        Number of rows in textarea\n\n        @property rows\n        @type integer\n        @default 7\n        **/        \n        rows: 7        \n    });\n\n    $.fn.editabletypes.textarea = Textarea;\n\n}(window.jQuery));\n\n/**\nSelect (dropdown)\n\n@class select\n@extends list\n@final\n@example\n<a href=\"#\" id=\"status\" data-type=\"select\" data-pk=\"1\" data-url=\"/post\" data-title=\"Select status\"></a>\n<script>\n$(function(){\n    $('#status').editable({\n        value: 2,    \n        source: [\n              {value: 1, text: 'Active'},\n              {value: 2, text: 'Blocked'},\n              {value: 3, text: 'Deleted'}\n           ]\n    });\n});\n</script>\n**/\n(function ($) {\n    \"use strict\";\n    \n    var Select = function (options) {\n        this.init('select', options, Select.defaults);\n    };\n\n    $.fn.editableutils.inherit(Select, $.fn.editabletypes.list);\n\n    $.extend(Select.prototype, {\n        renderList: function() {\n            this.$input.empty();\n            var escape = this.options.escape;\n\n            var fillItems = function($el, data) {\n                var attr;\n                if($.isArray(data)) {\n                    for(var i=0; i<data.length; i++) {\n                        attr = {};\n                        if(data[i].children) {\n                            attr.label = data[i].text;\n                            $el.append(fillItems($('<optgroup>', attr), data[i].children)); \n                        } else {\n                            attr.value = data[i].value;\n                            if(data[i].disabled) {\n                                attr.disabled = true;\n                            }\n                            var $option = $('<option>', attr);\n                            $option[escape ? 'text' : 'html'](data[i].text);\n                            $el.append($option);\n                        }\n                    }\n                }\n                return $el;\n            };        \n\n            fillItems(this.$input, this.sourceData);\n            \n            this.setClass();\n            \n            //enter submit\n            this.$input.on('keydown.editable', function (e) {\n                if (e.which === 13) {\n                    $(this).closest('form').submit();\n                }\n            });            \n        },\n       \n        value2htmlFinal: function(value, element) {\n            var text = '', \n                items = $.fn.editableutils.itemsByValue(value, this.sourceData);\n                \n            if(items.length) {\n                text = items[0].text;\n            }\n            \n            //$(element).text(text);\n            $.fn.editabletypes.abstractinput.prototype.value2html.call(this, text, element);\n        },\n        \n        autosubmit: function() {\n            this.$input.off('keydown.editable').on('change.editable', function(){\n                $(this).closest('form').submit();\n            });\n        }\n    });      \n\n    Select.defaults = $.extend({}, $.fn.editabletypes.list.defaults, {\n        /**\n        @property tpl \n        @default <select></select>\n        **/         \n        tpl:'<select></select>'\n    });\n\n    $.fn.editabletypes.select = Select;      \n\n}(window.jQuery));\n\n/**\nList of checkboxes. \nInternally value stored as javascript array of values.\n\n@class checklist\n@extends list\n@final\n@example\n<a href=\"#\" id=\"options\" data-type=\"checklist\" data-pk=\"1\" data-url=\"/post\" data-title=\"Select options\"></a>\n<script>\n$(function(){\n    $('#options').editable({\n        value: [2, 3],    \n        source: [\n              {value: 1, text: 'option1'},\n              {value: 2, text: 'option2'},\n              {value: 3, text: 'option3'}\n           ]\n    });\n});\n</script>\n**/\n(function ($) {\n    \"use strict\";\n    \n    var Checklist = function (options) {\n        this.init('checklist', options, Checklist.defaults);\n    };\n\n    $.fn.editableutils.inherit(Checklist, $.fn.editabletypes.list);\n\n    $.extend(Checklist.prototype, {\n        renderList: function() {\n            var $label, $div;\n            \n            this.$tpl.empty();\n            \n            if(!$.isArray(this.sourceData)) {\n                return;\n            }\n\n            for(var i=0; i<this.sourceData.length; i++) {\n                $label = $('<label>').append($('<input>', {\n                                           type: 'checkbox',\n                                           value: this.sourceData[i].value \n                                     }));\n                var $option = $('<span>');\n                $option[this.options.escape ? 'text' : 'html'](' '+this.sourceData[i].text);\n                $label.append($option);\n\n                $('<div>').append($label).appendTo(this.$tpl);\n            }\n\n            this.$input = this.$tpl.find('input[type=\"checkbox\"]');\n            this.setClass();\n        },\n       \n       value2str: function(value) {\n           return $.isArray(value) ? value.sort().join($.trim(this.options.separator)) : '';\n       },  \n       \n       //parse separated string\n        str2value: function(str) {\n           var reg, value = null;\n           if(typeof str === 'string' && str.length) {\n               reg = new RegExp('\\\\s*'+$.trim(this.options.separator)+'\\\\s*');\n               value = str.split(reg);\n           } else if($.isArray(str)) {\n               value = str; \n           } else {\n               value = [str];\n           }\n           return value;\n        },       \n       \n       //set checked on required checkboxes\n       value2input: function(value) {\n            this.$input.prop('checked', false);\n            if($.isArray(value) && value.length) {\n               this.$input.each(function(i, el) {\n                   var $el = $(el);\n                   // cannot use $.inArray as it performs strict comparison\n                   $.each(value, function(j, val){\n                       /*jslint eqeq: true*/\n                       if($el.val() == val) {\n                       /*jslint eqeq: false*/                           \n                           $el.prop('checked', true);\n                       }\n                   });\n               }); \n            }  \n        },  \n        \n       input2value: function() { \n           var checked = [];\n           this.$input.filter(':checked').each(function(i, el) {\n               checked.push($(el).val());\n           });\n           return checked;\n       },            \n          \n       //collect text of checked boxes\n        value2htmlFinal: function(value, element) {\n           var html = [],\n               checked = $.fn.editableutils.itemsByValue(value, this.sourceData),\n               escape = this.options.escape;\n               \n           if(checked.length) {\n               $.each(checked, function(i, v) {\n                   var text = escape ? $.fn.editableutils.escape(v.text) : v.text; \n                   html.push(text); \n               });\n               $(element).html(html.join('<br>'));\n           } else {\n               $(element).empty(); \n           }\n        },\n        \n       activate: function() {\n           this.$input.first().focus();\n       },\n       \n       autosubmit: function() {\n           this.$input.on('keydown', function(e){\n               if (e.which === 13) {\n                   $(this).closest('form').submit();\n               }\n           });\n       }\n    });      \n\n    Checklist.defaults = $.extend({}, $.fn.editabletypes.list.defaults, {\n        /**\n        @property tpl \n        @default <div></div>\n        **/         \n        tpl:'<div class=\"editable-checklist\"></div>',\n        \n        /**\n        @property inputclass \n        @type string\n        @default null\n        **/         \n        inputclass: null,        \n        \n        /**\n        Separator of values when reading from `data-value` attribute\n\n        @property separator \n        @type string\n        @default ','\n        **/         \n        separator: ','\n    });\n\n    $.fn.editabletypes.checklist = Checklist;      \n\n}(window.jQuery));\n\n/**\nHTML5 input types.\nFollowing types are supported:\n\n* password\n* email\n* url\n* tel\n* number\n* range\n* time\n\nLearn more about html5 inputs:  \nhttp://www.w3.org/wiki/HTML5_form_additions  \nTo check browser compatibility please see:  \nhttps://developer.mozilla.org/en-US/docs/HTML/Element/Input\n            \n@class html5types \n@extends text\n@final\n@since 1.3.0\n@example\n<a href=\"#\" id=\"email\" data-type=\"email\" data-pk=\"1\">admin@example.com</a>\n<script>\n$(function(){\n    $('#email').editable({\n        url: '/post',\n        title: 'Enter email'\n    });\n});\n</script>\n**/\n\n/**\n@property tpl \n@default depends on type\n**/ \n\n/*\nPassword\n*/\n(function ($) {\n    \"use strict\";\n    \n    var Password = function (options) {\n        this.init('password', options, Password.defaults);\n    };\n    $.fn.editableutils.inherit(Password, $.fn.editabletypes.text);\n    $.extend(Password.prototype, {\n       //do not display password, show '[hidden]' instead\n       value2html: function(value, element) {\n           if(value) {\n               $(element).text('[hidden]');\n           } else {\n               $(element).empty(); \n           }\n       },\n       //as password not displayed, should not set value by html\n       html2value: function(html) {\n           return null;\n       }       \n    });    \n    Password.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {\n        tpl: '<input type=\"password\">'\n    });\n    $.fn.editabletypes.password = Password;\n}(window.jQuery));\n\n\n/*\nEmail\n*/\n(function ($) {\n    \"use strict\";\n    \n    var Email = function (options) {\n        this.init('email', options, Email.defaults);\n    };\n    $.fn.editableutils.inherit(Email, $.fn.editabletypes.text);\n    Email.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {\n        tpl: '<input type=\"email\">'\n    });\n    $.fn.editabletypes.email = Email;\n}(window.jQuery));\n\n\n/*\nUrl\n*/\n(function ($) {\n    \"use strict\";\n    \n    var Url = function (options) {\n        this.init('url', options, Url.defaults);\n    };\n    $.fn.editableutils.inherit(Url, $.fn.editabletypes.text);\n    Url.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {\n        tpl: '<input type=\"url\">'\n    });\n    $.fn.editabletypes.url = Url;\n}(window.jQuery));\n\n\n/*\nTel\n*/\n(function ($) {\n    \"use strict\";\n    \n    var Tel = function (options) {\n        this.init('tel', options, Tel.defaults);\n    };\n    $.fn.editableutils.inherit(Tel, $.fn.editabletypes.text);\n    Tel.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {\n        tpl: '<input type=\"tel\">'\n    });\n    $.fn.editabletypes.tel = Tel;\n}(window.jQuery));\n\n\n/*\nNumber\n*/\n(function ($) {\n    \"use strict\";\n    \n    var NumberInput = function (options) {\n        this.init('number', options, NumberInput.defaults);\n    };\n    $.fn.editableutils.inherit(NumberInput, $.fn.editabletypes.text);\n    $.extend(NumberInput.prototype, {\n         render: function () {\n            NumberInput.superclass.render.call(this);\n            this.setAttr('min');\n            this.setAttr('max');\n            this.setAttr('step');\n        },\n        postrender: function() {\n            if(this.$clear) {\n                //increase right ffset  for up/down arrows\n                this.$clear.css({right: 24});\n                /*\n                //can position clear button only here, when form is shown and height can be calculated\n                var h = this.$input.outerHeight(true) || 20,\n                    delta = (h - this.$clear.height()) / 2;\n                \n                //add 12px to offset right for up/down arrows    \n                this.$clear.css({top: delta, right: delta + 16});\n                */\n            } \n        }        \n    });     \n    NumberInput.defaults = $.extend({}, $.fn.editabletypes.text.defaults, {\n        tpl: '<input type=\"number\">',\n        inputclass: 'input-mini',\n        min: null,\n        max: null,\n        step: null\n    });\n    $.fn.editabletypes.number = NumberInput;\n}(window.jQuery));\n\n\n/*\nRange (inherit from number)\n*/\n(function ($) {\n    \"use strict\";\n    \n    var Range = function (options) {\n        this.init('range', options, Range.defaults);\n    };\n    $.fn.editableutils.inherit(Range, $.fn.editabletypes.number);\n    $.extend(Range.prototype, {\n        render: function () {\n            this.$input = this.$tpl.filter('input');\n            \n            this.setClass();\n            this.setAttr('min');\n            this.setAttr('max');\n            this.setAttr('step');           \n            \n            this.$input.on('input', function(){\n                $(this).siblings('output').text($(this).val()); \n            });  \n        },\n        activate: function() {\n            this.$input.focus();\n        }         \n    });\n    Range.defaults = $.extend({}, $.fn.editabletypes.number.defaults, {\n        tpl: '<input type=\"range\"><output style=\"width: 30px; display: inline-block\"></output>',\n        inputclass: 'input-medium'\n    });\n    $.fn.editabletypes.range = Range;\n}(window.jQuery));\n\n/*\nTime\n*/\n(function ($) {\n    \"use strict\";\n\n    var Time = function (options) {\n        this.init('time', options, Time.defaults);\n    };\n    //inherit from abstract, as inheritance from text gives selection error.\n    $.fn.editableutils.inherit(Time, $.fn.editabletypes.abstractinput);\n    $.extend(Time.prototype, {\n        render: function() {\n           this.setClass();\n        }        \n    });\n    Time.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        tpl: '<input type=\"time\">'\n    });\n    $.fn.editabletypes.time = Time;\n}(window.jQuery));\n\n/**\nSelect2 input. Based on amazing work of Igor Vaynberg https://github.com/ivaynberg/select2.  \nPlease see [original select2 docs](http://ivaynberg.github.com/select2) for detailed description and options.  \n \nYou should manually download and include select2 distributive:  \n\n    <link href=\"select2/select2.css\" rel=\"stylesheet\" type=\"text/css\"></link>  \n    <script src=\"select2/select2.js\"></script>  \n    \nTo make it **bootstrap-styled** you can use css from [here](https://github.com/t0m/select2-bootstrap-css): \n\n    <link href=\"select2-bootstrap.css\" rel=\"stylesheet\" type=\"text/css\"></link>    \n    \n**Note:** currently `autotext` feature does not work for select2 with `ajax` remote source.    \nYou need initially put both `data-value` and element's text youself:    \n\n    <a href=\"#\" data-type=\"select2\" data-value=\"1\">Text1</a>\n    \n    \n@class select2\n@extends abstractinput\n@since 1.4.1\n@final\n@example\n<a href=\"#\" id=\"country\" data-type=\"select2\" data-pk=\"1\" data-value=\"ru\" data-url=\"/post\" data-title=\"Select country\"></a>\n<script>\n$(function(){\n    //local source\n    $('#country').editable({\n        source: [\n              {id: 'gb', text: 'Great Britain'},\n              {id: 'us', text: 'United States'},\n              {id: 'ru', text: 'Russia'}\n           ],\n        select2: {\n           multiple: true\n        }\n    });\n    //remote source (simple)\n    $('#country').editable({\n        source: '/getCountries',\n        select2: {\n            placeholder: 'Select Country',\n            minimumInputLength: 1\n        }\n    });\n    //remote source (advanced)\n    $('#country').editable({\n        select2: {\n            placeholder: 'Select Country',\n            allowClear: true,\n            minimumInputLength: 3,\n            id: function (item) {\n                return item.CountryId;\n            },\n            ajax: {\n                url: '/getCountries',\n                dataType: 'json',\n                data: function (term, page) {\n                    return { query: term };\n                },\n                results: function (data, page) {\n                    return { results: data };\n                }\n            },\n            formatResult: function (item) {\n                return item.CountryName;\n            },\n            formatSelection: function (item) {\n                return item.CountryName;\n            },\n            initSelection: function (element, callback) {\n                return $.get('/getCountryById', { query: element.val() }, function (data) {\n                    callback(data);\n                });\n            } \n        }  \n    });\n});\n</script>\n**/\n(function ($) {\n    \"use strict\";\n    \n    var Constructor = function (options) {\n        this.init('select2', options, Constructor.defaults);\n\n        options.select2 = options.select2 || {};\n\n        this.sourceData = null;\n\n        //placeholder\n        if(options.placeholder) {\n            options.select2.placeholder = options.placeholder;\n        }\n       \n        //if not `tags` mode, use source\n        if(!options.select2.tags && options.source) {\n            var source = options.source;\n            //if source is function, call it (once!)\n            if ($.isFunction(options.source)) {\n                source = options.source.call(options.scope);\n            }               \n\n            if (typeof source === 'string') {\n                options.select2.ajax = options.select2.ajax || {};\n                //some default ajax params\n                if(!options.select2.ajax.data) {\n                    options.select2.ajax.data = function(term) {return { query:term };};\n                }\n                if(!options.select2.ajax.results) {\n                    options.select2.ajax.results = function(data) { return {results:data };};\n                }\n                options.select2.ajax.url = source;\n            } else {\n                //check format and convert x-editable format to select2 format (if needed)\n                this.sourceData = this.convertSource(source);\n                options.select2.data = this.sourceData;\n            }\n        } \n\n        //overriding objects in config (as by default jQuery extend() is not recursive)\n        this.options.select2 = $.extend({}, Constructor.defaults.select2, options.select2);\n\n        //detect whether it is multi-valued\n        this.isMultiple = this.options.select2.tags || this.options.select2.multiple;\n        this.isRemote = ('ajax' in this.options.select2);\n\n        //store function returning ID of item\n        //should be here as used inautotext for local source\n        this.idFunc = this.options.select2.id;\n        if (typeof(this.idFunc) !== \"function\") {\n            var idKey = this.idFunc || 'id';\n            this.idFunc = function (e) { return e[idKey]; };\n        }\n\n        //store function that renders text in select2\n        this.formatSelection = this.options.select2.formatSelection;\n        if (typeof(this.formatSelection) !== \"function\") {\n            this.formatSelection = function (e) { return e.text; };\n        }\n    };\n\n    $.fn.editableutils.inherit(Constructor, $.fn.editabletypes.abstractinput);\n\n    $.extend(Constructor.prototype, {\n        render: function() {\n            this.setClass();\n\n            //can not apply select2 here as it calls initSelection \n            //over input that does not have correct value yet.\n            //apply select2 only in value2input\n            //this.$input.select2(this.options.select2);\n\n            //when data is loaded via ajax, we need to know when it's done to populate listData\n            if(this.isRemote) {\n                //listen to loaded event to populate data\n                this.$input.on('select2-loaded', $.proxy(function(e) {\n                    this.sourceData = e.items.results;\n                }, this));\n            }\n\n            //trigger resize of editableform to re-position container in multi-valued mode\n            if(this.isMultiple) {\n               this.$input.on('change', function() {\n                   $(this).closest('form').parent().triggerHandler('resize');\n               });\n            }\n       },\n\n       value2html: function(value, element) {\n           var text = '', data,\n               that = this;\n\n           if(this.options.select2.tags) { //in tags mode just assign value\n              data = value; \n              //data = $.fn.editableutils.itemsByValue(value, this.options.select2.tags, this.idFunc);\n           } else if(this.sourceData) {\n              data = $.fn.editableutils.itemsByValue(value, this.sourceData, this.idFunc); \n           } else {\n              //can not get list of possible values \n              //(e.g. autotext for select2 with ajax source)\n           }\n\n           //data may be array (when multiple values allowed)\n           if($.isArray(data)) {\n               //collect selected data and show with separator\n               text = [];\n               $.each(data, function(k, v){\n                   text.push(v && typeof v === 'object' ? that.formatSelection(v) : v);\n               });\n           } else if(data) {\n               text = that.formatSelection(data);\n           }\n\n           text = $.isArray(text) ? text.join(this.options.viewseparator) : text;\n\n           //$(element).text(text);\n           Constructor.superclass.value2html.call(this, text, element); \n       },\n\n       html2value: function(html) {\n           return this.options.select2.tags ? this.str2value(html, this.options.viewseparator) : null;\n       },\n\n       value2input: function(value) {\n           // if value array => join it anyway\n           if($.isArray(value)) {\n              value = value.join(this.getSeparator());\n           }\n\n           //for remote source just set value, text is updated by initSelection\n           if(!this.$input.data('select2')) {\n               this.$input.val(value);\n               this.$input.select2(this.options.select2);\n           } else {\n               //second argument needed to separate initial change from user's click (for autosubmit)   \n               this.$input.val(value).trigger('change', true); \n\n               //Uncaught Error: cannot call val() if initSelection() is not defined\n               //this.$input.select2('val', value);\n           }\n\n           // if defined remote source AND no multiple mode AND no user's initSelection provided --> \n           // we should somehow get text for provided id.\n           // The solution is to use element's text as text for that id (exclude empty)\n           if(this.isRemote && !this.isMultiple && !this.options.select2.initSelection) {\n               // customId and customText are methods to extract `id` and `text` from data object\n               // we can use this workaround only if user did not define these methods\n               // otherwise we cant construct data object\n               var customId = this.options.select2.id,\n                   customText = this.options.select2.formatSelection;\n\n               if(!customId && !customText) {\n                   var $el = $(this.options.scope);\n                   if (!$el.data('editable').isEmpty) {\n                       var data = {id: value, text: $el.text()};\n                       this.$input.select2('data', data); \n                   }\n               }\n           }\n       },\n       \n       input2value: function() { \n           return this.$input.select2('val');\n       },\n\n       str2value: function(str, separator) {\n            if(typeof str !== 'string' || !this.isMultiple) {\n                return str;\n            }\n\n            separator = separator || this.getSeparator();\n\n            var val, i, l;\n\n            if (str === null || str.length < 1) {\n                return null;\n            }\n            val = str.split(separator);\n            for (i = 0, l = val.length; i < l; i = i + 1) {\n                val[i] = $.trim(val[i]);\n            }\n\n            return val;\n       },\n\n        autosubmit: function() {\n            this.$input.on('change', function(e, isInitial){\n                if(!isInitial) {\n                  $(this).closest('form').submit();\n                }\n            });\n        },\n\n        getSeparator: function() {\n            return this.options.select2.separator || $.fn.select2.defaults.separator;\n        },\n\n        /*\n        Converts source from x-editable format: {value: 1, text: \"1\"} to\n        select2 format: {id: 1, text: \"1\"}\n        */\n        convertSource: function(source) {\n            if($.isArray(source) && source.length && source[0].value !== undefined) {\n                for(var i = 0; i<source.length; i++) {\n                    if(source[i].value !== undefined) {\n                        source[i].id = source[i].value;\n                        delete source[i].value;\n                    }\n                }\n            }\n            return source;\n        },\n        \n        activate: function() {\n            this.$input.select2('open');\n        },\n        \n        destroy: function() {\n            if(this.$input) {\n                if(this.$input.data('select2')) {\n                    this.$input.select2('destroy');\n                }\n            }\n        }\n        \n    });\n\n    Constructor.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        /**\n        @property tpl \n        @default <input type=\"hidden\">\n        **/\n        tpl:'<input type=\"hidden\">',\n        /**\n        Configuration of select2. [Full list of options](http://ivaynberg.github.com/select2).\n\n        @property select2 \n        @type object\n        @default null\n        **/\n        select2: null,\n        /**\n        Placeholder attribute of select\n\n        @property placeholder \n        @type string\n        @default null\n        **/\n        placeholder: null,\n        /**\n        Source data for select. It will be assigned to select2 `data` property and kept here just for convenience.\n        Please note, that format is different from simple `select` input: use 'id' instead of 'value'.\n        E.g. `[{id: 1, text: \"text1\"}, {id: 2, text: \"text2\"}, ...]`.\n\n        @property source \n        @type array|string|function\n        @default null        \n        **/\n        source: null,\n        /**\n        Separator used to display tags.\n\n        @property viewseparator \n        @type string\n        @default ', '        \n        **/\n        viewseparator: ', '\n    });\n\n    $.fn.editabletypes.select2 = Constructor;\n\n}(window.jQuery));\n\n/**\n* Combodate - 1.1.0\n* Dropdown date and time picker.\n* Converts text input into dropdowns to pick day, month, year, hour, minute and second.\n* Uses momentjs as datetime library http://momentjs.com.\n* For i18n include corresponding file from https://github.com/timrwood/moment/tree/master/lang\n*\n* Confusion at noon and midnight - see http://en.wikipedia.org/wiki/12-hour_clock#Confusion_at_noon_and_midnight\n* In combodate:\n* 12:00 pm --> 12:00 (24-h format, midday)\n* 12:00 am --> 00:00 (24-h format, midnight, start of day)\n*\n* Differs from momentjs parse rules:\n* 00:00 pm, 12:00 pm --> 12:00 (24-h format, day not change)\n* 00:00 am, 12:00 am --> 00:00 (24-h format, day not change)\n*\n*\n* Author: Vitaliy Potapov\n* Project page: http://github.com/vitalets/combodate\n* Copyright (c) 2012 Vitaliy Potapov. Released under MIT License.\n**/\n(function ($) {\n\n    var Combodate = function (element, options) {\n        this.$element = $(element);\n        if(!this.$element.is('input')) {\n            $.error('Combodate should be applied to INPUT element');\n            return;\n        }\n        this.options = $.extend({}, $.fn.combodate.defaults, options, this.$element.data());\n        this.init();\n     };\n\n    Combodate.prototype = {\n        constructor: Combodate,\n        init: function () {\n            this.map = {\n                //key   regexp    moment.method\n                day:    ['D',    'date'],\n                month:  ['M',    'month'],\n                year:   ['Y',    'year'],\n                hour:   ['[Hh]', 'hours'],\n                minute: ['m',    'minutes'],\n                second: ['s',    'seconds'],\n                ampm:   ['[Aa]', '']\n            };\n\n            this.$widget = $('<span class=\"combodate\"></span>').html(this.getTemplate());\n\n            this.initCombos();\n\n            // internal momentjs instance\n            this.datetime = null;\n\n            //update original input on change\n            this.$widget.on('change', 'select', $.proxy(function(e) {\n                this.$element.val(this.getValue()).change();\n                // update days count if month or year changes\n                if (this.options.smartDays) {\n                    if ($(e.target).is('.month') || $(e.target).is('.year')) {\n                        this.fillCombo('day');\n                    }\n                }\n            }, this));\n\n            this.$widget.find('select').css('width', 'auto');\n\n            // hide original input and insert widget\n            this.$element.hide().after(this.$widget);\n\n            // set initial value\n            this.setValue(this.$element.val() || this.options.value);\n        },\n\n        /*\n         Replace tokens in template with <select> elements\n        */\n        getTemplate: function() {\n            var tpl = this.options.template;\n            var inputDisabled = this.$element.prop('disabled');\n            var customClass = this.options.customClass;\n\n            //first pass\n            $.each(this.map, function(k, v) {\n                v = v[0];\n                var r = new RegExp(v+'+'),\n                    token = v.length > 1 ? v.substring(1, 2) : v;\n\n                tpl = tpl.replace(r, '{'+token+'}');\n            });\n\n            //replace spaces with &nbsp;\n            tpl = tpl.replace(/ /g, '&nbsp;');\n\n            //second pass\n            $.each(this.map, function(k, v) {\n                v = v[0];\n                var token = v.length > 1 ? v.substring(1, 2) : v;\n\n                tpl = tpl.replace('{'+token+'}', '<select class=\"'+k+' '+customClass +'\"'+\n                     (inputDisabled ? ' disabled=\"disabled\"' : '')+'></select>');\n            });\n\n            return tpl;\n        },\n\n        /*\n         Initialize combos that presents in template\n        */\n        initCombos: function() {\n            for (var k in this.map) {\n                var $c = this.$widget.find('.'+k);\n                // set properties like this.$day, this.$month etc.\n                this['$'+k] = $c.length ? $c : null;\n                // fill with items\n                this.fillCombo(k);\n            }\n        },\n\n        /*\n         Fill combo with items\n        */\n        fillCombo: function(k) {\n            var $combo = this['$'+k];\n            if (!$combo) {\n                return;\n            }\n\n            // define method name to fill items, e.g `fillDays`\n            var f = 'fill' + k.charAt(0).toUpperCase() + k.slice(1);\n            var items = this[f]();\n            var value = $combo.val();\n\n            $combo.empty();\n            for(var i=0; i<items.length; i++) {\n                $combo.append('<option value=\"'+items[i][0]+'\">'+items[i][1]+'</option>');\n            }\n\n            $combo.val(value);\n        },\n\n        /*\n         Initialize items of combos. Handles `firstItem` option\n        */\n        fillCommon: function(key) {\n            var values = [],\n                relTime;\n\n            if(this.options.firstItem === 'name') {\n                //need both to support moment ver < 2 and  >= 2\n                if (moment.localeData) {\n                    relTime = moment.localeData()._relativeTime;\n                } else {\n                    relTime = moment.relativeTime || moment.langData()._relativeTime;\n                }\n                var header = typeof relTime[key] === 'function' ? relTime[key](1, true, key, false) : relTime[key];\n                //take last entry (see momentjs lang files structure)\n                header = header.split(' ').reverse()[0];\n                values.push(['', header]);\n            } else if(this.options.firstItem === 'empty') {\n                values.push(['', '']);\n            }\n            return values;\n        },\n\n\n        /*\n        fill day\n        */\n        fillDay: function() {\n            var items = this.fillCommon('d'), name, i,\n                twoDigit = this.options.template.indexOf('DD') !== -1,\n                daysCount = 31;\n\n            // detect days count (depends on month and year)\n            // originally https://github.com/vitalets/combodate/pull/7\n            if (this.options.smartDays && this.$month && this.$year) {\n                var month = parseInt(this.$month.val(), 10);\n                var year = parseInt(this.$year.val(), 10);\n\n                if (!isNaN(month) && !isNaN(year)) {\n                    daysCount = moment([year, month]).daysInMonth();\n                }\n            }\n\n            for (i = 1; i <= daysCount; i++) {\n                name = twoDigit ? this.leadZero(i) : i;\n                items.push([i, name]);\n            }\n            return items;\n        },\n\n        /*\n        fill month\n        */\n        fillMonth: function() {\n            var items = this.fillCommon('M'), name, i,\n                longNamesNum = this.options.template.indexOf('MMMMMM') !== -1,\n                shortNamesNum = this.options.template.indexOf('MMMMM') !== -1,\n                longNames = this.options.template.indexOf('MMMM') !== -1,\n                shortNames = this.options.template.indexOf('MMM') !== -1,\n                twoDigit = this.options.template.indexOf('MM') !== -1;\n\n            for(i=0; i<=11; i++) {\n                if (longNamesNum) {\n                    name = moment().date(1).month(i).format('MM - MMMM');\n                } else if (shortNamesNum) {\n                    name = moment().date(1).month(i).format('MM - MMM');\n                } else if(longNames) {\n                    //see https://github.com/timrwood/momentjs.com/pull/36\n                    name = moment().date(1).month(i).format('MMMM');\n                } else if(shortNames) {\n                    name = moment().date(1).month(i).format('MMM');\n                } else if(twoDigit) {\n                    name = this.leadZero(i+1);\n                } else {\n                    name = i+1;\n                }\n                items.push([i, name]);\n            }\n            return items;\n        },\n\n        /*\n        fill year\n        */\n        fillYear: function() {\n            var items = [], name, i,\n                longNames = this.options.template.indexOf('YYYY') !== -1;\n\n            for(i=this.options.maxYear; i>=this.options.minYear; i--) {\n                name = longNames ? i : (i+'').substring(2);\n                items[this.options.yearDescending ? 'push' : 'unshift']([i, name]);\n            }\n\n            items = this.fillCommon('y').concat(items);\n\n            return items;\n        },\n\n        /*\n        fill hour\n        */\n        fillHour: function() {\n            var items = this.fillCommon('h'), name, i,\n                h12 = this.options.template.indexOf('h') !== -1,\n                h24 = this.options.template.indexOf('H') !== -1,\n                twoDigit = this.options.template.toLowerCase().indexOf('hh') !== -1,\n                min = h12 ? 1 : 0,\n                max = h12 ? 12 : 23;\n\n            for(i=min; i<=max; i++) {\n                name = twoDigit ? this.leadZero(i) : i;\n                items.push([i, name]);\n            }\n            return items;\n        },\n\n        /*\n        fill minute\n        */\n        fillMinute: function() {\n            var items = this.fillCommon('m'), name, i,\n                twoDigit = this.options.template.indexOf('mm') !== -1;\n\n            for(i=0; i<=59; i+= this.options.minuteStep) {\n                name = twoDigit ? this.leadZero(i) : i;\n                items.push([i, name]);\n            }\n            return items;\n        },\n\n        /*\n        fill second\n        */\n        fillSecond: function() {\n            var items = this.fillCommon('s'), name, i,\n                twoDigit = this.options.template.indexOf('ss') !== -1;\n\n            for(i=0; i<=59; i+= this.options.secondStep) {\n                name = twoDigit ? this.leadZero(i) : i;\n                items.push([i, name]);\n            }\n            return items;\n        },\n\n        /*\n        fill ampm\n        */\n        fillAmpm: function() {\n            var ampmL = this.options.template.indexOf('a') !== -1,\n                ampmU = this.options.template.indexOf('A') !== -1,\n                items = [\n                    ['am', ampmL ? 'am' : 'AM'],\n                    ['pm', ampmL ? 'pm' : 'PM']\n                ];\n            return items;\n        },\n\n        /*\n         Returns current date value from combos.\n         If format not specified - `options.format` used.\n         If format = `null` - Moment object returned.\n        */\n        getValue: function(format) {\n            var dt, values = {},\n                that = this,\n                notSelected = false;\n\n            //getting selected values\n            $.each(this.map, function(k, v) {\n                if(k === 'ampm') {\n                    return;\n                }\n\n                // if combo exists, use it's value, otherwise use default\n                if (that['$'+k]) {\n                    values[k] = parseInt(that['$'+k].val(), 10);\n                } else {\n                    var defaultValue;\n                    if (that.datetime) {\n                        defaultValue = that.datetime[v[1]]();\n                    } else {\n                        defaultValue = k === 'day' ? 1 : 0;\n                    }\n                    values[k] = defaultValue;\n                }\n\n                if(isNaN(values[k])) {\n                   notSelected = true;\n                   return false;\n                }\n            });\n\n            //if at least one visible combo not selected - return empty string\n            if(notSelected) {\n               return '';\n            }\n\n            //convert hours 12h --> 24h\n            if(this.$ampm) {\n                //12:00 pm --> 12:00 (24-h format, midday), 12:00 am --> 00:00 (24-h format, midnight, start of day)\n                if(values.hour === 12) {\n                    values.hour = this.$ampm.val() === 'am' ? 0 : 12;\n                } else {\n                    values.hour = this.$ampm.val() === 'am' ? values.hour : values.hour+12;\n                }\n            }\n\n            dt = moment([\n                values.year,\n                values.month,\n                values.day,\n                values.hour,\n                values.minute,\n                values.second\n            ]);\n\n            //highlight invalid date\n            this.highlight(dt);\n\n            format = format === undefined ? this.options.format : format;\n            if(format === null) {\n               return dt.isValid() ? dt : null;\n            } else {\n               return dt.isValid() ? dt.format(format) : '';\n            }\n        },\n\n        setValue: function(value) {\n            if(!value) {\n                return;\n            }\n\n            // parse in strict mode (third param `true`)\n            var dt = typeof value === 'string' ? moment(value, this.options.format, true) : moment(value),\n                that = this,\n                values = {};\n\n            //function to find nearest value in select options\n            function getNearest($select, value) {\n                var delta = {};\n                $select.children('option').each(function(i, opt){\n                    var optValue = $(opt).attr('value'),\n                    distance;\n\n                    if(optValue === '') return;\n                    distance = Math.abs(optValue - value);\n                    if(typeof delta.distance === 'undefined' || distance < delta.distance) {\n                        delta = {value: optValue, distance: distance};\n                    }\n                });\n                return delta.value;\n            }\n\n            if(dt.isValid()) {\n                //read values from date object\n                $.each(this.map, function(k, v) {\n                    if(k === 'ampm') {\n                       return;\n                    }\n                    values[k] = dt[v[1]]();\n                });\n\n                if(this.$ampm) {\n                    //12:00 pm --> 12:00 (24-h format, midday), 12:00 am --> 00:00 (24-h format, midnight, start of day)\n                    if(values.hour >= 12) {\n                        values.ampm = 'pm';\n                        if(values.hour > 12) {\n                            values.hour -= 12;\n                        }\n                    } else {\n                        values.ampm = 'am';\n                        if(values.hour === 0) {\n                            values.hour = 12;\n                        }\n                    }\n                }\n\n                $.each(values, function(k, v) {\n                    //call val() for each existing combo, e.g. this.$hour.val()\n                    if(that['$'+k]) {\n\n                        if(k === 'minute' && that.options.minuteStep > 1 && that.options.roundTime) {\n                           v = getNearest(that['$'+k], v);\n                        }\n\n                        if(k === 'second' && that.options.secondStep > 1 && that.options.roundTime) {\n                           v = getNearest(that['$'+k], v);\n                        }\n\n                        that['$'+k].val(v);\n                    }\n                });\n\n                // update days count\n                if (this.options.smartDays) {\n                    this.fillCombo('day');\n                }\n\n                this.$element.val(dt.format(this.options.format)).change();\n                this.datetime = dt;\n            } else {\n                this.datetime = null;\n            }\n        },\n\n        /*\n         highlight combos if date is invalid\n        */\n        highlight: function(dt) {\n            if(!dt.isValid()) {\n                if(this.options.errorClass) {\n                    this.$widget.addClass(this.options.errorClass);\n                } else {\n                    //store original border color\n                    if(!this.borderColor) {\n                        this.borderColor = this.$widget.find('select').css('border-color');\n                    }\n                    this.$widget.find('select').css('border-color', 'red');\n                }\n            } else {\n                if(this.options.errorClass) {\n                    this.$widget.removeClass(this.options.errorClass);\n                } else {\n                    this.$widget.find('select').css('border-color', this.borderColor);\n                }\n            }\n        },\n\n        leadZero: function(v) {\n            return v <= 9 ? '0' + v : v;\n        },\n\n        destroy: function() {\n            this.$widget.remove();\n            this.$element.removeData('combodate').show();\n        }\n\n        //todo: clear method\n    };\n\n    $.fn.combodate = function ( option ) {\n        var d, args = Array.apply(null, arguments);\n        args.shift();\n\n        //getValue returns date as string / object (not jQuery object)\n        if(option === 'getValue' && this.length && (d = this.eq(0).data('combodate'))) {\n          return d.getValue.apply(d, args);\n        }\n\n        return this.each(function () {\n            var $this = $(this),\n            data = $this.data('combodate'),\n            options = typeof option == 'object' && option;\n            if (!data) {\n                $this.data('combodate', (data = new Combodate(this, options)));\n            }\n            if (typeof option == 'string' && typeof data[option] == 'function') {\n                data[option].apply(data, args);\n            }\n        });\n    };\n\n    $.fn.combodate.defaults = {\n         //in this format value stored in original input\n        format: 'DD-MM-YYYY HH:mm',\n        //in this format items in dropdowns are displayed\n        template: 'D / MMM / YYYY   H : mm',\n        //initial value, can be `new Date()`\n        value: null,\n        minYear: 1970,\n        maxYear: new Date().getFullYear(),\n        yearDescending: true,\n        minuteStep: 5,\n        secondStep: 1,\n        firstItem: 'empty', //'name', 'empty', 'none'\n        errorClass: null,\n        customClass: '',\n        roundTime: true, // whether to round minutes and seconds if step > 1\n        smartDays: false // whether days in combo depend on selected month: 31, 30, 28\n    };\n\n}(window.jQuery));\n\n/**\nCombodate input - dropdown date and time picker.    \nBased on [combodate](http://vitalets.github.com/combodate) plugin (included). To use it you should manually include [momentjs](http://momentjs.com).\n\n    <script src=\"js/moment.min.js\"></script>\n   \nAllows to input:\n\n* only date\n* only time \n* both date and time  \n\nPlease note, that format is taken from momentjs and **not compatible** with bootstrap-datepicker / jquery UI datepicker.  \nInternally value stored as `momentjs` object. \n\n@class combodate\n@extends abstractinput\n@final\n@since 1.4.0\n@example\n<a href=\"#\" id=\"dob\" data-type=\"combodate\" data-pk=\"1\" data-url=\"/post\" data-value=\"1984-05-15\" data-title=\"Select date\"></a>\n<script>\n$(function(){\n    $('#dob').editable({\n        format: 'YYYY-MM-DD',    \n        viewformat: 'DD.MM.YYYY',    \n        template: 'D / MMMM / YYYY',    \n        combodate: {\n                minYear: 2000,\n                maxYear: new Date().getFullYear(),\n                minuteStep: 1\n           }\n        }\n    });\n});\n</script>\n**/\n\n/*global moment*/\n\n(function ($) {\n    \"use strict\";\n    \n    var Constructor = function (options) {\n        this.init('combodate', options, Constructor.defaults);\n        \n        //by default viewformat equals to format\n        if(!this.options.viewformat) {\n            this.options.viewformat = this.options.format;\n        }        \n        \n        //try parse combodate config defined as json string in data-combodate\n        options.combodate = $.fn.editableutils.tryParseJson(options.combodate, true);\n\n        //overriding combodate config (as by default jQuery extend() is not recursive)\n        this.options.combodate = $.extend({}, Constructor.defaults.combodate, options.combodate, {\n            format: this.options.format,\n            template: this.options.template\n        });\n    };\n\n    $.fn.editableutils.inherit(Constructor, $.fn.editabletypes.abstractinput);    \n    \n    $.extend(Constructor.prototype, {\n        render: function () {\n            this.$input.combodate(this.options.combodate);\n                    \n            if($.fn.editableform.engine === 'bs3') {\n                this.$input.siblings().find('select').addClass('form-control');\n            }\n            \n            if(this.options.inputclass) {\n                this.$input.siblings().find('select').addClass(this.options.inputclass);\n            }            \n            //\"clear\" link\n            /*\n            if(this.options.clear) {\n                this.$clear = $('<a href=\"#\"></a>').html(this.options.clear).click($.proxy(function(e){\n                    e.preventDefault();\n                    e.stopPropagation();\n                    this.clear();\n                }, this));\n                \n                this.$tpl.parent().append($('<div class=\"editable-clear\">').append(this.$clear));  \n            } \n            */               \n        },\n        \n        value2html: function(value, element) {\n            var text = value ? value.format(this.options.viewformat) : '';\n            //$(element).text(text);\n            Constructor.superclass.value2html.call(this, text, element);  \n        },\n\n        html2value: function(html) {\n            return html ? moment(html, this.options.viewformat) : null;\n        },   \n        \n        value2str: function(value) {\n            return value ? value.format(this.options.format) : '';\n       }, \n       \n       str2value: function(str) {\n           return str ? moment(str, this.options.format) : null;\n       }, \n       \n       value2submit: function(value) {\n           return this.value2str(value);\n       },                    \n\n       value2input: function(value) {\n           this.$input.combodate('setValue', value);\n       },\n        \n       input2value: function() { \n           return this.$input.combodate('getValue', null);\n       },       \n       \n       activate: function() {\n           this.$input.siblings('.combodate').find('select').eq(0).focus();\n       },\n       \n       /*\n       clear:  function() {\n          this.$input.data('datepicker').date = null;\n          this.$input.find('.active').removeClass('active');\n       },\n       */\n       \n       autosubmit: function() {\n           \n       }\n\n    });\n    \n    Constructor.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        /**\n        @property tpl \n        @default <input type=\"text\">\n        **/         \n        tpl:'<input type=\"text\">',\n        /**\n        @property inputclass \n        @default null\n        **/         \n        inputclass: null,\n        /**\n        Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br>\n        See list of tokens in [momentjs docs](http://momentjs.com/docs/#/parsing/string-format)  \n        \n        @property format \n        @type string\n        @default YYYY-MM-DD\n        **/         \n        format:'YYYY-MM-DD',\n        /**\n        Format used for displaying date. Also applied when converting date from element's text on init.   \n        If not specified equals to `format`.\n        \n        @property viewformat \n        @type string\n        @default null\n        **/          \n        viewformat: null,        \n        /**\n        Template used for displaying dropdowns.\n        \n        @property template \n        @type string\n        @default D / MMM / YYYY\n        **/          \n        template: 'D / MMM / YYYY',  \n        /**\n        Configuration of combodate.\n        Full list of options: http://vitalets.github.com/combodate/#docs\n        \n        @property combodate \n        @type object\n        @default null\n        **/\n        combodate: null\n        \n        /*\n        (not implemented yet)\n        Text shown as clear date button. \n        If <code>false</code> clear button will not be rendered.\n        \n        @property clear \n        @type boolean|string\n        @default 'x clear'         \n        */\n        //clear: '&times; clear'\n    });   \n\n    $.fn.editabletypes.combodate = Constructor;\n\n}(window.jQuery));\n\n/*\nEditableform based on Twitter Bootstrap 3\n*/\n(function ($) {\n    \"use strict\";\n    \n    //store parent methods\n    var pInitInput = $.fn.editableform.Constructor.prototype.initInput;\n    \n    $.extend($.fn.editableform.Constructor.prototype, {\n        initTemplate: function() {\n            this.$form = $($.fn.editableform.template); \n            this.$form.find('.control-group').addClass('form-group');\n            this.$form.find('.editable-error-block').addClass('help-block');\n        },\n        initInput: function() {  \n            pInitInput.apply(this);\n\n            var emptyInputClass = this.input.options.inputclass === null || this.input.options.inputclass === false;\n            var defaultClass = 'form-control-sm';\n            \n            //bs3 add `form-control` class to standard inputs\n            var stdtypes = 'text,select,textarea,password,email,url,tel,number,range,time,typeaheadjs'.split(','); \n            if(~$.inArray(this.input.type, stdtypes)) {\n                this.input.$input.addClass('form-control');\n                if(emptyInputClass) {\n                    this.input.options.inputclass = defaultClass;\n                    this.input.$input.addClass(defaultClass);\n                }\n            }             \n        \n            //apply size class also to buttons (to fit size of control)\n            var $btn = this.$form.find('.editable-buttons');\n            var classes = emptyInputClass ? [defaultClass] : this.input.options.inputclass.split(' ');\n            for(var i=0; i<classes.length; i++) {\n                // `btn-sm` is default now\n                /*\n                if(classes[i].toLowerCase() === 'input-sm') { \n                    $btn.find('button').addClass('btn-sm');  \n                }\n                */\n                if(classes[i].toLowerCase() === 'input-lg') {\n                    $btn.find('button').removeClass('btn-sm').addClass('btn-lg'); \n                }\n            }\n        }\n    });    \n    \n    //buttons\n    $.fn.editableform.buttons = \n      '<button type=\"submit\" class=\"btn btn-primary btn-sm editable-submit\">'+\n        '<i class=\"fa fa-check\" aria-hidden=\"true\"></i>'+\n      '</button>'+\n      '<button type=\"button\" class=\"btn btn-default btn-sm editable-cancel\">'+\n        '<i class=\"fa fa-times\" aria-hidden=\"true\"></i>'+\n      '</button>';         \n    \n    //error classes\n    $.fn.editableform.errorGroupClass = 'has-error';\n    $.fn.editableform.errorBlockClass = null;  \n    //engine\n    $.fn.editableform.engine = 'bs4';  \n}(window.jQuery));\n/**\n* Editable Popover for Bootstrap 4 based on Popper.js\n* ---------------------\n* requires bootstrap-popover.js\n*/\n(function ($) {\n    \"use strict\";\n    \n    //extend methods\n    $.extend($.fn.editableContainer.Popup.prototype, {\n        containerName: 'popover',\n        containerDataName: 'bs.popover',\n        innerCss: '.popover-body',\n        defaults: $.fn.popover.Constructor.DEFAULTS,\n        \n        initContainer: function(){\n            $.extend(this.containerOptions, {\n                trigger: 'manual',\n                selector: false,\n                content: ' ',\n                template: this.defaults.template\n            });\n            \n            //as template property is used in inputs, hide it from popover\n            var t;\n            if(this.$element.data('template')) {\n                t = this.$element.data('template');\n                this.$element.removeData('template');\n            }\n            \n            this.call(this.containerOptions);\n            \n            if(t) {\n                //restore data('template')\n                this.$element.data('template', t);\n            }\n        },\n        \n        /* show */\n        innerShow: function () {\n            this.call('show');\n        },\n        \n        /* hide */\n        innerHide: function () {\n            this.call('hide');\n        },\n        \n        /* destroy */\n        innerDestroy: function() {\n            this.call('dispose');\n        },\n        \n        setContainerOption: function(key, value) {\n            this.container().options[key] = value;\n        },\n        \n        setPosition: function () {\n            (function() {}).call(this.container());\n        },\n        \n        tip: function() {\n            return this.container() ? $(this.container().tip) : null;\n        }\n    });\n    \n}(window.jQuery));\n\n/* =========================================================\n * bootstrap-datepicker.js\n * http://www.eyecon.ro/bootstrap-datepicker\n * =========================================================\n * Copyright 2012 Stefan Petre\n * Improvements by Andrew Rowls\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n(function( $ ) {\n\n\tfunction UTCDate(){\n\t\treturn new Date(Date.UTC.apply(Date, arguments));\n\t}\n\tfunction UTCToday(){\n\t\tvar today = new Date();\n\t\treturn UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate());\n\t}\n\n\t// Picker object\n\n\tvar Datepicker = function(element, options) {\n\t\tvar that = this;\n\n\t\tthis._process_options(options);\n\n\t\tthis.element = $(element);\n\t\tthis.isInline = false;\n\t\tthis.isInput = this.element.is('input');\n\t\tthis.component = this.element.is('.date') ? this.element.find('.add-on, .btn') : false;\n\t\tthis.hasInput = this.component && this.element.find('input').length;\n\t\tif(this.component && this.component.length === 0)\n\t\t\tthis.component = false;\n\n\t\tthis.picker = $(DPGlobal.template);\n\t\tthis._buildEvents();\n\t\tthis._attachEvents();\n\n\t\tif(this.isInline) {\n\t\t\tthis.picker.addClass('datepicker-inline').appendTo(this.element);\n\t\t} else {\n\t\t\tthis.picker.addClass('datepicker-dropdown dropdown-menu');\n\t\t}\n\n\t\tif (this.o.rtl){\n\t\t\tthis.picker.addClass('datepicker-rtl');\n\t\t\tthis.picker.find('.prev i, .next i')\n\t\t\t\t\t\t.toggleClass('icon-arrow-left icon-arrow-right');\n\t\t}\n\n\n\t\tthis.viewMode = this.o.startView;\n\n\t\tif (this.o.calendarWeeks)\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.attr('colspan', function(i, val){\n\t\t\t\t\t\t\treturn parseInt(val) + 1;\n\t\t\t\t\t\t});\n\n\t\tthis._allow_update = false;\n\n\t\tthis.setStartDate(this.o.startDate);\n\t\tthis.setEndDate(this.o.endDate);\n\t\tthis.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled);\n\n\t\tthis.fillDow();\n\t\tthis.fillMonths();\n\n\t\tthis._allow_update = true;\n\n\t\tthis.update();\n\t\tthis.showMode();\n\n\t\tif(this.isInline) {\n\t\t\tthis.show();\n\t\t}\n\t};\n\n\tDatepicker.prototype = {\n\t\tconstructor: Datepicker,\n\n\t\t_process_options: function(opts){\n\t\t\t// Store raw options for reference\n\t\t\tthis._o = $.extend({}, this._o, opts);\n\t\t\t// Processed options\n\t\t\tvar o = this.o = $.extend({}, this._o);\n\n\t\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t\t// fallback to 2 letter code eg \"de\"\n\t\t\tvar lang = o.language;\n\t\t\tif (!dates[lang]) {\n\t\t\t\tlang = lang.split('-')[0];\n\t\t\t\tif (!dates[lang])\n\t\t\t\t\tlang = defaults.language;\n\t\t\t}\n\t\t\to.language = lang;\n\n\t\t\tswitch(o.startView){\n\t\t\t\tcase 2:\n\t\t\t\tcase 'decade':\n\t\t\t\t\to.startView = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 'year':\n\t\t\t\t\to.startView = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.startView = 0;\n\t\t\t}\n\n\t\t\tswitch (o.minViewMode) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 'months':\n\t\t\t\t\to.minViewMode = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 'years':\n\t\t\t\t\to.minViewMode = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\to.minViewMode = 0;\n\t\t\t}\n\n\t\t\to.startView = Math.max(o.startView, o.minViewMode);\n\n\t\t\to.weekStart %= 7;\n\t\t\to.weekEnd = ((o.weekStart + 6) % 7);\n\n\t\t\tvar format = DPGlobal.parseFormat(o.format)\n\t\t\tif (o.startDate !== -Infinity) {\n\t\t\t\to.startDate = DPGlobal.parseDate(o.startDate, format, o.language);\n\t\t\t}\n\t\t\tif (o.endDate !== Infinity) {\n\t\t\t\to.endDate = DPGlobal.parseDate(o.endDate, format, o.language);\n\t\t\t}\n\n\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled||[];\n\t\t\tif (!$.isArray(o.daysOfWeekDisabled))\n\t\t\t\to.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\\s]*/);\n\t\t\to.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function (d) {\n\t\t\t\treturn parseInt(d, 10);\n\t\t\t});\n\t\t},\n\t\t_events: [],\n\t\t_secondaryEvents: [],\n\t\t_applyEvents: function(evs){\n\t\t\tfor (var i=0, el, ev; i<evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tev = evs[i][1];\n\t\t\t\tel.on(ev);\n\t\t\t}\n\t\t},\n\t\t_unapplyEvents: function(evs){\n\t\t\tfor (var i=0, el, ev; i<evs.length; i++){\n\t\t\t\tel = evs[i][0];\n\t\t\t\tev = evs[i][1];\n\t\t\t\tel.off(ev);\n\t\t\t}\n\t\t},\n\t\t_buildEvents: function(){\n\t\t\tif (this.isInput) { // single input\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(this.update, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.component && this.hasInput){ // component: input + button\n\t\t\t\tthis._events = [\n\t\t\t\t\t// For components that are not readonly, allow keyboard nav\n\t\t\t\t\t[this.element.find('input'), {\n\t\t\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t\t\tkeyup: $.proxy(this.update, this),\n\t\t\t\t\t\tkeydown: $.proxy(this.keydown, this)\n\t\t\t\t\t}],\n\t\t\t\t\t[this.component, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\t\t\telse if (this.element.is('div')) {  // inline datepicker\n\t\t\t\tthis.isInline = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._events = [\n\t\t\t\t\t[this.element, {\n\t\t\t\t\t\tclick: $.proxy(this.show, this)\n\t\t\t\t\t}]\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tthis._secondaryEvents = [\n\t\t\t\t[this.picker, {\n\t\t\t\t\tclick: $.proxy(this.click, this)\n\t\t\t\t}],\n\t\t\t\t[$(window), {\n\t\t\t\t\tresize: $.proxy(this.place, this)\n\t\t\t\t}],\n\t\t\t\t[$(document), {\n\t\t\t\t\tmousedown: $.proxy(function (e) {\n\t\t\t\t\t\t// Clicked outside the datepicker, hide it\n\t\t\t\t\t\tif (!(\n\t\t\t\t\t\t\tthis.element.is(e.target) ||\n\t\t\t\t\t\t\tthis.element.find(e.target).size() ||\n\t\t\t\t\t\t\tthis.picker.is(e.target) ||\n\t\t\t\t\t\t\tthis.picker.find(e.target).size()\n\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this)\n\t\t\t\t}]\n\t\t\t];\n\t\t},\n\t\t_attachEvents: function(){\n\t\t\tthis._detachEvents();\n\t\t\tthis._applyEvents(this._events);\n\t\t},\n\t\t_detachEvents: function(){\n\t\t\tthis._unapplyEvents(this._events);\n\t\t},\n\t\t_attachSecondaryEvents: function(){\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis._applyEvents(this._secondaryEvents);\n\t\t},\n\t\t_detachSecondaryEvents: function(){\n\t\t\tthis._unapplyEvents(this._secondaryEvents);\n\t\t},\n\t\t_trigger: function(event, altdate){\n\t\t\tvar date = altdate || this.date,\n\t\t\t\tlocal_date = new Date(date.getTime() + (date.getTimezoneOffset()*60000));\n\n\t\t\tthis.element.trigger({\n\t\t\t\ttype: event,\n\t\t\t\tdate: local_date,\n\t\t\t\tformat: $.proxy(function(altformat){\n\t\t\t\t\tvar format = altformat || this.o.format;\n\t\t\t\t\treturn DPGlobal.formatDate(date, format, this.o.language);\n\t\t\t\t}, this)\n\t\t\t});\n\t\t},\n\n\t\tshow: function(e) {\n\t\t\tif (!this.isInline)\n\t\t\t\tthis.picker.appendTo('body');\n\t\t\tthis.picker.show();\n\t\t\tthis.height = this.component ? this.component.outerHeight() : this.element.outerHeight();\n\t\t\tthis.place();\n\t\t\tthis._attachSecondaryEvents();\n\t\t\tif (e) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\tthis._trigger('show');\n\t\t},\n\n\t\thide: function(e){\n\t\t\tif(this.isInline) return;\n\t\t\tif (!this.picker.is(':visible')) return;\n\t\t\tthis.picker.hide().detach();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.viewMode = this.o.startView;\n\t\t\tthis.showMode();\n\n\t\t\tif (\n\t\t\t\tthis.o.forceParse &&\n\t\t\t\t(\n\t\t\t\t\tthis.isInput && this.element.val() ||\n\t\t\t\t\tthis.hasInput && this.element.find('input').val()\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tthis.setValue();\n\t\t\tthis._trigger('hide');\n\t\t},\n\n\t\tremove: function() {\n\t\t\tthis.hide();\n\t\t\tthis._detachEvents();\n\t\t\tthis._detachSecondaryEvents();\n\t\t\tthis.picker.remove();\n\t\t\tdelete this.element.data().datepicker;\n\t\t\tif (!this.isInput) {\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\t\t},\n\n\t\tgetDate: function() {\n\t\t\tvar d = this.getUTCDate();\n\t\t\treturn new Date(d.getTime() + (d.getTimezoneOffset()*60000));\n\t\t},\n\n\t\tgetUTCDate: function() {\n\t\t\treturn this.date;\n\t\t},\n\n\t\tsetDate: function(d) {\n\t\t\tthis.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset()*60000)));\n\t\t},\n\n\t\tsetUTCDate: function(d) {\n\t\t\tthis.date = d;\n\t\t\tthis.setValue();\n\t\t},\n\n\t\tsetValue: function() {\n\t\t\tvar formatted = this.getFormattedDate();\n\t\t\tif (!this.isInput) {\n\t\t\t\tif (this.component){\n\t\t\t\t\tthis.element.find('input').val(formatted);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.element.val(formatted);\n\t\t\t}\n\t\t},\n\n\t\tgetFormattedDate: function(format) {\n\t\t\tif (format === undefined)\n\t\t\t\tformat = this.o.format;\n\t\t\treturn DPGlobal.formatDate(this.date, format, this.o.language);\n\t\t},\n\n\t\tsetStartDate: function(startDate){\n\t\t\tthis._process_options({startDate: startDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetEndDate: function(endDate){\n\t\t\tthis._process_options({endDate: endDate});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tsetDaysOfWeekDisabled: function(daysOfWeekDisabled){\n\t\t\tthis._process_options({daysOfWeekDisabled: daysOfWeekDisabled});\n\t\t\tthis.update();\n\t\t\tthis.updateNavArrows();\n\t\t},\n\n\t\tplace: function(){\n\t\t\t\t\t\tif(this.isInline) return;\n\t\t\tvar zIndex = parseInt(this.element.parents().filter(function() {\n\t\t\t\t\t\t\treturn $(this).css('z-index') != 'auto';\n\t\t\t\t\t\t}).first().css('z-index'))+10;\n\t\t\tvar offset = this.component ? this.component.parent().offset() : this.element.offset();\n\t\t\tvar height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(true);\n\t\t\tthis.picker.css({\n\t\t\t\ttop: offset.top + height,\n\t\t\t\tleft: offset.left,\n\t\t\t\tzIndex: zIndex\n\t\t\t});\n\t\t},\n\n\t\t_allow_update: true,\n\t\tupdate: function(){\n\t\t\tif (!this._allow_update) return;\n\n\t\t\tvar date, fromArgs = false;\n\t\t\tif(arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) {\n\t\t\t\tdate = arguments[0];\n\t\t\t\tfromArgs = true;\n\t\t\t} else {\n\t\t\t\tdate = this.isInput ? this.element.val() : this.element.data('date') || this.element.find('input').val();\n\t\t\t\tdelete this.element.data().date;\n\t\t\t}\n\n\t\t\tthis.date = DPGlobal.parseDate(date, this.o.format, this.o.language);\n\n\t\t\tif(fromArgs) this.setValue();\n\n\t\t\tif (this.date < this.o.startDate) {\n\t\t\t\tthis.viewDate = new Date(this.o.startDate);\n\t\t\t} else if (this.date > this.o.endDate) {\n\t\t\t\tthis.viewDate = new Date(this.o.endDate);\n\t\t\t} else {\n\t\t\t\tthis.viewDate = new Date(this.date);\n\t\t\t}\n\t\t\tthis.fill();\n\t\t},\n\n\t\tfillDow: function(){\n\t\t\tvar dowCnt = this.o.weekStart,\n\t\t\thtml = '<tr>';\n\t\t\tif(this.o.calendarWeeks){\n\t\t\t\tvar cell = '<th class=\"cw\">&nbsp;</th>';\n\t\t\t\thtml += cell;\n\t\t\t\tthis.picker.find('.datepicker-days thead tr:first-child').prepend(cell);\n\t\t\t}\n\t\t\twhile (dowCnt < this.o.weekStart + 7) {\n\t\t\t\thtml += '<th class=\"dow\">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>';\n\t\t\t}\n\t\t\thtml += '</tr>';\n\t\t\tthis.picker.find('.datepicker-days thead').append(html);\n\t\t},\n\n\t\tfillMonths: function(){\n\t\t\tvar html = '',\n\t\t\ti = 0;\n\t\t\twhile (i < 12) {\n\t\t\t\thtml += '<span class=\"month\">'+dates[this.o.language].monthsShort[i++]+'</span>';\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-months td').html(html);\n\t\t},\n\n\t\tsetRange: function(range){\n\t\t\tif (!range || !range.length)\n\t\t\t\tdelete this.range;\n\t\t\telse\n\t\t\t\tthis.range = $.map(range, function(d){ return d.valueOf(); });\n\t\t\tthis.fill();\n\t\t},\n\n\t\tgetClassNames: function(date){\n\t\t\tvar cls = [],\n\t\t\t\tyear = this.viewDate.getUTCFullYear(),\n\t\t\t\tmonth = this.viewDate.getUTCMonth(),\n\t\t\t\tcurrentDate = this.date.valueOf(),\n\t\t\t\ttoday = new Date();\n\t\t\tif (date.getUTCFullYear() < year || (date.getUTCFullYear() == year && date.getUTCMonth() < month)) {\n\t\t\t\tcls.push('old');\n\t\t\t} else if (date.getUTCFullYear() > year || (date.getUTCFullYear() == year && date.getUTCMonth() > month)) {\n\t\t\t\tcls.push('new');\n\t\t\t}\n\t\t\t// Compare internal UTC date with local today, not UTC today\n\t\t\tif (this.o.todayHighlight &&\n\t\t\t\tdate.getUTCFullYear() == today.getFullYear() &&\n\t\t\t\tdate.getUTCMonth() == today.getMonth() &&\n\t\t\t\tdate.getUTCDate() == today.getDate()) {\n\t\t\t\tcls.push('today');\n\t\t\t}\n\t\t\tif (currentDate && date.valueOf() == currentDate) {\n\t\t\t\tcls.push('active');\n\t\t\t}\n\t\t\tif (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate ||\n\t\t\t\t$.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1) {\n\t\t\t\tcls.push('disabled');\n\t\t\t}\n\t\t\tif (this.range){\n\t\t\t\tif (date > this.range[0] && date < this.range[this.range.length-1]){\n\t\t\t\t\tcls.push('range');\n\t\t\t\t}\n\t\t\t\tif ($.inArray(date.valueOf(), this.range) != -1){\n\t\t\t\t\tcls.push('selected');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cls;\n\t\t},\n\n\t\tfill: function() {\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth(),\n\t\t\t\tstartYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,\n\t\t\t\tstartMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,\n\t\t\t\tendYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,\n\t\t\t\tendMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,\n\t\t\t\tcurrentDate = this.date && this.date.valueOf(),\n\t\t\t\ttooltip;\n\t\t\tthis.picker.find('.datepicker-days thead th.datepicker-switch')\n\t\t\t\t\t\t.text(dates[this.o.language].months[month]+' '+year);\n\t\t\tthis.picker.find('tfoot th.today')\n\t\t\t\t\t\t.text(dates[this.o.language].today)\n\t\t\t\t\t\t.toggle(this.o.todayBtn !== false);\n\t\t\tthis.picker.find('tfoot th.clear')\n\t\t\t\t\t\t.text(dates[this.o.language].clear)\n\t\t\t\t\t\t.toggle(this.o.clearBtn !== false);\n\t\t\tthis.updateNavArrows();\n\t\t\tthis.fillMonths();\n\t\t\tvar prevMonth = UTCDate(year, month-1, 28,0,0,0,0),\n\t\t\t\tday = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth());\n\t\t\tprevMonth.setUTCDate(day);\n\t\t\tprevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);\n\t\t\tvar nextMonth = new Date(prevMonth);\n\t\t\tnextMonth.setUTCDate(nextMonth.getUTCDate() + 42);\n\t\t\tnextMonth = nextMonth.valueOf();\n\t\t\tvar html = [];\n\t\t\tvar clsName;\n\t\t\twhile(prevMonth.valueOf() < nextMonth) {\n\t\t\t\tif (prevMonth.getUTCDay() == this.o.weekStart) {\n\t\t\t\t\thtml.push('<tr>');\n\t\t\t\t\tif(this.o.calendarWeeks){\n\t\t\t\t\t\t// ISO 8601: First week contains first thursday.\n\t\t\t\t\t\t// ISO also states week starts on Monday, but we can be more abstract here.\n\t\t\t\t\t\tvar\n\t\t\t\t\t\t\t// Start of current week: based on weekstart/current date\n\t\t\t\t\t\t\tws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5),\n\t\t\t\t\t\t\t// Thursday of this week\n\t\t\t\t\t\t\tth = new Date(+ws + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),\n\t\t\t\t\t\t\t// First Thursday of year, year from thursday\n\t\t\t\t\t\t\tyth = new Date(+(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5),\n\t\t\t\t\t\t\t// Calendar week: ms between thursdays, div ms per day, div 7 days\n\t\t\t\t\t\t\tcalWeek =  (th - yth) / 864e5 / 7 + 1;\n\t\t\t\t\t\thtml.push('<td class=\"cw\">'+ calWeek +'</td>');\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tclsName = this.getClassNames(prevMonth);\n\t\t\t\tclsName.push('day');\n\n\t\t\t\tvar before = this.o.beforeShowDay(prevMonth);\n\t\t\t\tif (before === undefined)\n\t\t\t\t\tbefore = {};\n\t\t\t\telse if (typeof(before) === 'boolean')\n\t\t\t\t\tbefore = {enabled: before};\n\t\t\t\telse if (typeof(before) === 'string')\n\t\t\t\t\tbefore = {classes: before};\n\t\t\t\tif (before.enabled === false)\n\t\t\t\t\tclsName.push('disabled');\n\t\t\t\tif (before.classes)\n\t\t\t\t\tclsName = clsName.concat(before.classes.split(/\\s+/));\n\t\t\t\tif (before.tooltip)\n\t\t\t\t\ttooltip = before.tooltip;\n\n\t\t\t\tclsName = $.unique(clsName);\n\t\t\t\thtml.push('<td class=\"'+clsName.join(' ')+'\"' + (tooltip ? ' title=\"'+tooltip+'\"' : '') + '>'+prevMonth.getUTCDate() + '</td>');\n\t\t\t\tif (prevMonth.getUTCDay() == this.o.weekEnd) {\n\t\t\t\t\thtml.push('</tr>');\n\t\t\t\t}\n\t\t\t\tprevMonth.setUTCDate(prevMonth.getUTCDate()+1);\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-days tbody').empty().append(html.join(''));\n\t\t\tvar currentYear = this.date && this.date.getUTCFullYear();\n\n\t\t\tvar months = this.picker.find('.datepicker-months')\n\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t.text(year)\n\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t.find('span').removeClass('active');\n\t\t\tif (currentYear && currentYear == year) {\n\t\t\t\tmonths.eq(this.date.getUTCMonth()).addClass('active');\n\t\t\t}\n\t\t\tif (year < startYear || year > endYear) {\n\t\t\t\tmonths.addClass('disabled');\n\t\t\t}\n\t\t\tif (year == startYear) {\n\t\t\t\tmonths.slice(0, startMonth).addClass('disabled');\n\t\t\t}\n\t\t\tif (year == endYear) {\n\t\t\t\tmonths.slice(endMonth+1).addClass('disabled');\n\t\t\t}\n\n\t\t\thtml = '';\n\t\t\tyear = parseInt(year/10, 10) * 10;\n\t\t\tvar yearCont = this.picker.find('.datepicker-years')\n\t\t\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t\t\t.text(year + '-' + (year + 9))\n\t\t\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t\t\t.find('td');\n\t\t\tyear -= 1;\n\t\t\tfor (var i = -1; i < 11; i++) {\n\t\t\t\thtml += '<span class=\"year'+(i == -1 ? ' old' : i == 10 ? ' new' : '')+(currentYear == year ? ' active' : '')+(year < startYear || year > endYear ? ' disabled' : '')+'\">'+year+'</span>';\n\t\t\t\tyear += 1;\n\t\t\t}\n\t\t\tyearCont.html(html);\n\t\t},\n\n\t\tupdateNavArrows: function() {\n\t\t\tif (!this._allow_update) return;\n\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getUTCFullYear(),\n\t\t\t\tmonth = d.getUTCMonth();\n\t\t\tswitch (this.viewMode) {\n\t\t\t\tcase 0:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()) {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()) {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tif (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()) {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'hidden'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.picker.find('.prev').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tif (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()) {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'hidden'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.picker.find('.next').css({visibility: 'visible'});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\tclick: function(e) {\n\t\t\te.preventDefault();\n\t\t\tvar target = $(e.target).closest('span, td, th');\n\t\t\tif (target.length == 1) {\n\t\t\t\tswitch(target[0].nodeName.toLowerCase()) {\n\t\t\t\t\tcase 'th':\n\t\t\t\t\t\tswitch(target[0].className) {\n\t\t\t\t\t\t\tcase 'datepicker-switch':\n\t\t\t\t\t\t\t\tthis.showMode(1);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'prev':\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tvar dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1);\n\t\t\t\t\t\t\t\tswitch(this.viewMode){\n\t\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveMonth(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t\tthis.viewDate = this.moveYear(this.viewDate, dir);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'today':\n\t\t\t\t\t\t\t\tvar date = new Date();\n\t\t\t\t\t\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\n\t\t\t\t\t\t\t\tthis.showMode(-2);\n\t\t\t\t\t\t\t\tvar which = this.o.todayBtn == 'linked' ? null : 'view';\n\t\t\t\t\t\t\t\tthis._setDate(date, which);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'clear':\n\t\t\t\t\t\t\t\tvar element;\n\t\t\t\t\t\t\t\tif (this.isInput)\n\t\t\t\t\t\t\t\t\telement = this.element;\n\t\t\t\t\t\t\t\telse if (this.component)\n\t\t\t\t\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t\t\t\t\tif (element)\n\t\t\t\t\t\t\t\t\telement.val(\"\").change();\n\t\t\t\t\t\t\t\tthis._trigger('changeDate');\n\t\t\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\t\t\tif (this.o.autoclose)\n\t\t\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'span':\n\t\t\t\t\t\tif (!target.is('.disabled')) {\n\t\t\t\t\t\t\tthis.viewDate.setUTCDate(1);\n\t\t\t\t\t\t\tif (target.is('.month')) {\n\t\t\t\t\t\t\t\tvar day = 1;\n\t\t\t\t\t\t\t\tvar month = target.parent().find('span').index(target);\n\t\t\t\t\t\t\t\tvar year = this.viewDate.getUTCFullYear();\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCMonth(month);\n\t\t\t\t\t\t\t\tthis._trigger('changeMonth', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 1) {\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day,0,0,0,0));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar year = parseInt(target.text(), 10)||0;\n\t\t\t\t\t\t\t\tvar day = 1;\n\t\t\t\t\t\t\t\tvar month = 0;\n\t\t\t\t\t\t\t\tthis.viewDate.setUTCFullYear(year);\n\t\t\t\t\t\t\t\tthis._trigger('changeYear', this.viewDate);\n\t\t\t\t\t\t\t\tif (this.o.minViewMode === 2) {\n\t\t\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day,0,0,0,0));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.showMode(-1);\n\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'td':\n\t\t\t\t\t\tif (target.is('.day') && !target.is('.disabled')){\n\t\t\t\t\t\t\tvar day = parseInt(target.text(), 10)||1;\n\t\t\t\t\t\t\tvar year = this.viewDate.getUTCFullYear(),\n\t\t\t\t\t\t\t\tmonth = this.viewDate.getUTCMonth();\n\t\t\t\t\t\t\tif (target.is('.old')) {\n\t\t\t\t\t\t\t\tif (month === 0) {\n\t\t\t\t\t\t\t\t\tmonth = 11;\n\t\t\t\t\t\t\t\t\tyear -= 1;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmonth -= 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (target.is('.new')) {\n\t\t\t\t\t\t\t\tif (month == 11) {\n\t\t\t\t\t\t\t\t\tmonth = 0;\n\t\t\t\t\t\t\t\t\tyear += 1;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmonth += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._setDate(UTCDate(year, month, day,0,0,0,0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_setDate: function(date, which){\n\t\t\tif (!which || which == 'date')\n\t\t\t\tthis.date = new Date(date);\n\t\t\tif (!which || which  == 'view')\n\t\t\t\tthis.viewDate = new Date(date);\n\t\t\tthis.fill();\n\t\t\tthis.setValue();\n\t\t\tthis._trigger('changeDate');\n\t\t\tvar element;\n\t\t\tif (this.isInput) {\n\t\t\t\telement = this.element;\n\t\t\t} else if (this.component){\n\t\t\t\telement = this.element.find('input');\n\t\t\t}\n\t\t\tif (element) {\n\t\t\t\telement.change();\n\t\t\t\tif (this.o.autoclose && (!which || which == 'date')) {\n\t\t\t\t\tthis.hide();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tmoveMonth: function(date, dir){\n\t\t\tif (!dir) return date;\n\t\t\tvar new_date = new Date(date.valueOf()),\n\t\t\t\tday = new_date.getUTCDate(),\n\t\t\t\tmonth = new_date.getUTCMonth(),\n\t\t\t\tmag = Math.abs(dir),\n\t\t\t\tnew_month, test;\n\t\t\tdir = dir > 0 ? 1 : -1;\n\t\t\tif (mag == 1){\n\t\t\t\ttest = dir == -1\n\t\t\t\t\t// If going back one month, make sure month is not current month\n\t\t\t\t\t// (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t? function(){ return new_date.getUTCMonth() == month; }\n\t\t\t\t\t// If going forward one month, make sure month is as expected\n\t\t\t\t\t// (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)\n\t\t\t\t\t: function(){ return new_date.getUTCMonth() != new_month; };\n\t\t\t\tnew_month = month + dir;\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t\t// Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11\n\t\t\t\tif (new_month < 0 || new_month > 11)\n\t\t\t\t\tnew_month = (new_month + 12) % 12;\n\t\t\t} else {\n\t\t\t\t// For magnitudes >1, move one month at a time...\n\t\t\t\tfor (var i=0; i<mag; i++)\n\t\t\t\t\t// ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...\n\t\t\t\t\tnew_date = this.moveMonth(new_date, dir);\n\t\t\t\t// ...then reset the day, keeping it in the new month\n\t\t\t\tnew_month = new_date.getUTCMonth();\n\t\t\t\tnew_date.setUTCDate(day);\n\t\t\t\ttest = function(){ return new_month != new_date.getUTCMonth(); };\n\t\t\t}\n\t\t\t// Common date-resetting loop -- if date is beyond end of month, make it\n\t\t\t// end of month\n\t\t\twhile (test()){\n\t\t\t\tnew_date.setUTCDate(--day);\n\t\t\t\tnew_date.setUTCMonth(new_month);\n\t\t\t}\n\t\t\treturn new_date;\n\t\t},\n\n\t\tmoveYear: function(date, dir){\n\t\t\treturn this.moveMonth(date, dir*12);\n\t\t},\n\n\t\tdateWithinRange: function(date){\n\t\t\treturn date >= this.o.startDate && date <= this.o.endDate;\n\t\t},\n\n\t\tkeydown: function(e){\n\t\t\tif (this.picker.is(':not(:visible)')){\n\t\t\t\tif (e.keyCode == 27) // allow escape to hide and re-show picker\n\t\t\t\t\tthis.show();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar dateChanged = false,\n\t\t\t\tdir, day, month,\n\t\t\t\tnewDate, newViewDate;\n\t\t\tswitch(e.keyCode){\n\t\t\t\tcase 27: // escape\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 37: // left\n\t\t\t\tcase 39: // right\n\t\t\t\t\tif (!this.o.keyboardNavigation) break;\n\t\t\t\t\tdir = e.keyCode == 37 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.date, dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(this.viewDate, dir);\n\t\t\t\t\t} else if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.date, dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(this.viewDate, dir);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDate = new Date(this.date);\n\t\t\t\t\t\tnewDate.setUTCDate(this.date.getUTCDate() + dir);\n\t\t\t\t\t\tnewViewDate = new Date(this.viewDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(this.viewDate.getUTCDate() + dir);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.date = newDate;\n\t\t\t\t\t\tthis.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tdateChanged = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 38: // up\n\t\t\t\tcase 40: // down\n\t\t\t\t\tif (!this.o.keyboardNavigation) break;\n\t\t\t\t\tdir = e.keyCode == 38 ? -1 : 1;\n\t\t\t\t\tif (e.ctrlKey){\n\t\t\t\t\t\tnewDate = this.moveYear(this.date, dir);\n\t\t\t\t\t\tnewViewDate = this.moveYear(this.viewDate, dir);\n\t\t\t\t\t} else if (e.shiftKey){\n\t\t\t\t\t\tnewDate = this.moveMonth(this.date, dir);\n\t\t\t\t\t\tnewViewDate = this.moveMonth(this.viewDate, dir);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnewDate = new Date(this.date);\n\t\t\t\t\t\tnewDate.setUTCDate(this.date.getUTCDate() + dir * 7);\n\t\t\t\t\t\tnewViewDate = new Date(this.viewDate);\n\t\t\t\t\t\tnewViewDate.setUTCDate(this.viewDate.getUTCDate() + dir * 7);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.dateWithinRange(newDate)){\n\t\t\t\t\t\tthis.date = newDate;\n\t\t\t\t\t\tthis.viewDate = newViewDate;\n\t\t\t\t\t\tthis.setValue();\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tdateChanged = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13: // enter\n\t\t\t\t\tthis.hide();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 9: // tab\n\t\t\t\t\tthis.hide();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (dateChanged){\n\t\t\t\tthis._trigger('changeDate');\n\t\t\t\tvar element;\n\t\t\t\tif (this.isInput) {\n\t\t\t\t\telement = this.element;\n\t\t\t\t} else if (this.component){\n\t\t\t\t\telement = this.element.find('input');\n\t\t\t\t}\n\t\t\t\tif (element) {\n\t\t\t\t\telement.change();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tshowMode: function(dir) {\n\t\t\tif (dir) {\n\t\t\t\tthis.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir));\n\t\t\t}\n\t\t\t/*\n\t\t\t\tvitalets: fixing bug of very special conditions:\n\t\t\t\tjquery 1.7.1 + webkit + show inline datepicker in bootstrap popover.\n\t\t\t\tMethod show() does not set display css correctly and datepicker is not shown.\n\t\t\t\tChanged to .css('display', 'block') solve the problem.\n\t\t\t\tSee https://github.com/vitalets/x-editable/issues/37\n\n\t\t\t\tIn jquery 1.7.2+ everything works fine.\n\t\t\t*/\n\t\t\t//this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();\n\t\t\tthis.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).css('display', 'block');\n\t\t\tthis.updateNavArrows();\n\t\t}\n\t};\n\n\tvar DateRangePicker = function(element, options){\n\t\tthis.element = $(element);\n\t\tthis.inputs = $.map(options.inputs, function(i){ return i.jquery ? i[0] : i; });\n\t\tdelete options.inputs;\n\n\t\t$(this.inputs)\n\t\t\t.datepicker(options)\n\t\t\t.bind('changeDate', $.proxy(this.dateUpdated, this));\n\n\t\tthis.pickers = $.map(this.inputs, function(i){ return $(i).data('datepicker'); });\n\t\tthis.updateDates();\n\t};\n\tDateRangePicker.prototype = {\n\t\tupdateDates: function(){\n\t\t\tthis.dates = $.map(this.pickers, function(i){ return i.date; });\n\t\t\tthis.updateRanges();\n\t\t},\n\t\tupdateRanges: function(){\n\t\t\tvar range = $.map(this.dates, function(d){ return d.valueOf(); });\n\t\t\t$.each(this.pickers, function(i, p){\n\t\t\t\tp.setRange(range);\n\t\t\t});\n\t\t},\n\t\tdateUpdated: function(e){\n\t\t\tvar dp = $(e.target).data('datepicker'),\n\t\t\t\tnew_date = dp.getUTCDate(),\n\t\t\t\ti = $.inArray(e.target, this.inputs),\n\t\t\t\tl = this.inputs.length;\n\t\t\tif (i == -1) return;\n\n\t\t\tif (new_date < this.dates[i]){\n\t\t\t\t// Date being moved earlier/left\n\t\t\t\twhile (i>=0 && new_date < this.dates[i]){\n\t\t\t\t\tthis.pickers[i--].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (new_date > this.dates[i]){\n\t\t\t\t// Date being moved later/right\n\t\t\t\twhile (i<l && new_date > this.dates[i]){\n\t\t\t\t\tthis.pickers[i++].setUTCDate(new_date);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateDates();\n\t\t},\n\t\tremove: function(){\n\t\t\t$.map(this.pickers, function(p){ p.remove(); });\n\t\t\tdelete this.element.data().datepicker;\n\t\t}\n\t};\n\n\tfunction opts_from_el(el, prefix){\n\t\t// Derive options from element data-attrs\n\t\tvar data = $(el).data(),\n\t\t\tout = {}, inkey,\n\t\t\treplace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'),\n\t\t\tprefix = new RegExp('^' + prefix.toLowerCase());\n\t\tfor (var key in data)\n\t\t\tif (prefix.test(key)){\n\t\t\t\tinkey = key.replace(replace, function(_,a){ return a.toLowerCase(); });\n\t\t\t\tout[inkey] = data[key];\n\t\t\t}\n\t\treturn out;\n\t}\n\n\tfunction opts_from_locale(lang){\n\t\t// Derive options from locale plugins\n\t\tvar out = {};\n\t\t// Check if \"de-DE\" style date is available, if not language should\n\t\t// fallback to 2 letter code eg \"de\"\n\t\tif (!dates[lang]) {\n\t\t\tlang = lang.split('-')[0]\n\t\t\tif (!dates[lang])\n\t\t\t\treturn;\n\t\t}\n\t\tvar d = dates[lang];\n\t\t$.each(locale_opts, function(i,k){\n\t\t\tif (k in d)\n\t\t\t\tout[k] = d[k];\n\t\t});\n\t\treturn out;\n\t}\n\n\tvar old = $.fn.datepicker;\n\tvar datepicker = $.fn.datepicker = function ( option ) {\n\t\tvar args = Array.apply(null, arguments);\n\t\targs.shift();\n\t\tvar internal_return,\n\t\t\tthis_return;\n\t\tthis.each(function () {\n\t\t\tvar $this = $(this),\n\t\t\t\tdata = $this.data('datepicker'),\n\t\t\t\toptions = typeof option == 'object' && option;\n\t\t\tif (!data) {\n\t\t\t\tvar elopts = opts_from_el(this, 'date'),\n\t\t\t\t\t// Preliminary otions\n\t\t\t\t\txopts = $.extend({}, defaults, elopts, options),\n\t\t\t\t\tlocopts = opts_from_locale(xopts.language),\n\t\t\t\t\t// Options priority: js args, data-attrs, locales, defaults\n\t\t\t\t\topts = $.extend({}, defaults, locopts, elopts, options);\n\t\t\t\tif ($this.is('.input-daterange') || opts.inputs){\n\t\t\t\t\tvar ropts = {\n\t\t\t\t\t\tinputs: opts.inputs || $this.find('input').toArray()\n\t\t\t\t\t};\n\t\t\t\t\t$this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts))));\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\t$this.data('datepicker', (data = new Datepicker(this, opts)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof option == 'string' && typeof data[option] == 'function') {\n\t\t\t\tinternal_return = data[option].apply(data, args);\n\t\t\t\tif (internal_return !== undefined)\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif (internal_return !== undefined)\n\t\t\treturn internal_return;\n\t\telse\n\t\t\treturn this;\n\t};\n\n\tvar defaults = $.fn.datepicker.defaults = {\n\t\tautoclose: false,\n\t\tbeforeShowDay: $.noop,\n\t\tcalendarWeeks: false,\n\t\tclearBtn: false,\n\t\tdaysOfWeekDisabled: [],\n\t\tendDate: Infinity,\n\t\tforceParse: true,\n\t\tformat: 'mm/dd/yyyy',\n\t\tkeyboardNavigation: true,\n\t\tlanguage: 'en',\n\t\tminViewMode: 0,\n\t\trtl: false,\n\t\tstartDate: -Infinity,\n\t\tstartView: 0,\n\t\ttodayBtn: false,\n\t\ttodayHighlight: false,\n\t\tweekStart: 0\n\t};\n\tvar locale_opts = $.fn.datepicker.locale_opts = [\n\t\t'format',\n\t\t'rtl',\n\t\t'weekStart'\n\t];\n\t$.fn.datepicker.Constructor = Datepicker;\n\tvar dates = $.fn.datepicker.dates = {\n\t\ten: {\n\t\t\tdays: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"],\n\t\t\tdaysShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n\t\t\tdaysMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"],\n\t\t\tmonths: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tmonthsShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n\t\t\ttoday: \"Today\",\n\t\t\tclear: \"Clear\"\n\t\t}\n\t};\n\n\tvar DPGlobal = {\n\t\tmodes: [\n\t\t\t{\n\t\t\t\tclsName: 'days',\n\t\t\t\tnavFnc: 'Month',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'months',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'years',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 10\n\t\t}],\n\t\tisLeapYear: function (year) {\n\t\t\treturn (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n\t\t},\n\t\tgetDaysInMonth: function (year, month) {\n\t\t\treturn [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n\t\t},\n\t\tvalidParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,\n\t\tnonpunctuation: /[^ -\\/:-@\\[\\u3400-\\u9fff-`{-~\\t\\n\\r]+/g,\n\t\tparseFormat: function(format){\n\t\t\t// IE treats \\0 as a string end in inputs (truncating the value),\n\t\t\t// so it's a bad format delimiter, anyway\n\t\t\tvar separators = format.replace(this.validParts, '\\0').split('\\0'),\n\t\t\t\tparts = format.match(this.validParts);\n\t\t\tif (!separators || !separators.length || !parts || parts.length === 0){\n\t\t\t\tthrow new Error(\"Invalid date format.\");\n\t\t\t}\n\t\t\treturn {separators: separators, parts: parts};\n\t\t},\n\t\tparseDate: function(date, format, language) {\n\t\t\tif (date instanceof Date) return date;\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tif (/^[\\-+]\\d+[dmwy]([\\s,]+[\\-+]\\d+[dmwy])*$/.test(date)) {\n\t\t\t\tvar part_re = /([\\-+]\\d+)([dmwy])/,\n\t\t\t\t\tparts = date.match(/([\\-+]\\d+)([dmwy])/g),\n\t\t\t\t\tpart, dir;\n\t\t\t\tdate = new Date();\n\t\t\t\tfor (var i=0; i<parts.length; i++) {\n\t\t\t\t\tpart = part_re.exec(parts[i]);\n\t\t\t\t\tdir = parseInt(part[1]);\n\t\t\t\t\tswitch(part[2]){\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'w':\n\t\t\t\t\t\t\tdate.setUTCDate(date.getUTCDate() + dir * 7);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'y':\n\t\t\t\t\t\t\tdate = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0);\n\t\t\t}\n\t\t\tvar parts = date && date.match(this.nonpunctuation) || [],\n\t\t\t\tdate = new Date(),\n\t\t\t\tparsed = {},\n\t\t\t\tsetters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],\n\t\t\t\tsetters_map = {\n\t\t\t\t\tyyyy: function(d,v){ return d.setUTCFullYear(v); },\n\t\t\t\t\tyy: function(d,v){ return d.setUTCFullYear(2000+v); },\n\t\t\t\t\tm: function(d,v){\n\t\t\t\t\t\tv -= 1;\n\t\t\t\t\t\twhile (v<0) v += 12;\n\t\t\t\t\t\tv %= 12;\n\t\t\t\t\t\td.setUTCMonth(v);\n\t\t\t\t\t\twhile (d.getUTCMonth() != v)\n\t\t\t\t\t\t\td.setUTCDate(d.getUTCDate()-1);\n\t\t\t\t\t\treturn d;\n\t\t\t\t\t},\n\t\t\t\t\td: function(d,v){ return d.setUTCDate(v); }\n\t\t\t\t},\n\t\t\t\tval, filtered, part;\n\t\t\tsetters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];\n\t\t\tsetters_map['dd'] = setters_map['d'];\n\t\t\tdate = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n\t\t\tvar fparts = format.parts.slice();\n\t\t\t// Remove noop parts\n\t\t\tif (parts.length != fparts.length) {\n\t\t\t\tfparts = $(fparts).filter(function(i,p){\n\t\t\t\t\treturn $.inArray(p, setters_order) !== -1;\n\t\t\t\t}).toArray();\n\t\t\t}\n\t\t\t// Process remainder\n\t\t\tif (parts.length == fparts.length) {\n\t\t\t\tfor (var i=0, cnt = fparts.length; i < cnt; i++) {\n\t\t\t\t\tval = parseInt(parts[i], 10);\n\t\t\t\t\tpart = fparts[i];\n\t\t\t\t\tif (isNaN(val)) {\n\t\t\t\t\t\tswitch(part) {\n\t\t\t\t\t\t\tcase 'MM':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].months).filter(function(){\n\t\t\t\t\t\t\t\t\tvar m = this.slice(0, parts[i].length),\n\t\t\t\t\t\t\t\t\t\tp = parts[i].slice(0, m.length);\n\t\t\t\t\t\t\t\t\treturn m == p;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].months) + 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'M':\n\t\t\t\t\t\t\t\tfiltered = $(dates[language].monthsShort).filter(function(){\n\t\t\t\t\t\t\t\t\tvar m = this.slice(0, parts[i].length),\n\t\t\t\t\t\t\t\t\t\tp = parts[i].slice(0, m.length);\n\t\t\t\t\t\t\t\t\treturn m == p;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tval = $.inArray(filtered[0], dates[language].monthsShort) + 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparsed[part] = val;\n\t\t\t\t}\n\t\t\t\tfor (var i=0, s; i<setters_order.length; i++){\n\t\t\t\t\ts = setters_order[i];\n\t\t\t\t\tif (s in parsed && !isNaN(parsed[s]))\n\t\t\t\t\t\tsetters_map[s](date, parsed[s]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn date;\n\t\t},\n\t\tformatDate: function(date, format, language){\n\t\t\tif (typeof format === 'string')\n\t\t\t\tformat = DPGlobal.parseFormat(format);\n\t\t\tvar val = {\n\t\t\t\td: date.getUTCDate(),\n\t\t\t\tD: dates[language].daysShort[date.getUTCDay()],\n\t\t\t\tDD: dates[language].days[date.getUTCDay()],\n\t\t\t\tm: date.getUTCMonth() + 1,\n\t\t\t\tM: dates[language].monthsShort[date.getUTCMonth()],\n\t\t\t\tMM: dates[language].months[date.getUTCMonth()],\n\t\t\t\tyy: date.getUTCFullYear().toString().substring(2),\n\t\t\t\tyyyy: date.getUTCFullYear()\n\t\t\t};\n\t\t\tval.dd = (val.d < 10 ? '0' : '') + val.d;\n\t\t\tval.mm = (val.m < 10 ? '0' : '') + val.m;\n\t\t\tvar date = [],\n\t\t\t\tseps = $.extend([], format.separators);\n\t\t\tfor (var i=0, cnt = format.parts.length; i <= cnt; i++) {\n\t\t\t\tif (seps.length)\n\t\t\t\t\tdate.push(seps.shift());\n\t\t\t\tdate.push(val[format.parts[i]]);\n\t\t\t}\n\t\t\treturn date.join('');\n\t\t},\n\t\theadTemplate: '<thead>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th class=\"prev\"><i class=\"icon-arrow-left\"/></th>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"5\" class=\"datepicker-switch\"></th>'+\n\t\t\t\t\t\t\t\t'<th class=\"next\"><i class=\"icon-arrow-right\"/></th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</thead>',\n\t\tcontTemplate: '<tbody><tr><td colspan=\"7\"></td></tr></tbody>',\n\t\tfootTemplate: '<tfoot><tr><th colspan=\"7\" class=\"today\"></th></tr><tr><th colspan=\"7\" class=\"clear\"></th></tr></tfoot>'\n\t};\n\tDPGlobal.template = '<div class=\"datepicker\">'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-days\">'+\n\t\t\t\t\t\t\t\t'<table class=\" table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\t'<tbody></tbody>'+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-months\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-years\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.footTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t'</div>';\n\n\t$.fn.datepicker.DPGlobal = DPGlobal;\n\n\n\t/* DATEPICKER NO CONFLICT\n\t* =================== */\n\n\t$.fn.datepicker.noConflict = function(){\n\t\t$.fn.datepicker = old;\n\t\treturn this;\n\t};\n\n\n\t/* DATEPICKER DATA-API\n\t* ================== */\n\n\t$(document).on(\n\t\t'focus.datepicker.data-api click.datepicker.data-api',\n\t\t'[data-provide=\"datepicker\"]',\n\t\tfunction(e){\n\t\t\tvar $this = $(this);\n\t\t\tif ($this.data('datepicker')) return;\n\t\t\te.preventDefault();\n\t\t\t// component click requires us to explicitly show it\n\t\t\tdatepicker.call($this, 'show');\n\t\t}\n\t);\n\t$(function(){\n\t\t//$('[data-provide=\"datepicker-inline\"]').datepicker();\n        //vit: changed to support noConflict()\n        datepicker.call($('[data-provide=\"datepicker-inline\"]'));\n\t});\n\n}( window.jQuery ));\n\n/**\nBootstrap-datepicker.  \nDescription and examples: https://github.com/eternicode/bootstrap-datepicker.  \nFor **i18n** you should include js file from here: https://github.com/eternicode/bootstrap-datepicker/tree/master/js/locales\nand set `language` option.  \nSince 1.4.0 date has different appearance in **popup** and **inline** modes. \n\n@class date\n@extends abstractinput\n@final\n@example\n<a href=\"#\" id=\"dob\" data-type=\"date\" data-pk=\"1\" data-url=\"/post\" data-title=\"Select date\">15/05/1984</a>\n<script>\n$(function(){\n    $('#dob').editable({\n        format: 'yyyy-mm-dd',    \n        viewformat: 'dd/mm/yyyy',    \n        datepicker: {\n                weekStart: 1\n           }\n        }\n    });\n});\n</script>\n**/\n(function ($) {\n    \"use strict\";\n    \n    //store bootstrap-datepicker as bdateicker to exclude conflict with jQuery UI one\n    $.fn.bdatepicker = $.fn.datepicker.noConflict();\n    if(!$.fn.datepicker) { //if there were no other datepickers, keep also original name\n        $.fn.datepicker = $.fn.bdatepicker;    \n    }    \n    \n    var Date = function (options) {\n        this.init('date', options, Date.defaults);\n        this.initPicker(options, Date.defaults);\n    };\n\n    $.fn.editableutils.inherit(Date, $.fn.editabletypes.abstractinput);    \n    \n    $.extend(Date.prototype, {\n        initPicker: function(options, defaults) {\n            //'format' is set directly from settings or data-* attributes\n\n            //by default viewformat equals to format\n            if(!this.options.viewformat) {\n                this.options.viewformat = this.options.format;\n            }\n            \n            //try parse datepicker config defined as json string in data-datepicker\n            options.datepicker = $.fn.editableutils.tryParseJson(options.datepicker, true);\n            \n            //overriding datepicker config (as by default jQuery extend() is not recursive)\n            //since 1.4 datepicker internally uses viewformat instead of format. Format is for submit only\n            this.options.datepicker = $.extend({}, defaults.datepicker, options.datepicker, {\n                format: this.options.viewformat\n            });\n            \n            //language\n            this.options.datepicker.language = this.options.datepicker.language || 'en'; \n\n            //store DPglobal\n            this.dpg = $.fn.bdatepicker.DPGlobal; \n\n            //store parsed formats\n            this.parsedFormat = this.dpg.parseFormat(this.options.format);\n            this.parsedViewFormat = this.dpg.parseFormat(this.options.viewformat);            \n        },\n        \n        render: function () {\n            this.$input.bdatepicker(this.options.datepicker);\n            \n            //\"clear\" link\n            if(this.options.clear) {\n                this.$clear = $('<a href=\"#\"></a>').html(this.options.clear).click($.proxy(function(e){\n                    e.preventDefault();\n                    e.stopPropagation();\n                    this.clear();\n                }, this));\n                \n                this.$tpl.parent().append($('<div class=\"editable-clear\">').append(this.$clear));  \n            }                \n        },\n        \n        value2html: function(value, element) {\n           var text = value ? this.dpg.formatDate(value, this.parsedViewFormat, this.options.datepicker.language) : '';\n           Date.superclass.value2html.call(this, text, element); \n        },\n\n        html2value: function(html) {\n            return this.parseDate(html, this.parsedViewFormat);\n        },   \n\n        value2str: function(value) {\n            return value ? this.dpg.formatDate(value, this.parsedFormat, this.options.datepicker.language) : '';\n        }, \n\n        str2value: function(str) {\n            return this.parseDate(str, this.parsedFormat);\n        }, \n\n        value2submit: function(value) {\n            return this.value2str(value);\n        },                    \n\n        value2input: function(value) {\n            this.$input.bdatepicker('update', value);\n        },\n\n        input2value: function() { \n            return this.$input.data('datepicker').date;\n        },       \n\n        activate: function() {\n        },\n\n        clear:  function() {\n            this.$input.data('datepicker').date = null;\n            this.$input.find('.active').removeClass('active');\n            if(!this.options.showbuttons) {\n                this.$input.closest('form').submit(); \n            }\n        },\n\n        autosubmit: function() {\n            this.$input.on('mouseup', '.day', function(e){\n                if($(e.currentTarget).is('.old') || $(e.currentTarget).is('.new')) {\n                    return;\n                }\n                var $form = $(this).closest('form');\n                setTimeout(function() {\n                    $form.submit();\n                }, 200);\n            });\n           //changedate is not suitable as it triggered when showing datepicker. see #149\n           /*\n           this.$input.on('changeDate', function(e){\n               var $form = $(this).closest('form');\n               setTimeout(function() {\n                   $form.submit();\n               }, 200);\n           });\n           */\n       },\n       \n       /*\n        For incorrect date bootstrap-datepicker returns current date that is not suitable\n        for datefield.\n        This function returns null for incorrect date.  \n       */\n       parseDate: function(str, format) {\n           var date = null, formattedBack;\n           if(str) {\n               date = this.dpg.parseDate(str, format, this.options.datepicker.language);\n               if(typeof str === 'string') {\n                   formattedBack = this.dpg.formatDate(date, format, this.options.datepicker.language);\n                   if(str !== formattedBack) {\n                       date = null;\n                   }\n               }\n           }\n           return date;\n       }\n\n    });\n\n    Date.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        /**\n        @property tpl \n        @default <div></div>\n        **/         \n        tpl:'<div class=\"editable-date well\"></div>',\n        /**\n        @property inputclass \n        @default null\n        **/\n        inputclass: null,\n        /**\n        Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br>\n        Possible tokens are: <code>d, dd, m, mm, yy, yyyy</code>  \n\n        @property format \n        @type string\n        @default yyyy-mm-dd\n        **/\n        format:'yyyy-mm-dd',\n        /**\n        Format used for displaying date. Also applied when converting date from element's text on init.   \n        If not specified equals to <code>format</code>\n\n        @property viewformat \n        @type string\n        @default null\n        **/\n        viewformat: null,\n        /**\n        Configuration of datepicker.\n        Full list of options: http://bootstrap-datepicker.readthedocs.org/en/latest/options.html\n\n        @property datepicker \n        @type object\n        @default {\n            weekStart: 0,\n            startView: 0,\n            minViewMode: 0,\n            autoclose: false\n        }\n        **/\n        datepicker:{\n            weekStart: 0,\n            startView: 0,\n            minViewMode: 0,\n            autoclose: false\n        },\n        /**\n        Text shown as clear date button. \n        If <code>false</code> clear button will not be rendered.\n\n        @property clear \n        @type boolean|string\n        @default 'x clear'\n        **/\n        clear: '&times; clear'\n    });\n\n    $.fn.editabletypes.date = Date;\n\n}(window.jQuery));\n\n/**\nBootstrap datefield input - modification for inline mode.\nShows normal <input type=\"text\"> and binds popup datepicker.\nAutomatically shown in inline mode.\n\n@class datefield\n@extends date\n\n@since 1.4.0\n**/\n(function ($) {\n    \"use strict\";\n\n    var DateField = function (options) {\n        this.init('datefield', options, DateField.defaults);\n        this.initPicker(options, DateField.defaults);\n    };\n\n    $.fn.editableutils.inherit(DateField, $.fn.editabletypes.date);\n\n    $.extend(DateField.prototype, {\n        render: function () {\n            this.$input = this.$tpl.find('input');\n            this.setClass();\n            this.setAttr('placeholder');\n\n            //bootstrap-datepicker is set `bdateicker` to exclude conflict with jQuery UI one. (in date.js)\n            this.$input.bdatepicker(this.options.datepicker);\n\n            //need to disable original event handlers\n            this.$input.off('focus keydown');\n\n            //update value of datepicker\n            this.$input.keyup($.proxy(function(){\n               this.$tpl.removeData('date');\n               this.$tpl.bdatepicker('update');\n            }, this));\n\n        },\n\n       value2input: function(value) {\n           this.$input.val(value ? this.dpg.formatDate(value, this.parsedViewFormat, this.options.datepicker.language) : '');\n           this.$tpl.bdatepicker('update');\n       },\n\n       input2value: function() {\n           return this.html2value(this.$input.val());\n       },\n\n       activate: function() {\n           $.fn.editabletypes.text.prototype.activate.call(this);\n       },\n\n       autosubmit: function() {\n         //reset autosubmit to empty\n       }\n    });\n\n    DateField.defaults = $.extend({}, $.fn.editabletypes.date.defaults, {\n        /**\n        @property tpl\n        **/\n        tpl:'<div class=\"input-append date\"><input type=\"text\"/><span class=\"add-on\"><i class=\"icon-th\"></i></span></div>',\n        /**\n        @property inputclass\n        @default 'input-small'\n        **/\n        inputclass: 'input-small',\n\n        /* datepicker config */\n        datepicker: {\n            weekStart: 0,\n            startView: 0,\n            minViewMode: 0,\n            autoclose: true\n        }\n    });\n\n    $.fn.editabletypes.datefield = DateField;\n\n}(window.jQuery));\n\n/**\nBootstrap-datetimepicker.  \nBased on [smalot bootstrap-datetimepicker plugin](https://github.com/smalot/bootstrap-datetimepicker). \nBefore usage you should manually include dependent js and css:\n\n    <link href=\"css/datetimepicker.css\" rel=\"stylesheet\" type=\"text/css\"></link> \n    <script src=\"js/bootstrap-datetimepicker.js\"></script>\n\nFor **i18n** you should include js file from here: https://github.com/smalot/bootstrap-datetimepicker/tree/master/js/locales\nand set `language` option.  \n\n@class datetime\n@extends abstractinput\n@final\n@since 1.4.4\n@example\n<a href=\"#\" id=\"last_seen\" data-type=\"datetime\" data-pk=\"1\" data-url=\"/post\" title=\"Select date & time\">15/03/2013 12:45</a>\n<script>\n$(function(){\n    $('#last_seen').editable({\n        format: 'yyyy-mm-dd hh:ii',    \n        viewformat: 'dd/mm/yyyy hh:ii',    \n        datetimepicker: {\n                weekStart: 1\n           }\n        }\n    });\n});\n</script>\n**/\n(function ($) {\n    \"use strict\";\n\n    var DateTime = function (options) {\n        this.init('datetime', options, DateTime.defaults);\n        this.initPicker(options, DateTime.defaults);\n    };\n\n    $.fn.editableutils.inherit(DateTime, $.fn.editabletypes.abstractinput);\n\n    $.extend(DateTime.prototype, {\n        initPicker: function(options, defaults) {\n            //'format' is set directly from settings or data-* attributes\n\n            //by default viewformat equals to format\n            if(!this.options.viewformat) {\n                this.options.viewformat = this.options.format;\n            }\n            \n            //try parse datetimepicker config defined as json string in data-datetimepicker\n            options.datetimepicker = $.fn.editableutils.tryParseJson(options.datetimepicker, true);\n\n            //overriding datetimepicker config (as by default jQuery extend() is not recursive)\n            //since 1.4 datetimepicker internally uses viewformat instead of format. Format is for submit only\n            this.options.datetimepicker = $.extend({}, defaults.datetimepicker, options.datetimepicker, {\n                format: this.options.viewformat\n            });\n\n            //language\n            this.options.datetimepicker.language = this.options.datetimepicker.language || 'en'; \n\n            //store DPglobal\n            this.dpg = $.fn.datetimepicker.DPGlobal; \n\n            //store parsed formats\n            this.parsedFormat = this.dpg.parseFormat(this.options.format, this.options.formatType);\n            this.parsedViewFormat = this.dpg.parseFormat(this.options.viewformat, this.options.formatType);\n        },\n\n        render: function () {\n            this.$input.datetimepicker(this.options.datetimepicker);\n\n            //adjust container position when viewMode changes\n            //see https://github.com/smalot/bootstrap-datetimepicker/pull/80\n            this.$input.on('changeMode', function(e) {\n                var f = $(this).closest('form').parent();\n                //timeout here, otherwise container changes position before form has new size\n                setTimeout(function(){\n                    f.triggerHandler('resize');\n                }, 0);\n            });\n\n            //\"clear\" link\n            if(this.options.clear) {\n                this.$clear = $('<a href=\"#\"></a>').html(this.options.clear).click($.proxy(function(e){\n                    e.preventDefault();\n                    e.stopPropagation();\n                    this.clear();\n                }, this));\n\n                this.$tpl.parent().append($('<div class=\"editable-clear\">').append(this.$clear));  \n            }\n        },\n\n        value2html: function(value, element) {\n            //formatDate works with UTCDate!\n            var text = value ? this.dpg.formatDate(this.toUTC(value), this.parsedViewFormat, this.options.datetimepicker.language, this.options.formatType) : '';\n            if(element) {\n                DateTime.superclass.value2html.call(this, text, element);\n            } else {\n                return text;\n            }\n        },\n\n        html2value: function(html) {\n            //parseDate return utc date!\n            var value = this.parseDate(html, this.parsedViewFormat); \n            return value ? this.fromUTC(value) : null;\n        },\n\n        value2str: function(value) {\n            //formatDate works with UTCDate!\n            return value ? this.dpg.formatDate(this.toUTC(value), this.parsedFormat, this.options.datetimepicker.language, this.options.formatType) : '';\n       },\n\n       str2value: function(str) {\n           //parseDate return utc date!\n           var value = this.parseDate(str, this.parsedFormat);\n           return value ? this.fromUTC(value) : null;\n       },\n\n       value2submit: function(value) {\n           return this.value2str(value);\n       },\n\n       value2input: function(value) {\n           if(value) {\n             this.$input.data('datetimepicker').setDate(value);\n           }\n       },\n\n       input2value: function() { \n           //date may be cleared, in that case getDate() triggers error\n           var dt = this.$input.data('datetimepicker');\n           return dt.date ? dt.getDate() : null;\n       },\n\n       activate: function() {\n       },\n\n       clear: function() {\n          this.$input.data('datetimepicker').date = null;\n          this.$input.find('.active').removeClass('active');\n          if(!this.options.showbuttons) {\n             this.$input.closest('form').submit(); \n          }          \n       },\n\n       autosubmit: function() {\n           this.$input.on('mouseup', '.minute', function(e){\n               var $form = $(this).closest('form');\n               setTimeout(function() {\n                   $form.submit();\n               }, 200);\n           });\n       },\n\n       //convert date from local to utc\n       toUTC: function(value) {\n         return value ? new Date(value.valueOf() - value.getTimezoneOffset() * 60000) : value;  \n       },\n\n       //convert date from utc to local\n       fromUTC: function(value) {\n         return value ? new Date(value.valueOf() + value.getTimezoneOffset() * 60000) : value;  \n       },\n\n       /*\n        For incorrect date bootstrap-datetimepicker returns current date that is not suitable\n        for datetimefield.\n        This function returns null for incorrect date.  \n       */\n       parseDate: function(str, format) {\n           var date = null, formattedBack;\n           if(str) {\n               date = this.dpg.parseDate(str, format, this.options.datetimepicker.language, this.options.formatType);\n               if(typeof str === 'string') {\n                   formattedBack = this.dpg.formatDate(date, format, this.options.datetimepicker.language, this.options.formatType);\n                   if(str !== formattedBack) {\n                       date = null;\n                   } \n               }\n           }\n           return date;\n       }\n\n    });\n\n    DateTime.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, {\n        /**\n        @property tpl \n        @default <div></div>\n        **/         \n        tpl:'<div class=\"editable-date well\"></div>',\n        /**\n        @property inputclass \n        @default null\n        **/\n        inputclass: null,\n        /**\n        Format used for sending value to server. Also applied when converting date from <code>data-value</code> attribute.<br>\n        Possible tokens are: <code>d, dd, m, mm, yy, yyyy, h, i</code>  \n        \n        @property format \n        @type string\n        @default yyyy-mm-dd hh:ii\n        **/         \n        format:'yyyy-mm-dd hh:ii',\n        formatType:'standard',\n        /**\n        Format used for displaying date. Also applied when converting date from element's text on init.   \n        If not specified equals to <code>format</code>\n        \n        @property viewformat \n        @type string\n        @default null\n        **/\n        viewformat: null,\n        /**\n        Configuration of datetimepicker.\n        Full list of options: https://github.com/smalot/bootstrap-datetimepicker\n\n        @property datetimepicker \n        @type object\n        @default { }\n        **/\n        datetimepicker:{\n            todayHighlight: false,\n            autoclose: false\n        },\n        /**\n        Text shown as clear date button. \n        If <code>false</code> clear button will not be rendered.\n\n        @property clear \n        @type boolean|string\n        @default 'x clear'\n        **/\n        clear: '&times; clear'\n    });\n\n    $.fn.editabletypes.datetime = DateTime;\n\n}(window.jQuery));\n/**\nBootstrap datetimefield input - datetime input for inline mode.\nShows normal <input type=\"text\"> and binds popup datetimepicker.  \nAutomatically shown in inline mode.\n\n@class datetimefield\n@extends datetime\n\n**/\n(function ($) {\n    \"use strict\";\n    \n    var DateTimeField = function (options) {\n        this.init('datetimefield', options, DateTimeField.defaults);\n        this.initPicker(options, DateTimeField.defaults);\n    };\n\n    $.fn.editableutils.inherit(DateTimeField, $.fn.editabletypes.datetime);\n    \n    $.extend(DateTimeField.prototype, {\n        render: function () {\n            this.$input = this.$tpl.find('input');\n            this.setClass();\n            this.setAttr('placeholder');\n            \n            this.$tpl.datetimepicker(this.options.datetimepicker);\n            \n            //need to disable original event handlers\n            this.$input.off('focus keydown');\n            \n            //update value of datepicker\n            this.$input.keyup($.proxy(function(){\n               this.$tpl.removeData('date');\n               this.$tpl.datetimepicker('update');\n            }, this));\n            \n        },   \n      \n       value2input: function(value) {\n           this.$input.val(this.value2html(value));\n           this.$tpl.datetimepicker('update');\n       },\n        \n       input2value: function() { \n           return this.html2value(this.$input.val());\n       },              \n        \n       activate: function() {\n           $.fn.editabletypes.text.prototype.activate.call(this);\n       },\n       \n       autosubmit: function() {\n         //reset autosubmit to empty  \n       }\n    });\n    \n    DateTimeField.defaults = $.extend({}, $.fn.editabletypes.datetime.defaults, {\n        /**\n        @property tpl \n        **/         \n        tpl:'<div class=\"input-append date\"><input type=\"text\"/><span class=\"add-on\"><i class=\"icon-th\"></i></span></div>',\n        /**\n        @property inputclass \n        @default 'input-medium'\n        **/         \n        inputclass: 'input-medium',\n        \n        /* datetimepicker config */\n        datetimepicker:{\n            todayHighlight: false,\n            autoclose: true\n        }\n    });\n    \n    $.fn.editabletypes.datetimefield = DateTimeField;\n\n}(window.jQuery));","/*!\n * AdminLTE v3.1.0 (https://adminlte.io)\n * Copyright 2014-2021 Colorlib <https://colorlib.com>\n * Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.adminlte = {}, global.jQuery));\n}(this, (function (exports, $) { 'use strict';\n\n  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\n  var $__default = /*#__PURE__*/_interopDefaultLegacy($);\n\n  /**\n   * --------------------------------------------\n   * AdminLTE CardRefresh.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$e = 'CardRefresh';\n  var DATA_KEY$e = 'lte.cardrefresh';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$e;\n  var JQUERY_NO_CONFLICT$e = $__default['default'].fn[NAME$e];\n  var EVENT_LOADED = \"loaded\" + EVENT_KEY$7;\n  var EVENT_OVERLAY_ADDED = \"overlay.added\" + EVENT_KEY$7;\n  var EVENT_OVERLAY_REMOVED = \"overlay.removed\" + EVENT_KEY$7;\n  var CLASS_NAME_CARD$1 = 'card';\n  var SELECTOR_CARD$1 = \".\" + CLASS_NAME_CARD$1;\n  var SELECTOR_DATA_REFRESH = '[data-card-widget=\"card-refresh\"]';\n  var Default$c = {\n    source: '',\n    sourceSelector: '',\n    params: {},\n    trigger: SELECTOR_DATA_REFRESH,\n    content: '.card-body',\n    loadInContent: true,\n    loadOnInit: true,\n    responseType: '',\n    overlayTemplate: '<div class=\"overlay\"><i class=\"fas fa-2x fa-sync-alt fa-spin\"></i></div>',\n    onLoadStart: function onLoadStart() {},\n    onLoadDone: function onLoadDone(response) {\n      return response;\n    }\n  };\n\n  var CardRefresh = /*#__PURE__*/function () {\n    function CardRefresh(element, settings) {\n      this._element = element;\n      this._parent = element.parents(SELECTOR_CARD$1).first();\n      this._settings = $__default['default'].extend({}, Default$c, settings);\n      this._overlay = $__default['default'](this._settings.overlayTemplate);\n\n      if (element.hasClass(CLASS_NAME_CARD$1)) {\n        this._parent = element;\n      }\n\n      if (this._settings.source === '') {\n        throw new Error('Source url was not defined. Please specify a url in your CardRefresh source option.');\n      }\n    }\n\n    var _proto = CardRefresh.prototype;\n\n    _proto.load = function load() {\n      var _this = this;\n\n      this._addOverlay();\n\n      this._settings.onLoadStart.call($__default['default'](this));\n\n      $__default['default'].get(this._settings.source, this._settings.params, function (response) {\n        if (_this._settings.loadInContent) {\n          if (_this._settings.sourceSelector !== '') {\n            response = $__default['default'](response).find(_this._settings.sourceSelector).html();\n          }\n\n          _this._parent.find(_this._settings.content).html(response);\n        }\n\n        _this._settings.onLoadDone.call($__default['default'](_this), response);\n\n        _this._removeOverlay();\n      }, this._settings.responseType !== '' && this._settings.responseType);\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_LOADED));\n    };\n\n    _proto._addOverlay = function _addOverlay() {\n      this._parent.append(this._overlay);\n\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_OVERLAY_ADDED));\n    };\n\n    _proto._removeOverlay = function _removeOverlay() {\n      this._parent.find(this._overlay).remove();\n\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_OVERLAY_REMOVED));\n    } // Private\n    ;\n\n    _proto._init = function _init() {\n      var _this2 = this;\n\n      $__default['default'](this).find(this._settings.trigger).on('click', function () {\n        _this2.load();\n      });\n\n      if (this._settings.loadOnInit) {\n        this.load();\n      }\n    } // Static\n    ;\n\n    CardRefresh._jQueryInterface = function _jQueryInterface(config) {\n      var data = $__default['default'](this).data(DATA_KEY$e);\n\n      var _options = $__default['default'].extend({}, Default$c, $__default['default'](this).data());\n\n      if (!data) {\n        data = new CardRefresh($__default['default'](this), _options);\n        $__default['default'](this).data(DATA_KEY$e, typeof config === 'string' ? data : config);\n      }\n\n      if (typeof config === 'string' && /load/.test(config)) {\n        data[config]();\n      } else {\n        data._init($__default['default'](this));\n      }\n    };\n\n    return CardRefresh;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](document).on('click', SELECTOR_DATA_REFRESH, function (event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    CardRefresh._jQueryInterface.call($__default['default'](this), 'load');\n  });\n  $__default['default'](function () {\n    $__default['default'](SELECTOR_DATA_REFRESH).each(function () {\n      CardRefresh._jQueryInterface.call($__default['default'](this));\n    });\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$e] = CardRefresh._jQueryInterface;\n  $__default['default'].fn[NAME$e].Constructor = CardRefresh;\n\n  $__default['default'].fn[NAME$e].noConflict = function () {\n    $__default['default'].fn[NAME$e] = JQUERY_NO_CONFLICT$e;\n    return CardRefresh._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE CardWidget.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$d = 'CardWidget';\n  var DATA_KEY$d = 'lte.cardwidget';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$d;\n  var JQUERY_NO_CONFLICT$d = $__default['default'].fn[NAME$d];\n  var EVENT_EXPANDED$3 = \"expanded\" + EVENT_KEY$6;\n  var EVENT_COLLAPSED$4 = \"collapsed\" + EVENT_KEY$6;\n  var EVENT_MAXIMIZED = \"maximized\" + EVENT_KEY$6;\n  var EVENT_MINIMIZED = \"minimized\" + EVENT_KEY$6;\n  var EVENT_REMOVED$1 = \"removed\" + EVENT_KEY$6;\n  var CLASS_NAME_CARD = 'card';\n  var CLASS_NAME_COLLAPSED$1 = 'collapsed-card';\n  var CLASS_NAME_COLLAPSING = 'collapsing-card';\n  var CLASS_NAME_EXPANDING = 'expanding-card';\n  var CLASS_NAME_WAS_COLLAPSED = 'was-collapsed';\n  var CLASS_NAME_MAXIMIZED = 'maximized-card';\n  var SELECTOR_DATA_REMOVE = '[data-card-widget=\"remove\"]';\n  var SELECTOR_DATA_COLLAPSE = '[data-card-widget=\"collapse\"]';\n  var SELECTOR_DATA_MAXIMIZE = '[data-card-widget=\"maximize\"]';\n  var SELECTOR_CARD = \".\" + CLASS_NAME_CARD;\n  var SELECTOR_CARD_HEADER = '.card-header';\n  var SELECTOR_CARD_BODY = '.card-body';\n  var SELECTOR_CARD_FOOTER = '.card-footer';\n  var Default$b = {\n    animationSpeed: 'normal',\n    collapseTrigger: SELECTOR_DATA_COLLAPSE,\n    removeTrigger: SELECTOR_DATA_REMOVE,\n    maximizeTrigger: SELECTOR_DATA_MAXIMIZE,\n    collapseIcon: 'fa-minus',\n    expandIcon: 'fa-plus',\n    maximizeIcon: 'fa-expand',\n    minimizeIcon: 'fa-compress'\n  };\n\n  var CardWidget = /*#__PURE__*/function () {\n    function CardWidget(element, settings) {\n      this._element = element;\n      this._parent = element.parents(SELECTOR_CARD).first();\n\n      if (element.hasClass(CLASS_NAME_CARD)) {\n        this._parent = element;\n      }\n\n      this._settings = $__default['default'].extend({}, Default$b, settings);\n    }\n\n    var _proto = CardWidget.prototype;\n\n    _proto.collapse = function collapse() {\n      var _this = this;\n\n      this._parent.addClass(CLASS_NAME_COLLAPSING).children(SELECTOR_CARD_BODY + \", \" + SELECTOR_CARD_FOOTER).slideUp(this._settings.animationSpeed, function () {\n        _this._parent.addClass(CLASS_NAME_COLLAPSED$1).removeClass(CLASS_NAME_COLLAPSING);\n      });\n\n      this._parent.find(\"> \" + SELECTOR_CARD_HEADER + \" \" + this._settings.collapseTrigger + \" .\" + this._settings.collapseIcon).addClass(this._settings.expandIcon).removeClass(this._settings.collapseIcon);\n\n      this._element.trigger($__default['default'].Event(EVENT_COLLAPSED$4), this._parent);\n    };\n\n    _proto.expand = function expand() {\n      var _this2 = this;\n\n      this._parent.addClass(CLASS_NAME_EXPANDING).children(SELECTOR_CARD_BODY + \", \" + SELECTOR_CARD_FOOTER).slideDown(this._settings.animationSpeed, function () {\n        _this2._parent.removeClass(CLASS_NAME_COLLAPSED$1).removeClass(CLASS_NAME_EXPANDING);\n      });\n\n      this._parent.find(\"> \" + SELECTOR_CARD_HEADER + \" \" + this._settings.collapseTrigger + \" .\" + this._settings.expandIcon).addClass(this._settings.collapseIcon).removeClass(this._settings.expandIcon);\n\n      this._element.trigger($__default['default'].Event(EVENT_EXPANDED$3), this._parent);\n    };\n\n    _proto.remove = function remove() {\n      this._parent.slideUp();\n\n      this._element.trigger($__default['default'].Event(EVENT_REMOVED$1), this._parent);\n    };\n\n    _proto.toggle = function toggle() {\n      if (this._parent.hasClass(CLASS_NAME_COLLAPSED$1)) {\n        this.expand();\n        return;\n      }\n\n      this.collapse();\n    };\n\n    _proto.maximize = function maximize() {\n      this._parent.find(this._settings.maximizeTrigger + \" .\" + this._settings.maximizeIcon).addClass(this._settings.minimizeIcon).removeClass(this._settings.maximizeIcon);\n\n      this._parent.css({\n        height: this._parent.height(),\n        width: this._parent.width(),\n        transition: 'all .15s'\n      }).delay(150).queue(function () {\n        var $element = $__default['default'](this);\n        $element.addClass(CLASS_NAME_MAXIMIZED);\n        $__default['default']('html').addClass(CLASS_NAME_MAXIMIZED);\n\n        if ($element.hasClass(CLASS_NAME_COLLAPSED$1)) {\n          $element.addClass(CLASS_NAME_WAS_COLLAPSED);\n        }\n\n        $element.dequeue();\n      });\n\n      this._element.trigger($__default['default'].Event(EVENT_MAXIMIZED), this._parent);\n    };\n\n    _proto.minimize = function minimize() {\n      this._parent.find(this._settings.maximizeTrigger + \" .\" + this._settings.minimizeIcon).addClass(this._settings.maximizeIcon).removeClass(this._settings.minimizeIcon);\n\n      this._parent.css('cssText', \"height: \" + this._parent[0].style.height + \" !important; width: \" + this._parent[0].style.width + \" !important; transition: all .15s;\").delay(10).queue(function () {\n        var $element = $__default['default'](this);\n        $element.removeClass(CLASS_NAME_MAXIMIZED);\n        $__default['default']('html').removeClass(CLASS_NAME_MAXIMIZED);\n        $element.css({\n          height: 'inherit',\n          width: 'inherit'\n        });\n\n        if ($element.hasClass(CLASS_NAME_WAS_COLLAPSED)) {\n          $element.removeClass(CLASS_NAME_WAS_COLLAPSED);\n        }\n\n        $element.dequeue();\n      });\n\n      this._element.trigger($__default['default'].Event(EVENT_MINIMIZED), this._parent);\n    };\n\n    _proto.toggleMaximize = function toggleMaximize() {\n      if (this._parent.hasClass(CLASS_NAME_MAXIMIZED)) {\n        this.minimize();\n        return;\n      }\n\n      this.maximize();\n    } // Private\n    ;\n\n    _proto._init = function _init(card) {\n      var _this3 = this;\n\n      this._parent = card;\n      $__default['default'](this).find(this._settings.collapseTrigger).click(function () {\n        _this3.toggle();\n      });\n      $__default['default'](this).find(this._settings.maximizeTrigger).click(function () {\n        _this3.toggleMaximize();\n      });\n      $__default['default'](this).find(this._settings.removeTrigger).click(function () {\n        _this3.remove();\n      });\n    } // Static\n    ;\n\n    CardWidget._jQueryInterface = function _jQueryInterface(config) {\n      var data = $__default['default'](this).data(DATA_KEY$d);\n\n      var _options = $__default['default'].extend({}, Default$b, $__default['default'](this).data());\n\n      if (!data) {\n        data = new CardWidget($__default['default'](this), _options);\n        $__default['default'](this).data(DATA_KEY$d, typeof config === 'string' ? data : config);\n      }\n\n      if (typeof config === 'string' && /collapse|expand|remove|toggle|maximize|minimize|toggleMaximize/.test(config)) {\n        data[config]();\n      } else if (typeof config === 'object') {\n        data._init($__default['default'](this));\n      }\n    };\n\n    return CardWidget;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](document).on('click', SELECTOR_DATA_COLLAPSE, function (event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    CardWidget._jQueryInterface.call($__default['default'](this), 'toggle');\n  });\n  $__default['default'](document).on('click', SELECTOR_DATA_REMOVE, function (event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    CardWidget._jQueryInterface.call($__default['default'](this), 'remove');\n  });\n  $__default['default'](document).on('click', SELECTOR_DATA_MAXIMIZE, function (event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    CardWidget._jQueryInterface.call($__default['default'](this), 'toggleMaximize');\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$d] = CardWidget._jQueryInterface;\n  $__default['default'].fn[NAME$d].Constructor = CardWidget;\n\n  $__default['default'].fn[NAME$d].noConflict = function () {\n    $__default['default'].fn[NAME$d] = JQUERY_NO_CONFLICT$d;\n    return CardWidget._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE ControlSidebar.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$c = 'ControlSidebar';\n  var DATA_KEY$c = 'lte.controlsidebar';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$c;\n  var JQUERY_NO_CONFLICT$c = $__default['default'].fn[NAME$c];\n  var EVENT_COLLAPSED$3 = \"collapsed\" + EVENT_KEY$5;\n  var EVENT_EXPANDED$2 = \"expanded\" + EVENT_KEY$5;\n  var SELECTOR_CONTROL_SIDEBAR = '.control-sidebar';\n  var SELECTOR_CONTROL_SIDEBAR_CONTENT$1 = '.control-sidebar-content';\n  var SELECTOR_DATA_TOGGLE$4 = '[data-widget=\"control-sidebar\"]';\n  var SELECTOR_HEADER$1 = '.main-header';\n  var SELECTOR_FOOTER$1 = '.main-footer';\n  var CLASS_NAME_CONTROL_SIDEBAR_ANIMATE = 'control-sidebar-animate';\n  var CLASS_NAME_CONTROL_SIDEBAR_OPEN$1 = 'control-sidebar-open';\n  var CLASS_NAME_CONTROL_SIDEBAR_SLIDE = 'control-sidebar-slide-open';\n  var CLASS_NAME_LAYOUT_FIXED$1 = 'layout-fixed';\n  var CLASS_NAME_NAVBAR_FIXED = 'layout-navbar-fixed';\n  var CLASS_NAME_NAVBAR_SM_FIXED = 'layout-sm-navbar-fixed';\n  var CLASS_NAME_NAVBAR_MD_FIXED = 'layout-md-navbar-fixed';\n  var CLASS_NAME_NAVBAR_LG_FIXED = 'layout-lg-navbar-fixed';\n  var CLASS_NAME_NAVBAR_XL_FIXED = 'layout-xl-navbar-fixed';\n  var CLASS_NAME_FOOTER_FIXED = 'layout-footer-fixed';\n  var CLASS_NAME_FOOTER_SM_FIXED = 'layout-sm-footer-fixed';\n  var CLASS_NAME_FOOTER_MD_FIXED = 'layout-md-footer-fixed';\n  var CLASS_NAME_FOOTER_LG_FIXED = 'layout-lg-footer-fixed';\n  var CLASS_NAME_FOOTER_XL_FIXED = 'layout-xl-footer-fixed';\n  var Default$a = {\n    controlsidebarSlide: true,\n    scrollbarTheme: 'os-theme-light',\n    scrollbarAutoHide: 'l',\n    target: SELECTOR_CONTROL_SIDEBAR\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var ControlSidebar = /*#__PURE__*/function () {\n    function ControlSidebar(element, config) {\n      this._element = element;\n      this._config = config;\n    } // Public\n\n\n    var _proto = ControlSidebar.prototype;\n\n    _proto.collapse = function collapse() {\n      var $body = $__default['default']('body');\n      var $html = $__default['default']('html');\n      var target = this._config.target; // Show the control sidebar\n\n      if (this._config.controlsidebarSlide) {\n        $html.addClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n        $body.removeClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE).delay(300).queue(function () {\n          $__default['default'](target).hide();\n          $html.removeClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n          $__default['default'](this).dequeue();\n        });\n      } else {\n        $body.removeClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN$1);\n      }\n\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_COLLAPSED$3));\n    };\n\n    _proto.show = function show() {\n      var $body = $__default['default']('body');\n      var $html = $__default['default']('html'); // Collapse the control sidebar\n\n      if (this._config.controlsidebarSlide) {\n        $html.addClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n        $__default['default'](this._config.target).show().delay(10).queue(function () {\n          $body.addClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE).delay(300).queue(function () {\n            $html.removeClass(CLASS_NAME_CONTROL_SIDEBAR_ANIMATE);\n            $__default['default'](this).dequeue();\n          });\n          $__default['default'](this).dequeue();\n        });\n      } else {\n        $body.addClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN$1);\n      }\n\n      this._fixHeight();\n\n      this._fixScrollHeight();\n\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_EXPANDED$2));\n    };\n\n    _proto.toggle = function toggle() {\n      var $body = $__default['default']('body');\n      var shouldClose = $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN$1) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE);\n\n      if (shouldClose) {\n        // Close the control sidebar\n        this.collapse();\n      } else {\n        // Open the control sidebar\n        this.show();\n      }\n    } // Private\n    ;\n\n    _proto._init = function _init() {\n      var _this = this;\n\n      var $body = $__default['default']('body');\n      var shouldNotHideAll = $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN$1) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE);\n\n      if (shouldNotHideAll) {\n        $__default['default'](SELECTOR_CONTROL_SIDEBAR).not(this._config.target).hide();\n        $__default['default'](this._config.target).css('display', 'block');\n      } else {\n        $__default['default'](SELECTOR_CONTROL_SIDEBAR).hide();\n      }\n\n      this._fixHeight();\n\n      this._fixScrollHeight();\n\n      $__default['default'](window).resize(function () {\n        _this._fixHeight();\n\n        _this._fixScrollHeight();\n      });\n      $__default['default'](window).scroll(function () {\n        var $body = $__default['default']('body');\n        var shouldFixHeight = $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN$1) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE);\n\n        if (shouldFixHeight) {\n          _this._fixScrollHeight();\n        }\n      });\n    };\n\n    _proto._isNavbarFixed = function _isNavbarFixed() {\n      var $body = $__default['default']('body');\n      return $body.hasClass(CLASS_NAME_NAVBAR_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_SM_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_MD_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_LG_FIXED) || $body.hasClass(CLASS_NAME_NAVBAR_XL_FIXED);\n    };\n\n    _proto._isFooterFixed = function _isFooterFixed() {\n      var $body = $__default['default']('body');\n      return $body.hasClass(CLASS_NAME_FOOTER_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_SM_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_MD_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_LG_FIXED) || $body.hasClass(CLASS_NAME_FOOTER_XL_FIXED);\n    };\n\n    _proto._fixScrollHeight = function _fixScrollHeight() {\n      var $body = $__default['default']('body');\n      var $controlSidebar = $__default['default'](this._config.target);\n\n      if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED$1)) {\n        return;\n      }\n\n      var heights = {\n        scroll: $__default['default'](document).height(),\n        window: $__default['default'](window).height(),\n        header: $__default['default'](SELECTOR_HEADER$1).outerHeight(),\n        footer: $__default['default'](SELECTOR_FOOTER$1).outerHeight()\n      };\n      var positions = {\n        bottom: Math.abs(heights.window + $__default['default'](window).scrollTop() - heights.scroll),\n        top: $__default['default'](window).scrollTop()\n      };\n      var navbarFixed = this._isNavbarFixed() && $__default['default'](SELECTOR_HEADER$1).css('position') === 'fixed';\n      var footerFixed = this._isFooterFixed() && $__default['default'](SELECTOR_FOOTER$1).css('position') === 'fixed';\n      var $controlsidebarContent = $__default['default'](this._config.target + \", \" + this._config.target + \" \" + SELECTOR_CONTROL_SIDEBAR_CONTENT$1);\n\n      if (positions.top === 0 && positions.bottom === 0) {\n        $controlSidebar.css({\n          bottom: heights.footer,\n          top: heights.header\n        });\n        $controlsidebarContent.css('height', heights.window - (heights.header + heights.footer));\n      } else if (positions.bottom <= heights.footer) {\n        if (footerFixed === false) {\n          var top = heights.header - positions.top;\n          $controlSidebar.css('bottom', heights.footer - positions.bottom).css('top', top >= 0 ? top : 0);\n          $controlsidebarContent.css('height', heights.window - (heights.footer - positions.bottom));\n        } else {\n          $controlSidebar.css('bottom', heights.footer);\n        }\n      } else if (positions.top <= heights.header) {\n        if (navbarFixed === false) {\n          $controlSidebar.css('top', heights.header - positions.top);\n          $controlsidebarContent.css('height', heights.window - (heights.header - positions.top));\n        } else {\n          $controlSidebar.css('top', heights.header);\n        }\n      } else if (navbarFixed === false) {\n        $controlSidebar.css('top', 0);\n        $controlsidebarContent.css('height', heights.window);\n      } else {\n        $controlSidebar.css('top', heights.header);\n      }\n\n      if (footerFixed && navbarFixed) {\n        $controlsidebarContent.css('height', '100%');\n        $controlSidebar.css('height', '');\n      } else if (footerFixed || navbarFixed) {\n        $controlsidebarContent.css('height', '100%');\n        $controlsidebarContent.css('height', '');\n      }\n    };\n\n    _proto._fixHeight = function _fixHeight() {\n      var $body = $__default['default']('body');\n      var $controlSidebar = $__default['default'](this._config.target + \" \" + SELECTOR_CONTROL_SIDEBAR_CONTENT$1);\n\n      if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED$1)) {\n        $controlSidebar.attr('style', '');\n        return;\n      }\n\n      var heights = {\n        window: $__default['default'](window).height(),\n        header: $__default['default'](SELECTOR_HEADER$1).outerHeight(),\n        footer: $__default['default'](SELECTOR_FOOTER$1).outerHeight()\n      };\n      var sidebarHeight = heights.window - heights.header;\n\n      if (this._isFooterFixed() && $__default['default'](SELECTOR_FOOTER$1).css('position') === 'fixed') {\n        sidebarHeight = heights.window - heights.header - heights.footer;\n      }\n\n      $controlSidebar.css('height', sidebarHeight);\n\n      if (typeof $__default['default'].fn.overlayScrollbars !== 'undefined') {\n        $controlSidebar.overlayScrollbars({\n          className: this._config.scrollbarTheme,\n          sizeAutoCapable: true,\n          scrollbars: {\n            autoHide: this._config.scrollbarAutoHide,\n            clickScrolling: true\n          }\n        });\n      }\n    } // Static\n    ;\n\n    ControlSidebar._jQueryInterface = function _jQueryInterface(operation) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$c);\n\n        var _options = $__default['default'].extend({}, Default$a, $__default['default'](this).data());\n\n        if (!data) {\n          data = new ControlSidebar(this, _options);\n          $__default['default'](this).data(DATA_KEY$c, data);\n        }\n\n        if (data[operation] === 'undefined') {\n          throw new Error(operation + \" is not a function\");\n        }\n\n        data[operation]();\n      });\n    };\n\n    return ControlSidebar;\n  }();\n  /**\n   *\n   * Data Api implementation\n   * ====================================================\n   */\n\n\n  $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE$4, function (event) {\n    event.preventDefault();\n\n    ControlSidebar._jQueryInterface.call($__default['default'](this), 'toggle');\n  });\n  $__default['default'](document).ready(function () {\n    ControlSidebar._jQueryInterface.call($__default['default'](SELECTOR_DATA_TOGGLE$4), '_init');\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$c] = ControlSidebar._jQueryInterface;\n  $__default['default'].fn[NAME$c].Constructor = ControlSidebar;\n\n  $__default['default'].fn[NAME$c].noConflict = function () {\n    $__default['default'].fn[NAME$c] = JQUERY_NO_CONFLICT$c;\n    return ControlSidebar._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE DirectChat.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$b = 'DirectChat';\n  var DATA_KEY$b = 'lte.directchat';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$b;\n  var JQUERY_NO_CONFLICT$b = $__default['default'].fn[NAME$b];\n  var EVENT_TOGGLED = \"toggled\" + EVENT_KEY$4;\n  var SELECTOR_DATA_TOGGLE$3 = '[data-widget=\"chat-pane-toggle\"]';\n  var SELECTOR_DIRECT_CHAT = '.direct-chat';\n  var CLASS_NAME_DIRECT_CHAT_OPEN = 'direct-chat-contacts-open';\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var DirectChat = /*#__PURE__*/function () {\n    function DirectChat(element) {\n      this._element = element;\n    }\n\n    var _proto = DirectChat.prototype;\n\n    _proto.toggle = function toggle() {\n      $__default['default'](this._element).parents(SELECTOR_DIRECT_CHAT).first().toggleClass(CLASS_NAME_DIRECT_CHAT_OPEN);\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_TOGGLED));\n    } // Static\n    ;\n\n    DirectChat._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$b);\n\n        if (!data) {\n          data = new DirectChat($__default['default'](this));\n          $__default['default'](this).data(DATA_KEY$b, data);\n        }\n\n        data[config]();\n      });\n    };\n\n    return DirectChat;\n  }();\n  /**\n   *\n   * Data Api implementation\n   * ====================================================\n   */\n\n\n  $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE$3, function (event) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    DirectChat._jQueryInterface.call($__default['default'](this), 'toggle');\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$b] = DirectChat._jQueryInterface;\n  $__default['default'].fn[NAME$b].Constructor = DirectChat;\n\n  $__default['default'].fn[NAME$b].noConflict = function () {\n    $__default['default'].fn[NAME$b] = JQUERY_NO_CONFLICT$b;\n    return DirectChat._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE Dropdown.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$a = 'Dropdown';\n  var DATA_KEY$a = 'lte.dropdown';\n  var JQUERY_NO_CONFLICT$a = $__default['default'].fn[NAME$a];\n  var SELECTOR_NAVBAR = '.navbar';\n  var SELECTOR_DROPDOWN_MENU = '.dropdown-menu';\n  var SELECTOR_DROPDOWN_MENU_ACTIVE = '.dropdown-menu.show';\n  var SELECTOR_DROPDOWN_TOGGLE = '[data-toggle=\"dropdown\"]';\n  var CLASS_NAME_DROPDOWN_RIGHT = 'dropdown-menu-right';\n  var CLASS_NAME_DROPDOWN_SUBMENU = 'dropdown-submenu'; // TODO: this is unused; should be removed along with the extend?\n\n  var Default$9 = {};\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var Dropdown = /*#__PURE__*/function () {\n    function Dropdown(element, config) {\n      this._config = config;\n      this._element = element;\n    } // Public\n\n\n    var _proto = Dropdown.prototype;\n\n    _proto.toggleSubmenu = function toggleSubmenu() {\n      this._element.siblings().show().toggleClass('show');\n\n      if (!this._element.next().hasClass('show')) {\n        this._element.parents(SELECTOR_DROPDOWN_MENU).first().find('.show').removeClass('show').hide();\n      }\n\n      this._element.parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function () {\n        $__default['default']('.dropdown-submenu .show').removeClass('show').hide();\n      });\n    };\n\n    _proto.fixPosition = function fixPosition() {\n      var $element = $__default['default'](SELECTOR_DROPDOWN_MENU_ACTIVE);\n\n      if ($element.length === 0) {\n        return;\n      }\n\n      if ($element.hasClass(CLASS_NAME_DROPDOWN_RIGHT)) {\n        $element.css({\n          left: 'inherit',\n          right: 0\n        });\n      } else {\n        $element.css({\n          left: 0,\n          right: 'inherit'\n        });\n      }\n\n      var offset = $element.offset();\n      var width = $element.width();\n      var visiblePart = $__default['default'](window).width() - offset.left;\n\n      if (offset.left < 0) {\n        $element.css({\n          left: 'inherit',\n          right: offset.left - 5\n        });\n      } else if (visiblePart < width) {\n        $element.css({\n          left: 'inherit',\n          right: 0\n        });\n      }\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$a);\n\n        var _config = $__default['default'].extend({}, Default$9, $__default['default'](this).data());\n\n        if (!data) {\n          data = new Dropdown($__default['default'](this), _config);\n          $__default['default'](this).data(DATA_KEY$a, data);\n        }\n\n        if (config === 'toggleSubmenu' || config === 'fixPosition') {\n          data[config]();\n        }\n      });\n    };\n\n    return Dropdown;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](SELECTOR_DROPDOWN_MENU + \" \" + SELECTOR_DROPDOWN_TOGGLE).on('click', function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($__default['default'](this), 'toggleSubmenu');\n  });\n  $__default['default'](SELECTOR_NAVBAR + \" \" + SELECTOR_DROPDOWN_TOGGLE).on('click', function (event) {\n    event.preventDefault();\n\n    if ($__default['default'](event.target).parent().hasClass(CLASS_NAME_DROPDOWN_SUBMENU)) {\n      return;\n    }\n\n    setTimeout(function () {\n      Dropdown._jQueryInterface.call($__default['default'](this), 'fixPosition');\n    }, 1);\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$a] = Dropdown._jQueryInterface;\n  $__default['default'].fn[NAME$a].Constructor = Dropdown;\n\n  $__default['default'].fn[NAME$a].noConflict = function () {\n    $__default['default'].fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE ExpandableTable.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n    * Constants\n    * ====================================================\n    */\n\n  var NAME$9 = 'ExpandableTable';\n  var DATA_KEY$9 = 'lte.expandableTable';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$9;\n  var JQUERY_NO_CONFLICT$9 = $__default['default'].fn[NAME$9];\n  var EVENT_EXPANDED$1 = \"expanded\" + EVENT_KEY$3;\n  var EVENT_COLLAPSED$2 = \"collapsed\" + EVENT_KEY$3;\n  var SELECTOR_TABLE = '.expandable-table';\n  var SELECTOR_EXPANDABLE_BODY = '.expandable-body';\n  var SELECTOR_DATA_TOGGLE$2 = '[data-widget=\"expandable-table\"]';\n  var SELECTOR_ARIA_ATTR = 'aria-expanded';\n  /**\n    * Class Definition\n    * ====================================================\n    */\n\n  var ExpandableTable = /*#__PURE__*/function () {\n    function ExpandableTable(element, options) {\n      this._options = options;\n      this._element = element;\n    } // Public\n\n\n    var _proto = ExpandableTable.prototype;\n\n    _proto.init = function init() {\n      $__default['default'](SELECTOR_DATA_TOGGLE$2).each(function (_, $header) {\n        var $type = $__default['default']($header).attr(SELECTOR_ARIA_ATTR);\n        var $body = $__default['default']($header).next(SELECTOR_EXPANDABLE_BODY).children().first().children();\n\n        if ($type === 'true') {\n          $body.show();\n        } else if ($type === 'false') {\n          $body.hide();\n          $body.parent().parent().addClass('d-none');\n        }\n      });\n    };\n\n    _proto.toggleRow = function toggleRow() {\n      var $element = this._element;\n      var time = 500;\n      var $type = $element.attr(SELECTOR_ARIA_ATTR);\n      var $body = $element.next(SELECTOR_EXPANDABLE_BODY).children().first().children();\n      $body.stop();\n\n      if ($type === 'true') {\n        $body.slideUp(time, function () {\n          $element.next(SELECTOR_EXPANDABLE_BODY).addClass('d-none');\n        });\n        $element.attr(SELECTOR_ARIA_ATTR, 'false');\n        $element.trigger($__default['default'].Event(EVENT_COLLAPSED$2));\n      } else if ($type === 'false') {\n        $element.next(SELECTOR_EXPANDABLE_BODY).removeClass('d-none');\n        $body.slideDown(time);\n        $element.attr(SELECTOR_ARIA_ATTR, 'true');\n        $element.trigger($__default['default'].Event(EVENT_EXPANDED$1));\n      }\n    } // Static\n    ;\n\n    ExpandableTable._jQueryInterface = function _jQueryInterface(operation) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$9);\n\n        if (!data) {\n          data = new ExpandableTable($__default['default'](this));\n          $__default['default'](this).data(DATA_KEY$9, data);\n        }\n\n        if (typeof operation === 'string' && /init|toggleRow/.test(operation)) {\n          data[operation]();\n        }\n      });\n    };\n\n    return ExpandableTable;\n  }();\n  /**\n    * Data API\n    * ====================================================\n    */\n\n\n  $__default['default'](SELECTOR_TABLE).ready(function () {\n    ExpandableTable._jQueryInterface.call($__default['default'](this), 'init');\n  });\n  $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE$2, function () {\n    ExpandableTable._jQueryInterface.call($__default['default'](this), 'toggleRow');\n  });\n  /**\n    * jQuery API\n    * ====================================================\n    */\n\n  $__default['default'].fn[NAME$9] = ExpandableTable._jQueryInterface;\n  $__default['default'].fn[NAME$9].Constructor = ExpandableTable;\n\n  $__default['default'].fn[NAME$9].noConflict = function () {\n    $__default['default'].fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return ExpandableTable._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE Fullscreen.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$8 = 'Fullscreen';\n  var DATA_KEY$8 = 'lte.fullscreen';\n  var JQUERY_NO_CONFLICT$8 = $__default['default'].fn[NAME$8];\n  var SELECTOR_DATA_WIDGET$2 = '[data-widget=\"fullscreen\"]';\n  var SELECTOR_ICON = SELECTOR_DATA_WIDGET$2 + \" i\";\n  var Default$8 = {\n    minimizeIcon: 'fa-compress-arrows-alt',\n    maximizeIcon: 'fa-expand-arrows-alt'\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var Fullscreen = /*#__PURE__*/function () {\n    function Fullscreen(_element, _options) {\n      this.element = _element;\n      this.options = $__default['default'].extend({}, Default$8, _options);\n    } // Public\n\n\n    var _proto = Fullscreen.prototype;\n\n    _proto.toggle = function toggle() {\n      if (document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement) {\n        this.windowed();\n      } else {\n        this.fullscreen();\n      }\n    };\n\n    _proto.fullscreen = function fullscreen() {\n      if (document.documentElement.requestFullscreen) {\n        document.documentElement.requestFullscreen();\n      } else if (document.documentElement.webkitRequestFullscreen) {\n        document.documentElement.webkitRequestFullscreen();\n      } else if (document.documentElement.msRequestFullscreen) {\n        document.documentElement.msRequestFullscreen();\n      }\n\n      $__default['default'](SELECTOR_ICON).removeClass(this.options.maximizeIcon).addClass(this.options.minimizeIcon);\n    };\n\n    _proto.windowed = function windowed() {\n      if (document.exitFullscreen) {\n        document.exitFullscreen();\n      } else if (document.webkitExitFullscreen) {\n        document.webkitExitFullscreen();\n      } else if (document.msExitFullscreen) {\n        document.msExitFullscreen();\n      }\n\n      $__default['default'](SELECTOR_ICON).removeClass(this.options.minimizeIcon).addClass(this.options.maximizeIcon);\n    } // Static\n    ;\n\n    Fullscreen._jQueryInterface = function _jQueryInterface(config) {\n      var data = $__default['default'](this).data(DATA_KEY$8);\n\n      if (!data) {\n        data = $__default['default'](this).data();\n      }\n\n      var _options = $__default['default'].extend({}, Default$8, typeof config === 'object' ? config : data);\n\n      var plugin = new Fullscreen($__default['default'](this), _options);\n      $__default['default'](this).data(DATA_KEY$8, typeof config === 'object' ? config : data);\n\n      if (typeof config === 'string' && /toggle|fullscreen|windowed/.test(config)) {\n        plugin[config]();\n      } else {\n        plugin.init();\n      }\n    };\n\n    return Fullscreen;\n  }();\n  /**\n    * Data API\n    * ====================================================\n    */\n\n\n  $__default['default'](document).on('click', SELECTOR_DATA_WIDGET$2, function () {\n    Fullscreen._jQueryInterface.call($__default['default'](this), 'toggle');\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$8] = Fullscreen._jQueryInterface;\n  $__default['default'].fn[NAME$8].Constructor = Fullscreen;\n\n  $__default['default'].fn[NAME$8].noConflict = function () {\n    $__default['default'].fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return Fullscreen._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE IFrame.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$7 = 'IFrame';\n  var DATA_KEY$7 = 'lte.iframe';\n  var JQUERY_NO_CONFLICT$7 = $__default['default'].fn[NAME$7];\n  var SELECTOR_DATA_TOGGLE$1 = '[data-widget=\"iframe\"]';\n  var SELECTOR_DATA_TOGGLE_CLOSE = '[data-widget=\"iframe-close\"]';\n  var SELECTOR_DATA_TOGGLE_SCROLL_LEFT = '[data-widget=\"iframe-scrollleft\"]';\n  var SELECTOR_DATA_TOGGLE_SCROLL_RIGHT = '[data-widget=\"iframe-scrollright\"]';\n  var SELECTOR_DATA_TOGGLE_FULLSCREEN = '[data-widget=\"iframe-fullscreen\"]';\n  var SELECTOR_CONTENT_WRAPPER = '.content-wrapper';\n  var SELECTOR_CONTENT_IFRAME = SELECTOR_CONTENT_WRAPPER + \" iframe\";\n  var SELECTOR_TAB_NAV = SELECTOR_DATA_TOGGLE$1 + \".iframe-mode .nav\";\n  var SELECTOR_TAB_NAVBAR_NAV = SELECTOR_DATA_TOGGLE$1 + \".iframe-mode .navbar-nav\";\n  var SELECTOR_TAB_NAVBAR_NAV_ITEM = SELECTOR_TAB_NAVBAR_NAV + \" .nav-item\";\n  var SELECTOR_TAB_NAVBAR_NAV_LINK = SELECTOR_TAB_NAVBAR_NAV + \" .nav-link\";\n  var SELECTOR_TAB_CONTENT = SELECTOR_DATA_TOGGLE$1 + \".iframe-mode .tab-content\";\n  var SELECTOR_TAB_EMPTY = SELECTOR_TAB_CONTENT + \" .tab-empty\";\n  var SELECTOR_TAB_LOADING = SELECTOR_TAB_CONTENT + \" .tab-loading\";\n  var SELECTOR_TAB_PANE = SELECTOR_TAB_CONTENT + \" .tab-pane\";\n  var SELECTOR_SIDEBAR_MENU_ITEM = '.main-sidebar .nav-item > a.nav-link';\n  var SELECTOR_SIDEBAR_SEARCH_ITEM = '.sidebar-search-results .list-group-item';\n  var SELECTOR_HEADER_MENU_ITEM = '.main-header .nav-item a.nav-link';\n  var SELECTOR_HEADER_DROPDOWN_ITEM = '.main-header a.dropdown-item';\n  var CLASS_NAME_IFRAME_MODE = 'iframe-mode';\n  var CLASS_NAME_FULLSCREEN_MODE = 'iframe-mode-fullscreen';\n  var Default$7 = {\n    onTabClick: function onTabClick(item) {\n      return item;\n    },\n    onTabChanged: function onTabChanged(item) {\n      return item;\n    },\n    onTabCreated: function onTabCreated(item) {\n      return item;\n    },\n    autoIframeMode: true,\n    autoItemActive: true,\n    autoShowNewTab: true,\n    allowDuplicates: false,\n    loadingScreen: true,\n    useNavbarItems: true,\n    scrollOffset: 40,\n    scrollBehaviorSwap: false,\n    iconMaximize: 'fa-expand',\n    iconMinimize: 'fa-compress'\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var IFrame = /*#__PURE__*/function () {\n    function IFrame(element, config) {\n      this._config = config;\n      this._element = element;\n\n      this._init();\n    } // Public\n\n\n    var _proto = IFrame.prototype;\n\n    _proto.onTabClick = function onTabClick(item) {\n      this._config.onTabClick(item);\n    };\n\n    _proto.onTabChanged = function onTabChanged(item) {\n      this._config.onTabChanged(item);\n    };\n\n    _proto.onTabCreated = function onTabCreated(item) {\n      this._config.onTabCreated(item);\n    };\n\n    _proto.createTab = function createTab(title, link, uniqueName, autoOpen) {\n      var _this = this;\n\n      var tabId = \"panel-\" + uniqueName;\n      var navId = \"tab-\" + uniqueName;\n\n      if (this._config.allowDuplicates) {\n        tabId += \"-\" + Math.floor(Math.random() * 1000);\n        navId += \"-\" + Math.floor(Math.random() * 1000);\n      }\n\n      var newNavItem = \"<li class=\\\"nav-item\\\" role=\\\"presentation\\\"><a href=\\\"#\\\" class=\\\"btn-iframe-close\\\" data-widget=\\\"iframe-close\\\" data-type=\\\"only-this\\\"><i class=\\\"fas fa-times\\\"></i></a><a class=\\\"nav-link\\\" data-toggle=\\\"row\\\" id=\\\"\" + navId + \"\\\" href=\\\"#\" + tabId + \"\\\" role=\\\"tab\\\" aria-controls=\\\"\" + tabId + \"\\\" aria-selected=\\\"false\\\">\" + title + \"</a></li>\";\n      $__default['default'](SELECTOR_TAB_NAVBAR_NAV).append(unescape(escape(newNavItem)));\n      var newTabItem = \"<div class=\\\"tab-pane fade\\\" id=\\\"\" + tabId + \"\\\" role=\\\"tabpanel\\\" aria-labelledby=\\\"\" + navId + \"\\\"><iframe src=\\\"\" + link + \"\\\"></iframe></div>\";\n      $__default['default'](SELECTOR_TAB_CONTENT).append(unescape(escape(newTabItem)));\n\n      if (autoOpen) {\n        if (this._config.loadingScreen) {\n          var $loadingScreen = $__default['default'](SELECTOR_TAB_LOADING);\n          $loadingScreen.fadeIn();\n          $__default['default'](tabId + \" iframe\").ready(function () {\n            if (typeof _this._config.loadingScreen === 'number') {\n              _this.switchTab(\"#\" + navId);\n\n              setTimeout(function () {\n                $loadingScreen.fadeOut();\n              }, _this._config.loadingScreen);\n            } else {\n              _this.switchTab(\"#\" + navId);\n\n              $loadingScreen.fadeOut();\n            }\n          });\n        } else {\n          this.switchTab(\"#\" + navId);\n        }\n      }\n\n      this.onTabCreated($__default['default'](\"#\" + navId));\n    };\n\n    _proto.openTabSidebar = function openTabSidebar(item, autoOpen) {\n      if (autoOpen === void 0) {\n        autoOpen = this._config.autoShowNewTab;\n      }\n\n      var $item = $__default['default'](item).clone();\n\n      if ($item.attr('href') === undefined) {\n        $item = $__default['default'](item).parent('a').clone();\n      }\n\n      $item.find('.right, .search-path').remove();\n      var title = $item.find('p').text();\n\n      if (title === '') {\n        title = $item.text();\n      }\n\n      var link = $item.attr('href');\n\n      if (link === '#' || link === '' || link === undefined) {\n        return;\n      }\n\n      var uniqueName = link.replace('./', '').replace(/[\"&'./:=?[\\]]/gi, '-').replace(/(--)/gi, '');\n      var navId = \"tab-\" + uniqueName;\n\n      if (!this._config.allowDuplicates && $__default['default'](\"#\" + navId).length > 0) {\n        return this.switchTab(\"#\" + navId);\n      }\n\n      if (!this._config.allowDuplicates && $__default['default'](\"#\" + navId).length === 0 || this._config.allowDuplicates) {\n        this.createTab(title, link, uniqueName, autoOpen);\n      }\n    };\n\n    _proto.switchTab = function switchTab(item) {\n      var $item = $__default['default'](item);\n      var tabId = $item.attr('href');\n      $__default['default'](SELECTOR_TAB_EMPTY).hide();\n      $__default['default'](SELECTOR_TAB_NAVBAR_NAV + \" .active\").tab('dispose').removeClass('active');\n\n      this._fixHeight();\n\n      $item.tab('show');\n      $item.parents('li').addClass('active');\n      this.onTabChanged($item);\n\n      if (this._config.autoItemActive) {\n        this._setItemActive($__default['default'](tabId + \" iframe\").attr('src'));\n      }\n    };\n\n    _proto.removeActiveTab = function removeActiveTab(type, element) {\n      if (type == 'all') {\n        $__default['default'](SELECTOR_TAB_NAVBAR_NAV_ITEM).remove();\n        $__default['default'](SELECTOR_TAB_PANE).remove();\n        $__default['default'](SELECTOR_TAB_EMPTY).show();\n      } else if (type == 'all-other') {\n        $__default['default'](SELECTOR_TAB_NAVBAR_NAV_ITEM + \":not(.active)\").remove();\n        $__default['default'](SELECTOR_TAB_PANE + \":not(.active)\").remove();\n      } else if (type == 'only-this') {\n        var $navClose = $__default['default'](element);\n        var $navItem = $navClose.parent('.nav-item');\n        var $navItemParent = $navItem.parent();\n        var navItemIndex = $navItem.index();\n        var tabId = $navClose.siblings('.nav-link').attr('aria-controls');\n        $navItem.remove();\n        $__default['default'](\"#\" + tabId).remove();\n\n        if ($__default['default'](SELECTOR_TAB_CONTENT).children().length == $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).length) {\n          $__default['default'](SELECTOR_TAB_EMPTY).show();\n        } else {\n          var prevNavItemIndex = navItemIndex - 1;\n          this.switchTab($navItemParent.children().eq(prevNavItemIndex).find('a.nav-link'));\n        }\n      } else {\n        var _$navItem = $__default['default'](SELECTOR_TAB_NAVBAR_NAV_ITEM + \".active\");\n\n        var _$navItemParent = _$navItem.parent();\n\n        var _navItemIndex = _$navItem.index();\n\n        _$navItem.remove();\n\n        $__default['default'](SELECTOR_TAB_PANE + \".active\").remove();\n\n        if ($__default['default'](SELECTOR_TAB_CONTENT).children().length == $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).length) {\n          $__default['default'](SELECTOR_TAB_EMPTY).show();\n        } else {\n          var _prevNavItemIndex = _navItemIndex - 1;\n\n          this.switchTab(_$navItemParent.children().eq(_prevNavItemIndex).find('a.nav-link'));\n        }\n      }\n    };\n\n    _proto.toggleFullscreen = function toggleFullscreen() {\n      if ($__default['default']('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) {\n        $__default['default'](SELECTOR_DATA_TOGGLE_FULLSCREEN + \" i\").removeClass(this._config.iconMinimize).addClass(this._config.iconMaximize);\n        $__default['default']('body').removeClass(CLASS_NAME_FULLSCREEN_MODE);\n        $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).height('auto');\n        $__default['default'](SELECTOR_CONTENT_WRAPPER).height('auto');\n        $__default['default'](SELECTOR_CONTENT_IFRAME).height('auto');\n      } else {\n        $__default['default'](SELECTOR_DATA_TOGGLE_FULLSCREEN + \" i\").removeClass(this._config.iconMaximize).addClass(this._config.iconMinimize);\n        $__default['default']('body').addClass(CLASS_NAME_FULLSCREEN_MODE);\n      }\n\n      $__default['default'](window).trigger('resize');\n\n      this._fixHeight(true);\n    } // Private\n    ;\n\n    _proto._init = function _init() {\n      if (window.frameElement && this._config.autoIframeMode) {\n        $__default['default']('body').addClass(CLASS_NAME_IFRAME_MODE);\n      } else if ($__default['default'](SELECTOR_CONTENT_WRAPPER).hasClass(CLASS_NAME_IFRAME_MODE)) {\n        if ($__default['default'](SELECTOR_TAB_CONTENT).children().length > 2) {\n          var $el = $__default['default'](SELECTOR_TAB_PANE + \":first-child\");\n          $el.show();\n\n          this._setItemActive($el.find('iframe').attr('src'));\n        }\n\n        this._setupListeners();\n\n        this._fixHeight(true);\n      }\n    };\n\n    _proto._navScroll = function _navScroll(offset) {\n      var leftPos = $__default['default'](SELECTOR_TAB_NAVBAR_NAV).scrollLeft();\n      $__default['default'](SELECTOR_TAB_NAVBAR_NAV).animate({\n        scrollLeft: leftPos + offset\n      }, 250, 'linear');\n    };\n\n    _proto._setupListeners = function _setupListeners() {\n      var _this2 = this;\n\n      $__default['default'](window).on('resize', function () {\n        setTimeout(function () {\n          _this2._fixHeight();\n        }, 1);\n      });\n      $__default['default'](document).on('click', SELECTOR_SIDEBAR_MENU_ITEM + \", \" + SELECTOR_SIDEBAR_SEARCH_ITEM, function (e) {\n        e.preventDefault();\n\n        _this2.openTabSidebar(e.target);\n      });\n\n      if (this._config.useNavbarItems) {\n        $__default['default'](document).on('click', SELECTOR_HEADER_MENU_ITEM + \", \" + SELECTOR_HEADER_DROPDOWN_ITEM, function (e) {\n          e.preventDefault();\n\n          _this2.openTabSidebar(e.target);\n        });\n      }\n\n      $__default['default'](document).on('click', SELECTOR_TAB_NAVBAR_NAV_LINK, function (e) {\n        e.preventDefault();\n\n        _this2.onTabClick(e.target);\n\n        _this2.switchTab(e.target);\n      });\n      $__default['default'](document).on('click', SELECTOR_TAB_NAVBAR_NAV_LINK, function (e) {\n        e.preventDefault();\n\n        _this2.onTabClick(e.target);\n\n        _this2.switchTab(e.target);\n      });\n      $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE_CLOSE, function (e) {\n        e.preventDefault();\n        var target = e.target;\n\n        if (target.nodeName == 'I') {\n          target = e.target.offsetParent;\n        }\n\n        _this2.removeActiveTab(target.attributes['data-type'] ? target.attributes['data-type'].nodeValue : null, target);\n      });\n      $__default['default'](document).on('click', SELECTOR_DATA_TOGGLE_FULLSCREEN, function (e) {\n        e.preventDefault();\n\n        _this2.toggleFullscreen();\n      });\n      var mousedown = false;\n      var mousedownInterval = null;\n      $__default['default'](document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_LEFT, function (e) {\n        e.preventDefault();\n        clearInterval(mousedownInterval);\n        var scrollOffset = _this2._config.scrollOffset;\n\n        if (!_this2._config.scrollBehaviorSwap) {\n          scrollOffset = -scrollOffset;\n        }\n\n        mousedown = true;\n\n        _this2._navScroll(scrollOffset);\n\n        mousedownInterval = setInterval(function () {\n          _this2._navScroll(scrollOffset);\n        }, 250);\n      });\n      $__default['default'](document).on('mousedown', SELECTOR_DATA_TOGGLE_SCROLL_RIGHT, function (e) {\n        e.preventDefault();\n        clearInterval(mousedownInterval);\n        var scrollOffset = _this2._config.scrollOffset;\n\n        if (_this2._config.scrollBehaviorSwap) {\n          scrollOffset = -scrollOffset;\n        }\n\n        mousedown = true;\n\n        _this2._navScroll(scrollOffset);\n\n        mousedownInterval = setInterval(function () {\n          _this2._navScroll(scrollOffset);\n        }, 250);\n      });\n      $__default['default'](document).on('mouseup', function () {\n        if (mousedown) {\n          mousedown = false;\n          clearInterval(mousedownInterval);\n          mousedownInterval = null;\n        }\n      });\n    };\n\n    _proto._setItemActive = function _setItemActive(href) {\n      $__default['default'](SELECTOR_SIDEBAR_MENU_ITEM + \", \" + SELECTOR_HEADER_DROPDOWN_ITEM).removeClass('active');\n      $__default['default'](SELECTOR_HEADER_MENU_ITEM).parent().removeClass('active');\n      var $headerMenuItem = $__default['default'](SELECTOR_HEADER_MENU_ITEM + \"[href$=\\\"\" + href + \"\\\"]\");\n      var $headerDropdownItem = $__default['default'](SELECTOR_HEADER_DROPDOWN_ITEM + \"[href$=\\\"\" + href + \"\\\"]\");\n      var $sidebarMenuItem = $__default['default'](SELECTOR_SIDEBAR_MENU_ITEM + \"[href$=\\\"\" + href + \"\\\"]\");\n      $headerMenuItem.each(function (i, e) {\n        $__default['default'](e).parent().addClass('active');\n      });\n      $headerDropdownItem.each(function (i, e) {\n        $__default['default'](e).addClass('active');\n      });\n      $sidebarMenuItem.each(function (i, e) {\n        $__default['default'](e).addClass('active');\n        $__default['default'](e).parents('.nav-treeview').prevAll('.nav-link').addClass('active');\n      });\n    };\n\n    _proto._fixHeight = function _fixHeight(tabEmpty) {\n      if (tabEmpty === void 0) {\n        tabEmpty = false;\n      }\n\n      if ($__default['default']('body').hasClass(CLASS_NAME_FULLSCREEN_MODE)) {\n        var windowHeight = $__default['default'](window).height();\n        var navbarHeight = $__default['default'](SELECTOR_TAB_NAV).outerHeight();\n        $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING + \", \" + SELECTOR_CONTENT_IFRAME).height(windowHeight - navbarHeight);\n        $__default['default'](SELECTOR_CONTENT_WRAPPER).height(windowHeight);\n      } else {\n        var contentWrapperHeight = parseFloat($__default['default'](SELECTOR_CONTENT_WRAPPER).css('height'));\n\n        var _navbarHeight = $__default['default'](SELECTOR_TAB_NAV).outerHeight();\n\n        if (tabEmpty == true) {\n          setTimeout(function () {\n            $__default['default'](SELECTOR_TAB_EMPTY + \", \" + SELECTOR_TAB_LOADING).height(contentWrapperHeight - _navbarHeight);\n          }, 50);\n        } else {\n          $__default['default'](SELECTOR_CONTENT_IFRAME).height(contentWrapperHeight - _navbarHeight);\n        }\n      }\n    } // Static\n    ;\n\n    IFrame._jQueryInterface = function _jQueryInterface(operation) {\n      var data = $__default['default'](this).data(DATA_KEY$7);\n\n      var _options = $__default['default'].extend({}, Default$7, $__default['default'](this).data());\n\n      if (!data) {\n        data = new IFrame(this, _options);\n        $__default['default'](this).data(DATA_KEY$7, data);\n      }\n\n      if (typeof operation === 'string' && /createTab|openTabSidebar|switchTab|removeActiveTab/.test(operation)) {\n        var _data;\n\n        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        (_data = data)[operation].apply(_data, args);\n      }\n    };\n\n    return IFrame;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](window).on('load', function () {\n    IFrame._jQueryInterface.call($__default['default'](SELECTOR_DATA_TOGGLE$1));\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$7] = IFrame._jQueryInterface;\n  $__default['default'].fn[NAME$7].Constructor = IFrame;\n\n  $__default['default'].fn[NAME$7].noConflict = function () {\n    $__default['default'].fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return IFrame._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE Layout.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$6 = 'Layout';\n  var DATA_KEY$6 = 'lte.layout';\n  var JQUERY_NO_CONFLICT$6 = $__default['default'].fn[NAME$6];\n  var SELECTOR_HEADER = '.main-header';\n  var SELECTOR_MAIN_SIDEBAR = '.main-sidebar';\n  var SELECTOR_SIDEBAR$1 = '.main-sidebar .sidebar';\n  var SELECTOR_CONTENT = '.content-wrapper';\n  var SELECTOR_CONTROL_SIDEBAR_CONTENT = '.control-sidebar-content';\n  var SELECTOR_CONTROL_SIDEBAR_BTN = '[data-widget=\"control-sidebar\"]';\n  var SELECTOR_FOOTER = '.main-footer';\n  var SELECTOR_PUSHMENU_BTN = '[data-widget=\"pushmenu\"]';\n  var SELECTOR_LOGIN_BOX = '.login-box';\n  var SELECTOR_REGISTER_BOX = '.register-box';\n  var SELECTOR_PRELOADER = '.preloader';\n  var CLASS_NAME_SIDEBAR_COLLAPSED$1 = 'sidebar-collapse';\n  var CLASS_NAME_SIDEBAR_FOCUSED = 'sidebar-focused';\n  var CLASS_NAME_LAYOUT_FIXED = 'layout-fixed';\n  var CLASS_NAME_CONTROL_SIDEBAR_SLIDE_OPEN = 'control-sidebar-slide-open';\n  var CLASS_NAME_CONTROL_SIDEBAR_OPEN = 'control-sidebar-open';\n  var Default$6 = {\n    scrollbarTheme: 'os-theme-light',\n    scrollbarAutoHide: 'l',\n    panelAutoHeight: true,\n    panelAutoHeightMode: 'min-height',\n    preloadDuration: 200,\n    loginRegisterAutoHeight: true\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var Layout = /*#__PURE__*/function () {\n    function Layout(element, config) {\n      this._config = config;\n      this._element = element;\n    } // Public\n\n\n    var _proto = Layout.prototype;\n\n    _proto.fixLayoutHeight = function fixLayoutHeight(extra) {\n      if (extra === void 0) {\n        extra = null;\n      }\n\n      var $body = $__default['default']('body');\n      var controlSidebar = 0;\n\n      if ($body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_SLIDE_OPEN) || $body.hasClass(CLASS_NAME_CONTROL_SIDEBAR_OPEN) || extra === 'control_sidebar') {\n        controlSidebar = $__default['default'](SELECTOR_CONTROL_SIDEBAR_CONTENT).outerHeight();\n      }\n\n      var heights = {\n        window: $__default['default'](window).height(),\n        header: $__default['default'](SELECTOR_HEADER).length > 0 ? $__default['default'](SELECTOR_HEADER).outerHeight() : 0,\n        footer: $__default['default'](SELECTOR_FOOTER).length > 0 ? $__default['default'](SELECTOR_FOOTER).outerHeight() : 0,\n        sidebar: $__default['default'](SELECTOR_SIDEBAR$1).length > 0 ? $__default['default'](SELECTOR_SIDEBAR$1).height() : 0,\n        controlSidebar: controlSidebar\n      };\n\n      var max = this._max(heights);\n\n      var offset = this._config.panelAutoHeight;\n\n      if (offset === true) {\n        offset = 0;\n      }\n\n      var $contentSelector = $__default['default'](SELECTOR_CONTENT);\n\n      if (offset !== false) {\n        if (max === heights.controlSidebar) {\n          $contentSelector.css(this._config.panelAutoHeightMode, max + offset);\n        } else if (max === heights.window) {\n          $contentSelector.css(this._config.panelAutoHeightMode, max + offset - heights.header - heights.footer);\n        } else {\n          $contentSelector.css(this._config.panelAutoHeightMode, max + offset - heights.header);\n        }\n\n        if (this._isFooterFixed()) {\n          $contentSelector.css(this._config.panelAutoHeightMode, parseFloat($contentSelector.css(this._config.panelAutoHeightMode)) + heights.footer);\n        }\n      }\n\n      if (!$body.hasClass(CLASS_NAME_LAYOUT_FIXED)) {\n        return;\n      }\n\n      if (typeof $__default['default'].fn.overlayScrollbars !== 'undefined') {\n        $__default['default'](SELECTOR_SIDEBAR$1).overlayScrollbars({\n          className: this._config.scrollbarTheme,\n          sizeAutoCapable: true,\n          scrollbars: {\n            autoHide: this._config.scrollbarAutoHide,\n            clickScrolling: true\n          }\n        });\n      } else {\n        $__default['default'](SELECTOR_SIDEBAR$1).css('overflow-y', 'auto');\n      }\n    };\n\n    _proto.fixLoginRegisterHeight = function fixLoginRegisterHeight() {\n      var $body = $__default['default']('body');\n      var $selector = $__default['default'](SELECTOR_LOGIN_BOX + \", \" + SELECTOR_REGISTER_BOX);\n\n      if ($selector.length === 0) {\n        $body.css('height', 'auto');\n        $__default['default']('html').css('height', 'auto');\n      } else {\n        var boxHeight = $selector.height();\n\n        if ($body.css(this._config.panelAutoHeightMode) !== boxHeight) {\n          $body.css(this._config.panelAutoHeightMode, boxHeight);\n        }\n      }\n    } // Private\n    ;\n\n    _proto._init = function _init() {\n      var _this = this;\n\n      // Activate layout height watcher\n      this.fixLayoutHeight();\n\n      if (this._config.loginRegisterAutoHeight === true) {\n        this.fixLoginRegisterHeight();\n      } else if (this._config.loginRegisterAutoHeight === parseInt(this._config.loginRegisterAutoHeight, 10)) {\n        setInterval(this.fixLoginRegisterHeight, this._config.loginRegisterAutoHeight);\n      }\n\n      $__default['default'](SELECTOR_SIDEBAR$1).on('collapsed.lte.treeview expanded.lte.treeview', function () {\n        _this.fixLayoutHeight();\n      });\n      $__default['default'](SELECTOR_MAIN_SIDEBAR).on('mouseenter mouseleave', function () {\n        if ($__default['default']('body').hasClass(CLASS_NAME_SIDEBAR_COLLAPSED$1)) {\n          _this.fixLayoutHeight();\n        }\n      });\n      $__default['default'](SELECTOR_PUSHMENU_BTN).on('collapsed.lte.pushmenu shown.lte.pushmenu', function () {\n        setTimeout(function () {\n          _this.fixLayoutHeight();\n        }, 300);\n      });\n      $__default['default'](SELECTOR_CONTROL_SIDEBAR_BTN).on('collapsed.lte.controlsidebar', function () {\n        _this.fixLayoutHeight();\n      }).on('expanded.lte.controlsidebar', function () {\n        _this.fixLayoutHeight('control_sidebar');\n      });\n      $__default['default'](window).resize(function () {\n        _this.fixLayoutHeight();\n      });\n      setTimeout(function () {\n        $__default['default']('body.hold-transition').removeClass('hold-transition');\n      }, 50);\n      setTimeout(function () {\n        var $preloader = $__default['default'](SELECTOR_PRELOADER);\n\n        if ($preloader) {\n          $preloader.css('height', 0);\n          setTimeout(function () {\n            $preloader.children().hide();\n          }, 200);\n        }\n      }, this._config.preloadDuration);\n    };\n\n    _proto._max = function _max(numbers) {\n      // Calculate the maximum number in a list\n      var max = 0;\n      Object.keys(numbers).forEach(function (key) {\n        if (numbers[key] > max) {\n          max = numbers[key];\n        }\n      });\n      return max;\n    };\n\n    _proto._isFooterFixed = function _isFooterFixed() {\n      return $__default['default'](SELECTOR_FOOTER).css('position') === 'fixed';\n    } // Static\n    ;\n\n    Layout._jQueryInterface = function _jQueryInterface(config) {\n      if (config === void 0) {\n        config = '';\n      }\n\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$6);\n\n        var _options = $__default['default'].extend({}, Default$6, $__default['default'](this).data());\n\n        if (!data) {\n          data = new Layout($__default['default'](this), _options);\n          $__default['default'](this).data(DATA_KEY$6, data);\n        }\n\n        if (config === 'init' || config === '') {\n          data._init();\n        } else if (config === 'fixLayoutHeight' || config === 'fixLoginRegisterHeight') {\n          data[config]();\n        }\n      });\n    };\n\n    return Layout;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](window).on('load', function () {\n    Layout._jQueryInterface.call($__default['default']('body'));\n  });\n  $__default['default'](SELECTOR_SIDEBAR$1 + \" a\").on('focusin', function () {\n    $__default['default'](SELECTOR_MAIN_SIDEBAR).addClass(CLASS_NAME_SIDEBAR_FOCUSED);\n  }).on('focusout', function () {\n    $__default['default'](SELECTOR_MAIN_SIDEBAR).removeClass(CLASS_NAME_SIDEBAR_FOCUSED);\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$6] = Layout._jQueryInterface;\n  $__default['default'].fn[NAME$6].Constructor = Layout;\n\n  $__default['default'].fn[NAME$6].noConflict = function () {\n    $__default['default'].fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Layout._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE PushMenu.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$5 = 'PushMenu';\n  var DATA_KEY$5 = 'lte.pushmenu';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$5;\n  var JQUERY_NO_CONFLICT$5 = $__default['default'].fn[NAME$5];\n  var EVENT_COLLAPSED$1 = \"collapsed\" + EVENT_KEY$2;\n  var EVENT_SHOWN = \"shown\" + EVENT_KEY$2;\n  var SELECTOR_TOGGLE_BUTTON$1 = '[data-widget=\"pushmenu\"]';\n  var SELECTOR_BODY = 'body';\n  var SELECTOR_OVERLAY = '#sidebar-overlay';\n  var SELECTOR_WRAPPER = '.wrapper';\n  var CLASS_NAME_COLLAPSED = 'sidebar-collapse';\n  var CLASS_NAME_OPEN$3 = 'sidebar-open';\n  var CLASS_NAME_IS_OPENING$1 = 'sidebar-is-opening';\n  var CLASS_NAME_CLOSED = 'sidebar-closed';\n  var Default$5 = {\n    autoCollapseSize: 992,\n    enableRemember: false,\n    noTransitionAfterReload: true\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var PushMenu = /*#__PURE__*/function () {\n    function PushMenu(element, options) {\n      this._element = element;\n      this._options = $__default['default'].extend({}, Default$5, options);\n\n      if ($__default['default'](SELECTOR_OVERLAY).length === 0) {\n        this._addOverlay();\n      }\n\n      this._init();\n    } // Public\n\n\n    var _proto = PushMenu.prototype;\n\n    _proto.expand = function expand() {\n      var $bodySelector = $__default['default'](SELECTOR_BODY);\n\n      if (this._options.autoCollapseSize && $__default['default'](window).width() <= this._options.autoCollapseSize) {\n        $bodySelector.addClass(CLASS_NAME_OPEN$3);\n      }\n\n      $bodySelector.addClass(CLASS_NAME_IS_OPENING$1).removeClass(CLASS_NAME_COLLAPSED + \" \" + CLASS_NAME_CLOSED).delay(50).queue(function () {\n        $bodySelector.removeClass(CLASS_NAME_IS_OPENING$1);\n        $__default['default'](this).dequeue();\n      });\n\n      if (this._options.enableRemember) {\n        localStorage.setItem(\"remember\" + EVENT_KEY$2, CLASS_NAME_OPEN$3);\n      }\n\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_SHOWN));\n    };\n\n    _proto.collapse = function collapse() {\n      var $bodySelector = $__default['default'](SELECTOR_BODY);\n\n      if (this._options.autoCollapseSize && $__default['default'](window).width() <= this._options.autoCollapseSize) {\n        $bodySelector.removeClass(CLASS_NAME_OPEN$3).addClass(CLASS_NAME_CLOSED);\n      }\n\n      $bodySelector.addClass(CLASS_NAME_COLLAPSED);\n\n      if (this._options.enableRemember) {\n        localStorage.setItem(\"remember\" + EVENT_KEY$2, CLASS_NAME_COLLAPSED);\n      }\n\n      $__default['default'](this._element).trigger($__default['default'].Event(EVENT_COLLAPSED$1));\n    };\n\n    _proto.toggle = function toggle() {\n      if ($__default['default'](SELECTOR_BODY).hasClass(CLASS_NAME_COLLAPSED)) {\n        this.expand();\n      } else {\n        this.collapse();\n      }\n    };\n\n    _proto.autoCollapse = function autoCollapse(resize) {\n      if (resize === void 0) {\n        resize = false;\n      }\n\n      if (!this._options.autoCollapseSize) {\n        return;\n      }\n\n      var $bodySelector = $__default['default'](SELECTOR_BODY);\n\n      if ($__default['default'](window).width() <= this._options.autoCollapseSize) {\n        if (!$bodySelector.hasClass(CLASS_NAME_OPEN$3)) {\n          this.collapse();\n        }\n      } else if (resize === true) {\n        if ($bodySelector.hasClass(CLASS_NAME_OPEN$3)) {\n          $bodySelector.removeClass(CLASS_NAME_OPEN$3);\n        } else if ($bodySelector.hasClass(CLASS_NAME_CLOSED)) {\n          this.expand();\n        }\n      }\n    };\n\n    _proto.remember = function remember() {\n      if (!this._options.enableRemember) {\n        return;\n      }\n\n      var $body = $__default['default']('body');\n      var toggleState = localStorage.getItem(\"remember\" + EVENT_KEY$2);\n\n      if (toggleState === CLASS_NAME_COLLAPSED) {\n        if (this._options.noTransitionAfterReload) {\n          $body.addClass('hold-transition').addClass(CLASS_NAME_COLLAPSED).delay(50).queue(function () {\n            $__default['default'](this).removeClass('hold-transition');\n            $__default['default'](this).dequeue();\n          });\n        } else {\n          $body.addClass(CLASS_NAME_COLLAPSED);\n        }\n      } else if (this._options.noTransitionAfterReload) {\n        $body.addClass('hold-transition').removeClass(CLASS_NAME_COLLAPSED).delay(50).queue(function () {\n          $__default['default'](this).removeClass('hold-transition');\n          $__default['default'](this).dequeue();\n        });\n      } else {\n        $body.removeClass(CLASS_NAME_COLLAPSED);\n      }\n    } // Private\n    ;\n\n    _proto._init = function _init() {\n      var _this = this;\n\n      this.remember();\n      this.autoCollapse();\n      $__default['default'](window).resize(function () {\n        _this.autoCollapse(true);\n      });\n    };\n\n    _proto._addOverlay = function _addOverlay() {\n      var _this2 = this;\n\n      var overlay = $__default['default']('<div />', {\n        id: 'sidebar-overlay'\n      });\n      overlay.on('click', function () {\n        _this2.collapse();\n      });\n      $__default['default'](SELECTOR_WRAPPER).append(overlay);\n    } // Static\n    ;\n\n    PushMenu._jQueryInterface = function _jQueryInterface(operation) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$5);\n\n        var _options = $__default['default'].extend({}, Default$5, $__default['default'](this).data());\n\n        if (!data) {\n          data = new PushMenu(this, _options);\n          $__default['default'](this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof operation === 'string' && /collapse|expand|toggle/.test(operation)) {\n          data[operation]();\n        }\n      });\n    };\n\n    return PushMenu;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](document).on('click', SELECTOR_TOGGLE_BUTTON$1, function (event) {\n    event.preventDefault();\n    var button = event.currentTarget;\n\n    if ($__default['default'](button).data('widget') !== 'pushmenu') {\n      button = $__default['default'](button).closest(SELECTOR_TOGGLE_BUTTON$1);\n    }\n\n    PushMenu._jQueryInterface.call($__default['default'](button), 'toggle');\n  });\n  $__default['default'](window).on('load', function () {\n    PushMenu._jQueryInterface.call($__default['default'](SELECTOR_TOGGLE_BUTTON$1));\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$5] = PushMenu._jQueryInterface;\n  $__default['default'].fn[NAME$5].Constructor = PushMenu;\n\n  $__default['default'].fn[NAME$5].noConflict = function () {\n    $__default['default'].fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return PushMenu._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE SidebarSearch.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$4 = 'SidebarSearch';\n  var DATA_KEY$4 = 'lte.sidebar-search';\n  var JQUERY_NO_CONFLICT$4 = $__default['default'].fn[NAME$4];\n  var CLASS_NAME_OPEN$2 = 'sidebar-search-open';\n  var CLASS_NAME_ICON_SEARCH = 'fa-search';\n  var CLASS_NAME_ICON_CLOSE = 'fa-times';\n  var CLASS_NAME_HEADER = 'nav-header';\n  var CLASS_NAME_SEARCH_RESULTS = 'sidebar-search-results';\n  var CLASS_NAME_LIST_GROUP = 'list-group';\n  var SELECTOR_DATA_WIDGET$1 = '[data-widget=\"sidebar-search\"]';\n  var SELECTOR_SIDEBAR = '.main-sidebar .nav-sidebar';\n  var SELECTOR_NAV_LINK = '.nav-link';\n  var SELECTOR_NAV_TREEVIEW = '.nav-treeview';\n  var SELECTOR_SEARCH_INPUT$1 = SELECTOR_DATA_WIDGET$1 + \" .form-control\";\n  var SELECTOR_SEARCH_BUTTON = SELECTOR_DATA_WIDGET$1 + \" .btn\";\n  var SELECTOR_SEARCH_ICON = SELECTOR_SEARCH_BUTTON + \" i\";\n  var SELECTOR_SEARCH_LIST_GROUP = \".\" + CLASS_NAME_LIST_GROUP;\n  var SELECTOR_SEARCH_RESULTS = \".\" + CLASS_NAME_SEARCH_RESULTS;\n  var SELECTOR_SEARCH_RESULTS_GROUP = SELECTOR_SEARCH_RESULTS + \" .\" + CLASS_NAME_LIST_GROUP;\n  var Default$4 = {\n    arrowSign: '->',\n    minLength: 3,\n    maxResults: 7,\n    highlightName: true,\n    highlightPath: false,\n    highlightClass: 'text-light',\n    notFoundText: 'No element found!'\n  };\n  var SearchItems = [];\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var SidebarSearch = /*#__PURE__*/function () {\n    function SidebarSearch(_element, _options) {\n      this.element = _element;\n      this.options = $__default['default'].extend({}, Default$4, _options);\n      this.items = [];\n    } // Public\n\n\n    var _proto = SidebarSearch.prototype;\n\n    _proto.init = function init() {\n      var _this = this;\n\n      if ($__default['default'](SELECTOR_DATA_WIDGET$1).length === 0) {\n        return;\n      }\n\n      if ($__default['default'](SELECTOR_DATA_WIDGET$1).next(SELECTOR_SEARCH_RESULTS).length === 0) {\n        $__default['default'](SELECTOR_DATA_WIDGET$1).after($__default['default']('<div />', {\n          class: CLASS_NAME_SEARCH_RESULTS\n        }));\n      }\n\n      if ($__default['default'](SELECTOR_SEARCH_RESULTS).children(SELECTOR_SEARCH_LIST_GROUP).length === 0) {\n        $__default['default'](SELECTOR_SEARCH_RESULTS).append($__default['default']('<div />', {\n          class: CLASS_NAME_LIST_GROUP\n        }));\n      }\n\n      this._addNotFound();\n\n      $__default['default'](SELECTOR_SIDEBAR).children().each(function (i, child) {\n        _this._parseItem(child);\n      });\n    };\n\n    _proto.search = function search() {\n      var _this2 = this;\n\n      var searchValue = $__default['default'](SELECTOR_SEARCH_INPUT$1).val().toLowerCase();\n\n      if (searchValue.length < this.options.minLength) {\n        $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).empty();\n\n        this._addNotFound();\n\n        this.close();\n        return;\n      }\n\n      var searchResults = SearchItems.filter(function (item) {\n        return item.name.toLowerCase().includes(searchValue);\n      });\n      var endResults = $__default['default'](searchResults.slice(0, this.options.maxResults));\n      $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).empty();\n\n      if (endResults.length === 0) {\n        this._addNotFound();\n      } else {\n        endResults.each(function (i, result) {\n          $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).append(_this2._renderItem(escape(result.name), escape(result.link), result.path));\n        });\n      }\n\n      this.open();\n    };\n\n    _proto.open = function open() {\n      $__default['default'](SELECTOR_DATA_WIDGET$1).parent().addClass(CLASS_NAME_OPEN$2);\n      $__default['default'](SELECTOR_SEARCH_ICON).removeClass(CLASS_NAME_ICON_SEARCH).addClass(CLASS_NAME_ICON_CLOSE);\n    };\n\n    _proto.close = function close() {\n      $__default['default'](SELECTOR_DATA_WIDGET$1).parent().removeClass(CLASS_NAME_OPEN$2);\n      $__default['default'](SELECTOR_SEARCH_ICON).removeClass(CLASS_NAME_ICON_CLOSE).addClass(CLASS_NAME_ICON_SEARCH);\n    };\n\n    _proto.toggle = function toggle() {\n      if ($__default['default'](SELECTOR_DATA_WIDGET$1).parent().hasClass(CLASS_NAME_OPEN$2)) {\n        this.close();\n      } else {\n        this.open();\n      }\n    } // Private\n    ;\n\n    _proto._parseItem = function _parseItem(item, path) {\n      var _this3 = this;\n\n      if (path === void 0) {\n        path = [];\n      }\n\n      if ($__default['default'](item).hasClass(CLASS_NAME_HEADER)) {\n        return;\n      }\n\n      var itemObject = {};\n      var navLink = $__default['default'](item).clone().find(\"> \" + SELECTOR_NAV_LINK);\n      var navTreeview = $__default['default'](item).clone().find(\"> \" + SELECTOR_NAV_TREEVIEW);\n      var link = navLink.attr('href');\n      var name = navLink.find('p').children().remove().end().text();\n      itemObject.name = this._trimText(name);\n      itemObject.link = link;\n      itemObject.path = path;\n\n      if (navTreeview.length === 0) {\n        SearchItems.push(itemObject);\n      } else {\n        var newPath = itemObject.path.concat([itemObject.name]);\n        navTreeview.children().each(function (i, child) {\n          _this3._parseItem(child, newPath);\n        });\n      }\n    };\n\n    _proto._trimText = function _trimText(text) {\n      return $.trim(text.replace(/(\\r\\n|\\n|\\r)/gm, ' '));\n    };\n\n    _proto._renderItem = function _renderItem(name, link, path) {\n      var _this4 = this;\n\n      path = path.join(\" \" + this.options.arrowSign + \" \");\n      name = unescape(name);\n\n      if (this.options.highlightName || this.options.highlightPath) {\n        var searchValue = $__default['default'](SELECTOR_SEARCH_INPUT$1).val().toLowerCase();\n        var regExp = new RegExp(searchValue, 'gi');\n\n        if (this.options.highlightName) {\n          name = name.replace(regExp, function (str) {\n            return \"<strong class=\\\"\" + _this4.options.highlightClass + \"\\\">\" + str + \"</strong>\";\n          });\n        }\n\n        if (this.options.highlightPath) {\n          path = path.replace(regExp, function (str) {\n            return \"<strong class=\\\"\" + _this4.options.highlightClass + \"\\\">\" + str + \"</strong>\";\n          });\n        }\n      }\n\n      var groupItemElement = $__default['default']('<a/>', {\n        href: link,\n        class: 'list-group-item'\n      });\n      var searchTitleElement = $__default['default']('<div/>', {\n        class: 'search-title'\n      }).html(name);\n      var searchPathElement = $__default['default']('<div/>', {\n        class: 'search-path'\n      }).html(path);\n      groupItemElement.append(searchTitleElement).append(searchPathElement);\n      return groupItemElement;\n    };\n\n    _proto._addNotFound = function _addNotFound() {\n      $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).append(this._renderItem(this.options.notFoundText, '#', []));\n    } // Static\n    ;\n\n    SidebarSearch._jQueryInterface = function _jQueryInterface(config) {\n      var data = $__default['default'](this).data(DATA_KEY$4);\n\n      if (!data) {\n        data = $__default['default'](this).data();\n      }\n\n      var _options = $__default['default'].extend({}, Default$4, typeof config === 'object' ? config : data);\n\n      var plugin = new SidebarSearch($__default['default'](this), _options);\n      $__default['default'](this).data(DATA_KEY$4, typeof config === 'object' ? config : data);\n\n      if (typeof config === 'string' && /init|toggle|close|open|search/.test(config)) {\n        plugin[config]();\n      } else {\n        plugin.init();\n      }\n    };\n\n    return SidebarSearch;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](document).on('click', SELECTOR_SEARCH_BUTTON, function (event) {\n    event.preventDefault();\n\n    SidebarSearch._jQueryInterface.call($__default['default'](SELECTOR_DATA_WIDGET$1), 'toggle');\n  });\n  $__default['default'](document).on('keyup', SELECTOR_SEARCH_INPUT$1, function (event) {\n    if (event.keyCode == 38) {\n      event.preventDefault();\n      $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).children().last().focus();\n      return;\n    }\n\n    if (event.keyCode == 40) {\n      event.preventDefault();\n      $__default['default'](SELECTOR_SEARCH_RESULTS_GROUP).children().first().focus();\n      return;\n    }\n\n    setTimeout(function () {\n      SidebarSearch._jQueryInterface.call($__default['default'](SELECTOR_DATA_WIDGET$1), 'search');\n    }, 100);\n  });\n  $__default['default'](document).on('keydown', SELECTOR_SEARCH_RESULTS_GROUP, function (event) {\n    var $focused = $__default['default'](':focus');\n\n    if (event.keyCode == 38) {\n      event.preventDefault();\n\n      if ($focused.is(':first-child')) {\n        $focused.siblings().last().focus();\n      } else {\n        $focused.prev().focus();\n      }\n    }\n\n    if (event.keyCode == 40) {\n      event.preventDefault();\n\n      if ($focused.is(':last-child')) {\n        $focused.siblings().first().focus();\n      } else {\n        $focused.next().focus();\n      }\n    }\n  });\n  $__default['default'](window).on('load', function () {\n    SidebarSearch._jQueryInterface.call($__default['default'](SELECTOR_DATA_WIDGET$1), 'init');\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$4] = SidebarSearch._jQueryInterface;\n  $__default['default'].fn[NAME$4].Constructor = SidebarSearch;\n\n  $__default['default'].fn[NAME$4].noConflict = function () {\n    $__default['default'].fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return SidebarSearch._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE NavbarSearch.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$3 = 'NavbarSearch';\n  var DATA_KEY$3 = 'lte.navbar-search';\n  var JQUERY_NO_CONFLICT$3 = $__default['default'].fn[NAME$3];\n  var SELECTOR_TOGGLE_BUTTON = '[data-widget=\"navbar-search\"]';\n  var SELECTOR_SEARCH_BLOCK = '.navbar-search-block';\n  var SELECTOR_SEARCH_INPUT = '.form-control';\n  var CLASS_NAME_OPEN$1 = 'navbar-search-open';\n  var Default$3 = {\n    resetOnClose: true,\n    target: SELECTOR_SEARCH_BLOCK\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var NavbarSearch = /*#__PURE__*/function () {\n    function NavbarSearch(_element, _options) {\n      this._element = _element;\n      this._config = $__default['default'].extend({}, Default$3, _options);\n    } // Public\n\n\n    var _proto = NavbarSearch.prototype;\n\n    _proto.open = function open() {\n      $__default['default'](this._config.target).css('display', 'flex').hide().fadeIn().addClass(CLASS_NAME_OPEN$1);\n      $__default['default'](this._config.target + \" \" + SELECTOR_SEARCH_INPUT).focus();\n    };\n\n    _proto.close = function close() {\n      $__default['default'](this._config.target).fadeOut().removeClass(CLASS_NAME_OPEN$1);\n\n      if (this._config.resetOnClose) {\n        $__default['default'](this._config.target + \" \" + SELECTOR_SEARCH_INPUT).val('');\n      }\n    };\n\n    _proto.toggle = function toggle() {\n      if ($__default['default'](this._config.target).hasClass(CLASS_NAME_OPEN$1)) {\n        this.close();\n      } else {\n        this.open();\n      }\n    } // Static\n    ;\n\n    NavbarSearch._jQueryInterface = function _jQueryInterface(options) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$3);\n\n        var _options = $__default['default'].extend({}, Default$3, $__default['default'](this).data());\n\n        if (!data) {\n          data = new NavbarSearch(this, _options);\n          $__default['default'](this).data(DATA_KEY$3, data);\n        }\n\n        if (!/toggle|close|open/.test(options)) {\n          throw new Error(\"Undefined method \" + options);\n        }\n\n        data[options]();\n      });\n    };\n\n    return NavbarSearch;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](document).on('click', SELECTOR_TOGGLE_BUTTON, function (event) {\n    event.preventDefault();\n    var button = $__default['default'](event.currentTarget);\n\n    if (button.data('widget') !== 'navbar-search') {\n      button = button.closest(SELECTOR_TOGGLE_BUTTON);\n    }\n\n    NavbarSearch._jQueryInterface.call(button, 'toggle');\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$3] = NavbarSearch._jQueryInterface;\n  $__default['default'].fn[NAME$3].Constructor = NavbarSearch;\n\n  $__default['default'].fn[NAME$3].noConflict = function () {\n    $__default['default'].fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return NavbarSearch._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE Toasts.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$2 = 'Toasts';\n  var DATA_KEY$2 = 'lte.toasts';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$2;\n  var JQUERY_NO_CONFLICT$2 = $__default['default'].fn[NAME$2];\n  var EVENT_INIT = \"init\" + EVENT_KEY$1;\n  var EVENT_CREATED = \"created\" + EVENT_KEY$1;\n  var EVENT_REMOVED = \"removed\" + EVENT_KEY$1;\n  var SELECTOR_CONTAINER_TOP_RIGHT = '#toastsContainerTopRight';\n  var SELECTOR_CONTAINER_TOP_LEFT = '#toastsContainerTopLeft';\n  var SELECTOR_CONTAINER_BOTTOM_RIGHT = '#toastsContainerBottomRight';\n  var SELECTOR_CONTAINER_BOTTOM_LEFT = '#toastsContainerBottomLeft';\n  var CLASS_NAME_TOP_RIGHT = 'toasts-top-right';\n  var CLASS_NAME_TOP_LEFT = 'toasts-top-left';\n  var CLASS_NAME_BOTTOM_RIGHT = 'toasts-bottom-right';\n  var CLASS_NAME_BOTTOM_LEFT = 'toasts-bottom-left';\n  var POSITION_TOP_RIGHT = 'topRight';\n  var POSITION_TOP_LEFT = 'topLeft';\n  var POSITION_BOTTOM_RIGHT = 'bottomRight';\n  var POSITION_BOTTOM_LEFT = 'bottomLeft';\n  var Default$2 = {\n    position: POSITION_TOP_RIGHT,\n    fixed: true,\n    autohide: false,\n    autoremove: true,\n    delay: 1000,\n    fade: true,\n    icon: null,\n    image: null,\n    imageAlt: null,\n    imageHeight: '25px',\n    title: null,\n    subtitle: null,\n    close: true,\n    body: null,\n    class: null\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var Toasts = /*#__PURE__*/function () {\n    function Toasts(element, config) {\n      this._config = config;\n\n      this._prepareContainer();\n\n      $__default['default']('body').trigger($__default['default'].Event(EVENT_INIT));\n    } // Public\n\n\n    var _proto = Toasts.prototype;\n\n    _proto.create = function create() {\n      var toast = $__default['default']('<div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\"/>');\n      toast.data('autohide', this._config.autohide);\n      toast.data('animation', this._config.fade);\n\n      if (this._config.class) {\n        toast.addClass(this._config.class);\n      }\n\n      if (this._config.delay && this._config.delay != 500) {\n        toast.data('delay', this._config.delay);\n      }\n\n      var toastHeader = $__default['default']('<div class=\"toast-header\">');\n\n      if (this._config.image != null) {\n        var toastImage = $__default['default']('<img />').addClass('rounded mr-2').attr('src', this._config.image).attr('alt', this._config.imageAlt);\n\n        if (this._config.imageHeight != null) {\n          toastImage.height(this._config.imageHeight).width('auto');\n        }\n\n        toastHeader.append(toastImage);\n      }\n\n      if (this._config.icon != null) {\n        toastHeader.append($__default['default']('<i />').addClass('mr-2').addClass(this._config.icon));\n      }\n\n      if (this._config.title != null) {\n        toastHeader.append($__default['default']('<strong />').addClass('mr-auto').html(this._config.title));\n      }\n\n      if (this._config.subtitle != null) {\n        toastHeader.append($__default['default']('<small />').html(this._config.subtitle));\n      }\n\n      if (this._config.close == true) {\n        var toastClose = $__default['default']('<button data-dismiss=\"toast\" />').attr('type', 'button').addClass('ml-2 mb-1 close').attr('aria-label', 'Close').append('<span aria-hidden=\"true\">&times;</span>');\n\n        if (this._config.title == null) {\n          toastClose.toggleClass('ml-2 ml-auto');\n        }\n\n        toastHeader.append(toastClose);\n      }\n\n      toast.append(toastHeader);\n\n      if (this._config.body != null) {\n        toast.append($__default['default']('<div class=\"toast-body\" />').html(this._config.body));\n      }\n\n      $__default['default'](this._getContainerId()).prepend(toast);\n      var $body = $__default['default']('body');\n      $body.trigger($__default['default'].Event(EVENT_CREATED));\n      toast.toast('show');\n\n      if (this._config.autoremove) {\n        toast.on('hidden.bs.toast', function () {\n          $__default['default'](this).delay(200).remove();\n          $body.trigger($__default['default'].Event(EVENT_REMOVED));\n        });\n      }\n    } // Static\n    ;\n\n    _proto._getContainerId = function _getContainerId() {\n      if (this._config.position == POSITION_TOP_RIGHT) {\n        return SELECTOR_CONTAINER_TOP_RIGHT;\n      }\n\n      if (this._config.position == POSITION_TOP_LEFT) {\n        return SELECTOR_CONTAINER_TOP_LEFT;\n      }\n\n      if (this._config.position == POSITION_BOTTOM_RIGHT) {\n        return SELECTOR_CONTAINER_BOTTOM_RIGHT;\n      }\n\n      if (this._config.position == POSITION_BOTTOM_LEFT) {\n        return SELECTOR_CONTAINER_BOTTOM_LEFT;\n      }\n    };\n\n    _proto._prepareContainer = function _prepareContainer() {\n      if ($__default['default'](this._getContainerId()).length === 0) {\n        var container = $__default['default']('<div />').attr('id', this._getContainerId().replace('#', ''));\n\n        if (this._config.position == POSITION_TOP_RIGHT) {\n          container.addClass(CLASS_NAME_TOP_RIGHT);\n        } else if (this._config.position == POSITION_TOP_LEFT) {\n          container.addClass(CLASS_NAME_TOP_LEFT);\n        } else if (this._config.position == POSITION_BOTTOM_RIGHT) {\n          container.addClass(CLASS_NAME_BOTTOM_RIGHT);\n        } else if (this._config.position == POSITION_BOTTOM_LEFT) {\n          container.addClass(CLASS_NAME_BOTTOM_LEFT);\n        }\n\n        $__default['default']('body').append(container);\n      }\n\n      if (this._config.fixed) {\n        $__default['default'](this._getContainerId()).addClass('fixed');\n      } else {\n        $__default['default'](this._getContainerId()).removeClass('fixed');\n      }\n    } // Static\n    ;\n\n    Toasts._jQueryInterface = function _jQueryInterface(option, config) {\n      return this.each(function () {\n        var _options = $__default['default'].extend({}, Default$2, config);\n\n        var toast = new Toasts($__default['default'](this), _options);\n\n        if (option === 'create') {\n          toast[option]();\n        }\n      });\n    };\n\n    return Toasts;\n  }();\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n\n  $__default['default'].fn[NAME$2] = Toasts._jQueryInterface;\n  $__default['default'].fn[NAME$2].Constructor = Toasts;\n\n  $__default['default'].fn[NAME$2].noConflict = function () {\n    $__default['default'].fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Toasts._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE TodoList.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME$1 = 'TodoList';\n  var DATA_KEY$1 = 'lte.todolist';\n  var JQUERY_NO_CONFLICT$1 = $__default['default'].fn[NAME$1];\n  var SELECTOR_DATA_TOGGLE = '[data-widget=\"todo-list\"]';\n  var CLASS_NAME_TODO_LIST_DONE = 'done';\n  var Default$1 = {\n    onCheck: function onCheck(item) {\n      return item;\n    },\n    onUnCheck: function onUnCheck(item) {\n      return item;\n    }\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var TodoList = /*#__PURE__*/function () {\n    function TodoList(element, config) {\n      this._config = config;\n      this._element = element;\n\n      this._init();\n    } // Public\n\n\n    var _proto = TodoList.prototype;\n\n    _proto.toggle = function toggle(item) {\n      item.parents('li').toggleClass(CLASS_NAME_TODO_LIST_DONE);\n\n      if (!$__default['default'](item).prop('checked')) {\n        this.unCheck($__default['default'](item));\n        return;\n      }\n\n      this.check(item);\n    };\n\n    _proto.check = function check(item) {\n      this._config.onCheck.call(item);\n    };\n\n    _proto.unCheck = function unCheck(item) {\n      this._config.onUnCheck.call(item);\n    } // Private\n    ;\n\n    _proto._init = function _init() {\n      var _this = this;\n\n      var $toggleSelector = this._element;\n      $toggleSelector.find('input:checkbox:checked').parents('li').toggleClass(CLASS_NAME_TODO_LIST_DONE);\n      $toggleSelector.on('change', 'input:checkbox', function (event) {\n        _this.toggle($__default['default'](event.target));\n      });\n    } // Static\n    ;\n\n    TodoList._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = $__default['default'](this).data();\n        }\n\n        var _options = $__default['default'].extend({}, Default$1, typeof config === 'object' ? config : data);\n\n        var plugin = new TodoList($__default['default'](this), _options);\n        $__default['default'](this).data(DATA_KEY$1, typeof config === 'object' ? config : data);\n\n        if (config === 'init') {\n          plugin[config]();\n        }\n      });\n    };\n\n    return TodoList;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](window).on('load', function () {\n    TodoList._jQueryInterface.call($__default['default'](SELECTOR_DATA_TOGGLE));\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME$1] = TodoList._jQueryInterface;\n  $__default['default'].fn[NAME$1].Constructor = TodoList;\n\n  $__default['default'].fn[NAME$1].noConflict = function () {\n    $__default['default'].fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return TodoList._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------\n   * AdminLTE Treeview.js\n   * License MIT\n   * --------------------------------------------\n   */\n  /**\n   * Constants\n   * ====================================================\n   */\n\n  var NAME = 'Treeview';\n  var DATA_KEY = 'lte.treeview';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];\n  var EVENT_EXPANDED = \"expanded\" + EVENT_KEY;\n  var EVENT_COLLAPSED = \"collapsed\" + EVENT_KEY;\n  var EVENT_LOAD_DATA_API = \"load\" + EVENT_KEY;\n  var SELECTOR_LI = '.nav-item';\n  var SELECTOR_LINK = '.nav-link';\n  var SELECTOR_TREEVIEW_MENU = '.nav-treeview';\n  var SELECTOR_OPEN = '.menu-open';\n  var SELECTOR_DATA_WIDGET = '[data-widget=\"treeview\"]';\n  var CLASS_NAME_OPEN = 'menu-open';\n  var CLASS_NAME_IS_OPENING = 'menu-is-opening';\n  var CLASS_NAME_SIDEBAR_COLLAPSED = 'sidebar-collapse';\n  var Default = {\n    trigger: SELECTOR_DATA_WIDGET + \" \" + SELECTOR_LINK,\n    animationSpeed: 300,\n    accordion: true,\n    expandSidebar: false,\n    sidebarButtonSelector: '[data-widget=\"pushmenu\"]'\n  };\n  /**\n   * Class Definition\n   * ====================================================\n   */\n\n  var Treeview = /*#__PURE__*/function () {\n    function Treeview(element, config) {\n      this._config = config;\n      this._element = element;\n    } // Public\n\n\n    var _proto = Treeview.prototype;\n\n    _proto.init = function init() {\n      $__default['default'](\"\" + SELECTOR_LI + SELECTOR_OPEN + \" \" + SELECTOR_TREEVIEW_MENU + SELECTOR_OPEN).css('display', 'block');\n\n      this._setupListeners();\n    };\n\n    _proto.expand = function expand(treeviewMenu, parentLi) {\n      var _this = this;\n\n      var expandedEvent = $__default['default'].Event(EVENT_EXPANDED);\n\n      if (this._config.accordion) {\n        var openMenuLi = parentLi.siblings(SELECTOR_OPEN).first();\n        var openTreeview = openMenuLi.find(SELECTOR_TREEVIEW_MENU).first();\n        this.collapse(openTreeview, openMenuLi);\n      }\n\n      parentLi.addClass(CLASS_NAME_IS_OPENING);\n      treeviewMenu.stop().slideDown(this._config.animationSpeed, function () {\n        parentLi.addClass(CLASS_NAME_OPEN);\n        $__default['default'](_this._element).trigger(expandedEvent);\n      });\n\n      if (this._config.expandSidebar) {\n        this._expandSidebar();\n      }\n    };\n\n    _proto.collapse = function collapse(treeviewMenu, parentLi) {\n      var _this2 = this;\n\n      var collapsedEvent = $__default['default'].Event(EVENT_COLLAPSED);\n      parentLi.removeClass(CLASS_NAME_IS_OPENING + \" \" + CLASS_NAME_OPEN);\n      treeviewMenu.stop().slideUp(this._config.animationSpeed, function () {\n        $__default['default'](_this2._element).trigger(collapsedEvent);\n        treeviewMenu.find(SELECTOR_OPEN + \" > \" + SELECTOR_TREEVIEW_MENU).slideUp();\n        treeviewMenu.find(SELECTOR_OPEN).removeClass(CLASS_NAME_OPEN);\n      });\n    };\n\n    _proto.toggle = function toggle(event) {\n      var $relativeTarget = $__default['default'](event.currentTarget);\n      var $parent = $relativeTarget.parent();\n      var treeviewMenu = $parent.find(\"> \" + SELECTOR_TREEVIEW_MENU);\n\n      if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {\n        if (!$parent.is(SELECTOR_LI)) {\n          treeviewMenu = $parent.parent().find(\"> \" + SELECTOR_TREEVIEW_MENU);\n        }\n\n        if (!treeviewMenu.is(SELECTOR_TREEVIEW_MENU)) {\n          return;\n        }\n      }\n\n      event.preventDefault();\n      var parentLi = $relativeTarget.parents(SELECTOR_LI).first();\n      var isOpen = parentLi.hasClass(CLASS_NAME_OPEN);\n\n      if (isOpen) {\n        this.collapse($__default['default'](treeviewMenu), parentLi);\n      } else {\n        this.expand($__default['default'](treeviewMenu), parentLi);\n      }\n    } // Private\n    ;\n\n    _proto._setupListeners = function _setupListeners() {\n      var _this3 = this;\n\n      var elementId = this._element.attr('id') !== undefined ? \"#\" + this._element.attr('id') : '';\n      $__default['default'](document).on('click', \"\" + elementId + this._config.trigger, function (event) {\n        _this3.toggle(event);\n      });\n    };\n\n    _proto._expandSidebar = function _expandSidebar() {\n      if ($__default['default']('body').hasClass(CLASS_NAME_SIDEBAR_COLLAPSED)) {\n        $__default['default'](this._config.sidebarButtonSelector).PushMenu('expand');\n      }\n    } // Static\n    ;\n\n    Treeview._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $__default['default'](this).data(DATA_KEY);\n\n        var _options = $__default['default'].extend({}, Default, $__default['default'](this).data());\n\n        if (!data) {\n          data = new Treeview($__default['default'](this), _options);\n          $__default['default'](this).data(DATA_KEY, data);\n        }\n\n        if (config === 'init') {\n          data[config]();\n        }\n      });\n    };\n\n    return Treeview;\n  }();\n  /**\n   * Data API\n   * ====================================================\n   */\n\n\n  $__default['default'](window).on(EVENT_LOAD_DATA_API, function () {\n    $__default['default'](SELECTOR_DATA_WIDGET).each(function () {\n      Treeview._jQueryInterface.call($__default['default'](this), 'init');\n    });\n  });\n  /**\n   * jQuery API\n   * ====================================================\n   */\n\n  $__default['default'].fn[NAME] = Treeview._jQueryInterface;\n  $__default['default'].fn[NAME].Constructor = Treeview;\n\n  $__default['default'].fn[NAME].noConflict = function () {\n    $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;\n    return Treeview._jQueryInterface;\n  };\n\n  exports.CardRefresh = CardRefresh;\n  exports.CardWidget = CardWidget;\n  exports.ControlSidebar = ControlSidebar;\n  exports.DirectChat = DirectChat;\n  exports.Dropdown = Dropdown;\n  exports.ExpandableTable = ExpandableTable;\n  exports.Fullscreen = Fullscreen;\n  exports.IFrame = IFrame;\n  exports.Layout = Layout;\n  exports.NavbarSearch = NavbarSearch;\n  exports.PushMenu = PushMenu;\n  exports.SidebarSearch = SidebarSearch;\n  exports.Toasts = Toasts;\n  exports.TodoList = TodoList;\n  exports.Treeview = Treeview;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=adminlte.js.map\n","window.Popper = require('popper.js').default;\nwindow.$ = window.jQuery = require('jquery');\nrequire('bootstrap');\nrequire('admin-lte/dist/js/adminlte');\nrequire('jquery-chained/jquery.chained.remote');\nrequire('moment');\nrequire('moment/locale/el');\n\nimport bootbox from 'bootbox';\nimport 'bootstrap-daterangepicker';\nimport 'bootstrap-select';\nimport WebFontLoader from 'webfontloader';\nimport 'jquery-ui/ui/sortable';\n\nimport './product';\nimport './search';\nimport './x-editable';\nimport * as NestedSortable from './nested-sortable';\nimport * as OrderStatus from './order-status';\nimport * as Shipment from './order-shipment';\nimport * as ProductSearch from './product-search';\n\n__webpack_public_path__ = $('#assets-url').attr('href');\n\nWebFontLoader.load({\n  google: { families: [ 'Roboto:400,700,500,300:greek,latin' ] }\n});\n\n$(() => {\n  const token = $('meta[name=\"_token\"]').attr('content');\n\n  const $roots = $('.is-root');\n\n  if ($roots.length) {\n    NestedSortable.init($roots);\n  }\n\n  const $sortable = $('.js-sortable');\n\n  if ($sortable.length) {\n    $sortable.sortable({\n      axis: 'y',\n      cursor: 'ns-resize',\n      handle: '.handle',\n      items: '> tbody > tr',\n      update () {\n        $.post('seminars/position', {\n          positions: $sortable.sortable('toArray', { attribute: 'data-id' }),\n        });\n      }\n    });\n  }\n\n  const $statuses = $('.select-status');\n\n  if ($statuses.length) {\n    OrderStatus.init($statuses);\n  }\n\n  const $shipments = $('.js-shipment');\n\n  if ($shipments.length) {\n    Shipment.init($shipments);\n  }\n\n  // display loader when a button is clicked\n  $('.btn-loader').on('click', (e) => {\n    const $button = $(e.currentTarget).addClass('disabled');\n    $button.find('.fa').addClass('d-none');\n    $button.find('.spinner-border').removeClass('d-none');\n  });\n\n  bootbox.setDefaults({ locale: 'el' });\n\n  $('.content').on('submit', '.confirm-delete', confirmForm('Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το στοιχείο;'));\n\n  $('[data-confirm]').on('submit', confirmForm('Παρακαλώ επαληθεύστε αυτή την ενέργεια.'));\n\n  // update on dropdown change\n  $('.selectpicker').selectpicker({\n    iconBase: 'fa-fw fa',\n    tickIcon: 'fa-check',\n    width: 'auto',\n    multipleSeparator: '<br/>',\n  }).on('change', (event) => {\n    let $target = $(event.target);\n    $.ajax({\n      type: $target.data('method') || 'PUT',\n      url: $target.data('url'),\n      data: {\n        [$target.attr('name')]: $target.val(),\n      },\n    });\n  });\n\n  $.ajaxSetup({\n    headers: { 'X-CSRF-TOKEN': token },\n  });\n\n  $(document).ajaxError((event, jqXHR) => {\n    let response = jqXHR.responseJSON;\n    let message;\n\n    console.error(response);\n\n    switch (jqXHR.status) {\n    case 422:\n      message = Object.keys(response.errors).reduce((errors, error) => {\n        errors.push(response.errors[error].join('\\n'));\n        return errors;\n      }, []).join('\\n');\n\n      break;\n    default:\n      message = response.message;\n\n      break;\n    }\n\n    bootbox.alert({\n      title: 'Σφάλμα ' + jqXHR.status,\n      message,\n      className: 'modal modal-danger',\n      buttons: {\n        ok: {\n          className: 'btn btn-default',\n        }\n      }\n    });\n  });\n\n  // Switch\n\n  $('.js-switch').on('change', (e) => {\n    const $switch = $(e.target);\n    const name = $switch.attr('name');\n    const method = $switch.attr('method') || 'PATCH';\n    const url = $switch.data('url');\n    const states = $switch.data('states') || [0, 1];\n    const state = $switch.is(':checked');\n    const value = states[+state];\n\n    if (!url) {\n      return;\n    }\n\n    $.ajax({\n      url: url,\n      dataType: 'json',\n      method: method,\n      data: { [name]: value },\n      success: () => {\n        $switch.siblings('label').text((index, text) => text && value);\n      }\n    });\n  });\n\n  if ($('#variant').length) {\n    ProductSearch.init();\n  }\n\n  $('.seminar-period-range').daterangepicker({\n    locale: {\n      applyLabel: 'Εντάξει',\n      cancelLabel: 'Ακύρωση',\n      format: 'DD/MM/YYYY',\n      fromLabel: 'Από',\n      toLabel: 'Μέχρι',\n      customRangeLabel: 'Custom',\n      firstDay: 1\n    }\n  });\n\n  $('.seminar-session-range').daterangepicker({\n    locale: {\n      applyLabel: 'Εντάξει',\n      cancelLabel: 'Ακύρωση',\n      format: 'DD/MM/YYYY HH:mm',\n      fromLabel: 'Από',\n      toLabel: 'Μέχρι',\n      customRangeLabel: 'Custom',\n      firstDay: 1\n    },\n    timePicker: true,\n    timePickerIncrement: 30,\n    timePicker24Hour: true,\n    timePickerSeconds: false\n  });\n\n  $('#ship_at').daterangepicker({\n    singleDatePicker: true,\n    autoUpdateInput: false,\n    locale: {\n      applyLabel: 'Εντάξει',\n      cancelLabel: 'Ακύρωση',\n      format: 'DD/MM/YYYY',\n      fromLabel: 'Από',\n      toLabel: 'Μέχρι',\n      customRangeLabel: 'Custom',\n      firstDay: 1\n    }\n  }).on('apply.daterangepicker', (ev, picker) => {\n    $(picker.element).val(picker.startDate.format('DD/MM/YYYY'));\n  });\n});\n\n/**\n * @param {string} msg\n */\nfunction confirmForm(msg) {\n  /**\n   * @param {SubmitEvent} msg\n   * @param {boolean} confirmed\n   * @returns void\n   */\n  return (event, confirmed) => {\n    if (confirmed) {\n      return;\n    }\n\n    event.preventDefault();\n\n    bootbox.confirm(msg, (result) => {\n      if (result) {\n        $(event.target).trigger('submit', true);\n      }\n    });\n  };\n}\n","import 'nestedSortable';\n\n/**\n * Initialize\n *\n * @param  {jQuery} el\n */\nexport function init (el) {\n  $(el).nestedSortable({\n    handle: '.handle',\n    items: '.list-group-item',\n    toleranceElement: '> .list-group-item-container',\n    listType: 'div',\n    update: _sortCategories\n  });\n}\n\n/**\n * Sort categories.\n *\n * @param  {Event} event\n * @param  {object} ui\n */\nfunction _sortCategories(event, ui) {\n  $.ajax({\n    url: '/categories/hierarchy',\n    method: 'POST',\n    data: {\n      store_id: ui.item.closest('.is-root').attr('id'),\n      nodes: $(this).nestedSortable('toHierarchy')\n    }\n  });\n}\n","class Shipment {\n  constructor(el) {\n    this.$form = $(el);\n    this.$voucher = this.$form.find('.js-voucher');\n    this.$carrier = this.$form.find('[name=carrier_id]');\n\n    this.$voucher.on('change', () => this.update());\n\n    this.$form.on('click', '.js-carrier a', (event) => {\n      let $target = $(event.target);\n\n      this.$carrier.val($target.data('id'));\n\n      this.update().done(() => {\n        this.$form.find('.active').removeClass('active');\n        $target.closest('li').addClass('active');\n      });\n\n      event.preventDefault();\n    });\n  }\n\n  update() {\n    return $.ajax({\n      url: this.$form.attr('action'),\n      method: 'PUT',\n      data: this.$form.serializeArray(),\n      beforeSend: () => {\n        this.$form.find('.fa')\n          .removeClass('fa-truck')\n          .addClass('fa-spin fa-circle-o-notch');\n      },\n      complete: () => {\n        this.$form.find('.fa')\n          .removeClass('fa-spin fa-circle-o-notch')\n          .addClass('fa-truck');\n      },\n      success: () => {\n        this.$form.find('.form-group')\n          .addClass('has-success');\n\n        this.$form.find('.btn')\n          .removeClass('btn-default')\n          .addClass('btn-success');\n      }\n    });\n  }\n}\n\nexport function init($shipments) {\n  $shipments.each((index, shipment) => {\n    new Shipment(shipment);\n  });\n}\n","import 'select2';\n\n/**\n * @type {JQuery<HTMLElement>}\n */\nvar $statuses = $('#statuses > .badge');\nvar $selector;\n\n/**\n * Initialize.\n *\n * @param  {jQuery} $el\n */\nexport function init ($el) {\n  $selector = $el;\n\n  _bindEvents();\n  _render();\n}\n\nfunction _formatStatus(status) {\n  if(status.id) {\n    return $statuses.eq(status.id - 1).clone();\n  }\n}\n\n/**\n * Bind events.\n */\nfunction _bindEvents () {\n  $selector.on('change', _updateStatus);\n}\n\n/**\n * Update the status of an order.\n *\n * @param  {Event} event\n */\nfunction _updateStatus (event) {\n  let $target = $(event.target);\n\n  $.ajax({\n    type: $target.data('method') || 'PUT',\n    url: $target.data('url'),\n    data: {\n      [$target.attr('name')]: $target.val(),\n    },\n  });\n}\n\n/**\n * Render the status dropdowns.\n */\nfunction _render () {\n  $selector.select2({\n    width: '100%',\n    templateResult: _formatStatus,\n    templateSelection: _formatStatus\n  });\n\n  /**\n   * Hide the search box.\n   *\n   * @link https://select2.org/searching#multi-select\n   */\n  $selector.on('select2:opening select2:closing', () => {\n    $selector.parent()\n      .find('.select2-search__field')\n      .prop('disabled', true);\n  });\n}\n","import Bloodhound from 'corejs-typeahead';\n\nvar $id, $variants, $availability;\n\nconst engine = new Bloodhound({\n  datumTokenizer: Bloodhound.tokenizers.obj.whitespace,\n  queryTokenizer: Bloodhound.tokenizers.whitespace,\n  identify: product => product.id,\n  limit: 100,\n  remote: {\n    url: '/variants/search?q=%QUERY',\n    wildcard: '%QUERY'\n  }\n});\n\nconst dataset = {\n  name: 'variants',\n  display: 'name_and_description',\n  source: engine,\n  limit: 50,\n  templates: {\n    suggestion (variant) {\n      return `\n        <div class=\"media\">\n          <div class=\"media-left media-middle\">\n            <img src=\"${variant.product.thumbnail}\" alt=\"${variant.name_and_description}\" width=\"50\">\n          </div>\n          <div class=\"media-body media-middle\">\n            <strong class=\"text-darker\">${variant.name_and_description}</strong>\n            <div class=\"text-muted\">\n              ${variant.product.stores.map(store => store.name).join(', ')}\n            </div>\n          </div>\n        </div>`;\n    }\n  }\n};\n\nexport function init () {\n  $id = $('#variant_id');\n  $variants = $('#variant');\n  $availability = $('#availability');\n\n  /**\n  * Typeahead for searching product variants\n  */\n  $variants.typeahead({\n    highlight: true,\n    hint: true,\n    minLength: 3,\n  }, dataset);\n\n  _bindEvents();\n}\n\nfunction _bindEvents () {\n  $variants.on('typeahead:select', (e, variant) => {\n    $id.val(variant.id);\n    $availability.html(variant.availability);\n  }).on('typeahead:asyncrequest', (event) => {\n    let $variant = $(event.target);\n\n    $variant.closest('.form-group').addClass('has-feedback has-warning');\n    $variant.after('<i class=\"fa fa-spin fa-circle-o-notch\"></i>');\n  }).on('typeahead:render', (event) => {\n    let $variant = $(event.target);\n\n    $variant.closest('.form-group').removeClass('has-feedback has-warning');\n    $variant.closest('.form-group').find('.fa').remove();\n  });\n}\n","import 'blueimp-file-upload';\nimport 'lightgallery';\n\n$(() => {\n  $('.lightGallery').lightGallery({\n    selector: '.img-thumbnail'\n  });\n\n  // image upload\n  $('.fileupload').fileupload({\n    url: $(this).data('url'),\n    dataType: 'json',\n    start (event) {\n      let $input = $(event.target);\n\n      $('.card-header.d-none').removeClass('d-none');\n\n      $input.closest('.btn')\n        .find('.fa')\n        .removeClass('fa-upload')\n        .addClass('fa-spin fa-circle-o-notch');\n    },\n    progressall (e, data) {\n      let progress = parseInt(data.loaded / data.total * 100, 10);\n      $('.progress .progress-bar').css('width', progress + '%');\n    },\n    done () { location.reload(); }\n  });\n});\n","window.$ = window.jQuery = require('jquery');\nimport Bloodhound from 'corejs-typeahead';\nimport moment from 'moment';\n\nvar $search;\n\nconst engines = {\n  customers: new Bloodhound({\n    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),\n    queryTokenizer: Bloodhound.tokenizers.whitespace,\n    identify: customer => customer.id,\n    limit: 100,\n    remote: {\n      url: '/customers/search?q=%QUERY',\n      wildcard: '%QUERY',\n      transform (response) {\n        return response.map(customer => {\n          customer.url = '/customers/' + customer.id;\n          return customer;\n        });\n      }\n    }\n  }),\n\n  orders: new Bloodhound({\n    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),\n    queryTokenizer: Bloodhound.tokenizers.whitespace,\n    identify: order => order.id,\n    limit: 100,\n    remote: {\n      url: '/orders/search?q=%QUERY',\n      wildcard: '%QUERY',\n      transform (response) {\n        return response.map(order => {\n          order.url = '/orders/' + order.id;\n          return order;\n        });\n      }\n    }\n  }),\n\n  products: new Bloodhound({\n    datumTokenizer: Bloodhound.tokenizers.obj.whitespace,\n    queryTokenizer: Bloodhound.tokenizers.whitespace,\n    identify: product => product.id,\n    limit: 100,\n    remote: {\n      url: '/products/search?q=%QUERY',\n      wildcard: '%QUERY',\n      transform (response) {\n        return response.map(product => {\n          product.url = '/products/' + product.id;\n          return product;\n        });\n      }\n    }\n  })\n};\n\nconst datasets = {\n  customers: {\n    name: 'customers',\n    display: 'name',\n    limit: 50,\n    source: engines.customers,\n    templates: {\n      notFound: '<div class=\"tt-empty text-muted\">Δε βρέθηκαν πελάτες.</div>',\n      header: '<div class=\"tt-header bg-purple\">Πελάτες</div>',\n      suggestion (customer) {\n        return `\n          <div>\n            <strong>${customer.last_name} ${customer.first_name}</strong>\n            <span class=\"text-muted\"><br>${customer.email || ''}<br>${customer.phone || customer.mobile}</span>\n          </div>`;\n      }\n    }\n  },\n\n  orders: {\n    name: 'orders',\n    display: 'id',\n    source: engines.orders,\n    limit: 50,\n    templates: {\n      notFound: '<div class=\"tt-empty text-muted\">Δε βρέθηκαν παραγγελίες.</div>',\n      header: '<div class=\"tt-header bg-purple\">Παραγγελίες</div>',\n      suggestion (order) {\n        return `\n          <div>\n            <strong>${order.id}</strong>\n            <span class=\"text-muted\"><br>${ order.last_name } ${ order.first_name }</span>\n            <span class=\"text-muted\"><br>${ moment(order.date).format('ll') }</span>\n          </div>`;\n      }\n    }\n  },\n\n  products: {\n    name: 'products',\n    display: 'name',\n    source: engines.products,\n    limit: 50,\n    templates: {\n      notFound: '<div class=\"tt-empty text-muted\">Δε βρέθηκαν προϊόντα.</div>',\n      header: '<div class=\"tt-header bg-purple\">Προϊόντα</span></div>',\n      suggestion (product) {\n        return `\n          <div class=\"media\">\n            <div class=\"media-left media-middle\">\n              <img src=\"${product.thumbnail}\" alt=\"${product.name}\" width=\"50\">\n            </div>\n            <div class=\"media-body media-middle\">\n              <strong class=\"text-darker\">${product.name}</strong>\n              <div class=\"text-muted\">\n                ${product.stores.map(store => store.name).join(', ')}\n              </div>\n            </div>\n          </div>`;\n      }\n    }\n  }\n};\n\n$(() => init());\n\nfunction init() {\n  $search = $('#search');\n\n  $search.find('input').typeahead({\n    debug: true,\n    highlight: true,\n    hint: true,\n    minLength: 3,\n  },\n  datasets.orders,\n  datasets.customers,\n  datasets.products\n  );\n\n  _bindEvents();\n}\n\nfunction _bindEvents() {\n  $search\n    .on('typeahead:select', _redirect)\n    .on('typeahead:asyncrequest', () => {\n      $search.find('input').addClass('loading');\n    })\n    .on('typeahead:render', () => {\n      $search.find('input').removeClass('loading');\n    });\n}\n\nfunction _redirect(e, suggestion) {\n  window.location.href = suggestion.url;\n}\n\n","window.$ = window.jQuery = require('jquery');\nrequire('bootstrap/js/dist/popover');\nrequire('X-editable/dist/bootstrap4-editable/js/bootstrap-editable');\n\n$.fn.editableform.buttons =\n  `<button type=\"submit\" class=\"btn btn-primary btn-sm editable-submit\">\n    <i class=\"fa fa-fw fa-check\"></i>\n  </button>\n  <button type=\"button\" class=\"btn btn-default btn-sm editable-cancel\">\n    <i class=\"fa fa-fw fa-times\"></i>\n  </button>`;\n\n$.fn.editable.defaults.ajaxOptions = { type: 'PATCH' };\n\n$.fn.editable.defaults.emptytext = 'Κενό';\n\n$.fn.editable.defaults.display = function (value) {\n  let $element = $(this);\n\n  switch($element.data('format')) {\n  case 'currency':\n    $element.text('€ ' + value);\n    break;\n  case 'percentage':\n    $element.text(value + '%');\n    break;\n  default:\n    $element.text(value);\n  }\n};\n\n$.fn.editable.defaults.success = function () {\n  if($(this).data('refresh')) {\n    location.reload();\n  }\n\n  return null;\n};\n\n$(() => {\n  $('.x-editable').editable({\n    params: ({ name, value }) => {\n      return { [name]: value };\n    }\n  });\n});\n","/*\n * jQuery File Upload Plugin\n * https://github.com/blueimp/jQuery-File-Upload\n *\n * Copyright 2010, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n */\n\n/* jshint nomen:false */\n/* global define, require, window, document, location, Blob, FormData */\n\n;(function (factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        // Register as an anonymous AMD module:\n        define([\n            'jquery',\n            'jquery-ui/ui/widget'\n        ], factory);\n    } else if (typeof exports === 'object') {\n        // Node/CommonJS:\n        factory(\n            require('jquery'),\n            require('./vendor/jquery.ui.widget')\n        );\n    } else {\n        // Browser globals:\n        factory(window.jQuery);\n    }\n}(function ($) {\n    'use strict';\n\n    // Detect file input support, based on\n    // http://viljamis.com/blog/2012/file-upload-support-on-mobile/\n    $.support.fileInput = !(new RegExp(\n        // Handle devices which give false positives for the feature detection:\n        '(Android (1\\\\.[0156]|2\\\\.[01]))' +\n            '|(Windows Phone (OS 7|8\\\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +\n            '|(w(eb)?OSBrowser)|(webOS)' +\n            '|(Kindle/(1\\\\.0|2\\\\.[05]|3\\\\.0))'\n    ).test(window.navigator.userAgent) ||\n        // Feature detection for all other devices:\n        $('<input type=\"file\"/>').prop('disabled'));\n\n    // The FileReader API is not actually used, but works as feature detection,\n    // as some Safari versions (5?) support XHR file uploads via the FormData API,\n    // but not non-multipart XHR file uploads.\n    // window.XMLHttpRequestUpload is not available on IE10, so we check for\n    // window.ProgressEvent instead to detect XHR2 file upload capability:\n    $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);\n    $.support.xhrFormDataFileUpload = !!window.FormData;\n\n    // Detect support for Blob slicing (required for chunked uploads):\n    $.support.blobSlice = window.Blob && (Blob.prototype.slice ||\n        Blob.prototype.webkitSlice || Blob.prototype.mozSlice);\n\n    // Helper function to create drag handlers for dragover/dragenter/dragleave:\n    function getDragHandler(type) {\n        var isDragOver = type === 'dragover';\n        return function (e) {\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n            var dataTransfer = e.dataTransfer;\n            if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&\n                    this._trigger(\n                        type,\n                        $.Event(type, {delegatedEvent: e})\n                    ) !== false) {\n                e.preventDefault();\n                if (isDragOver) {\n                    dataTransfer.dropEffect = 'copy';\n                }\n            }\n        };\n    }\n\n    // The fileupload widget listens for change events on file input fields defined\n    // via fileInput setting and paste or drop events of the given dropZone.\n    // In addition to the default jQuery Widget methods, the fileupload widget\n    // exposes the \"add\" and \"send\" methods, to add or directly send files using\n    // the fileupload API.\n    // By default, files added via file input selection, paste, drag & drop or\n    // \"add\" method are uploaded immediately, but it is possible to override\n    // the \"add\" callback option to queue file uploads.\n    $.widget('blueimp.fileupload', {\n\n        options: {\n            // The drop target element(s), by the default the complete document.\n            // Set to null to disable drag & drop support:\n            dropZone: $(document),\n            // The paste target element(s), by the default undefined.\n            // Set to a DOM node or jQuery object to enable file pasting:\n            pasteZone: undefined,\n            // The file input field(s), that are listened to for change events.\n            // If undefined, it is set to the file input fields inside\n            // of the widget element on plugin initialization.\n            // Set to null to disable the change listener.\n            fileInput: undefined,\n            // By default, the file input field is replaced with a clone after\n            // each input field change event. This is required for iframe transport\n            // queues and allows change events to be fired for the same file\n            // selection, but can be disabled by setting the following option to false:\n            replaceFileInput: true,\n            // The parameter name for the file form data (the request argument name).\n            // If undefined or empty, the name property of the file input field is\n            // used, or \"files[]\" if the file input name property is also empty,\n            // can be a string or an array of strings:\n            paramName: undefined,\n            // By default, each file of a selection is uploaded using an individual\n            // request for XHR type uploads. Set to false to upload file\n            // selections in one request each:\n            singleFileUploads: true,\n            // To limit the number of files uploaded with one XHR request,\n            // set the following option to an integer greater than 0:\n            limitMultiFileUploads: undefined,\n            // The following option limits the number of files uploaded with one\n            // XHR request to keep the request size under or equal to the defined\n            // limit in bytes:\n            limitMultiFileUploadSize: undefined,\n            // Multipart file uploads add a number of bytes to each uploaded file,\n            // therefore the following option adds an overhead for each file used\n            // in the limitMultiFileUploadSize configuration:\n            limitMultiFileUploadSizeOverhead: 512,\n            // Set the following option to true to issue all file upload requests\n            // in a sequential order:\n            sequentialUploads: false,\n            // To limit the number of concurrent uploads,\n            // set the following option to an integer greater than 0:\n            limitConcurrentUploads: undefined,\n            // Set the following option to true to force iframe transport uploads:\n            forceIframeTransport: false,\n            // Set the following option to the location of a redirect url on the\n            // origin server, for cross-domain iframe transport uploads:\n            redirect: undefined,\n            // The parameter name for the redirect url, sent as part of the form\n            // data and set to 'redirect' if this option is empty:\n            redirectParamName: undefined,\n            // Set the following option to the location of a postMessage window,\n            // to enable postMessage transport uploads:\n            postMessage: undefined,\n            // By default, XHR file uploads are sent as multipart/form-data.\n            // The iframe transport is always using multipart/form-data.\n            // Set to false to enable non-multipart XHR uploads:\n            multipart: true,\n            // To upload large files in smaller chunks, set the following option\n            // to a preferred maximum chunk size. If set to 0, null or undefined,\n            // or the browser does not support the required Blob API, files will\n            // be uploaded as a whole.\n            maxChunkSize: undefined,\n            // When a non-multipart upload or a chunked multipart upload has been\n            // aborted, this option can be used to resume the upload by setting\n            // it to the size of the already uploaded bytes. This option is most\n            // useful when modifying the options object inside of the \"add\" or\n            // \"send\" callbacks, as the options are cloned for each file upload.\n            uploadedBytes: undefined,\n            // By default, failed (abort or error) file uploads are removed from the\n            // global progress calculation. Set the following option to false to\n            // prevent recalculating the global progress data:\n            recalculateProgress: true,\n            // Interval in milliseconds to calculate and trigger progress events:\n            progressInterval: 100,\n            // Interval in milliseconds to calculate progress bitrate:\n            bitrateInterval: 500,\n            // By default, uploads are started automatically when adding files:\n            autoUpload: true,\n            // By default, duplicate file names are expected to be handled on\n            // the server-side. If this is not possible (e.g. when uploading\n            // files directly to Amazon S3), the following option can be set to\n            // an empty object or an object mapping existing filenames, e.g.:\n            // { \"image.jpg\": true, \"image (1).jpg\": true }\n            // If it is set, all files will be uploaded with unique filenames,\n            // adding increasing number suffixes if necessary, e.g.:\n            // \"image (2).jpg\"\n            uniqueFilenames: undefined,\n\n            // Error and info messages:\n            messages: {\n                uploadedBytes: 'Uploaded bytes exceed file size'\n            },\n\n            // Translation function, gets the message key to be translated\n            // and an object with context specific data as arguments:\n            i18n: function (message, context) {\n                message = this.messages[message] || message.toString();\n                if (context) {\n                    $.each(context, function (key, value) {\n                        message = message.replace('{' + key + '}', value);\n                    });\n                }\n                return message;\n            },\n\n            // Additional form data to be sent along with the file uploads can be set\n            // using this option, which accepts an array of objects with name and\n            // value properties, a function returning such an array, a FormData\n            // object (for XHR file uploads), or a simple object.\n            // The form of the first fileInput is given as parameter to the function:\n            formData: function (form) {\n                return form.serializeArray();\n            },\n\n            // The add callback is invoked as soon as files are added to the fileupload\n            // widget (via file input selection, drag & drop, paste or add API call).\n            // If the singleFileUploads option is enabled, this callback will be\n            // called once for each file in the selection for XHR file uploads, else\n            // once for each file selection.\n            //\n            // The upload starts when the submit method is invoked on the data parameter.\n            // The data object contains a files property holding the added files\n            // and allows you to override plugin options as well as define ajax settings.\n            //\n            // Listeners for this callback can also be bound the following way:\n            // .bind('fileuploadadd', func);\n            //\n            // data.submit() returns a Promise object and allows to attach additional\n            // handlers using jQuery's Deferred callbacks:\n            // data.submit().done(func).fail(func).always(func);\n            add: function (e, data) {\n                if (e.isDefaultPrevented()) {\n                    return false;\n                }\n                if (data.autoUpload || (data.autoUpload !== false &&\n                        $(this).fileupload('option', 'autoUpload'))) {\n                    data.process().done(function () {\n                        data.submit();\n                    });\n                }\n            },\n\n            // Other callbacks:\n\n            // Callback for the submit event of each file upload:\n            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);\n\n            // Callback for the start of each file upload request:\n            // send: function (e, data) {}, // .bind('fileuploadsend', func);\n\n            // Callback for successful uploads:\n            // done: function (e, data) {}, // .bind('fileuploaddone', func);\n\n            // Callback for failed (abort or error) uploads:\n            // fail: function (e, data) {}, // .bind('fileuploadfail', func);\n\n            // Callback for completed (success, abort or error) requests:\n            // always: function (e, data) {}, // .bind('fileuploadalways', func);\n\n            // Callback for upload progress events:\n            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);\n\n            // Callback for global upload progress events:\n            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);\n\n            // Callback for uploads start, equivalent to the global ajaxStart event:\n            // start: function (e) {}, // .bind('fileuploadstart', func);\n\n            // Callback for uploads stop, equivalent to the global ajaxStop event:\n            // stop: function (e) {}, // .bind('fileuploadstop', func);\n\n            // Callback for change events of the fileInput(s):\n            // change: function (e, data) {}, // .bind('fileuploadchange', func);\n\n            // Callback for paste events to the pasteZone(s):\n            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);\n\n            // Callback for drop events of the dropZone(s):\n            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);\n\n            // Callback for dragover events of the dropZone(s):\n            // dragover: function (e) {}, // .bind('fileuploaddragover', func);\n\n            // Callback before the start of each chunk upload request (before form data initialization):\n            // chunkbeforesend: function (e, data) {}, // .bind('fileuploadchunkbeforesend', func);\n\n            // Callback for the start of each chunk upload request:\n            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);\n\n            // Callback for successful chunk uploads:\n            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);\n\n            // Callback for failed (abort or error) chunk uploads:\n            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);\n\n            // Callback for completed (success, abort or error) chunk upload requests:\n            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);\n\n            // The plugin options are used as settings object for the ajax calls.\n            // The following are jQuery ajax settings required for the file uploads:\n            processData: false,\n            contentType: false,\n            cache: false,\n            timeout: 0\n        },\n\n        // A list of options that require reinitializing event listeners and/or\n        // special initialization code:\n        _specialOptions: [\n            'fileInput',\n            'dropZone',\n            'pasteZone',\n            'multipart',\n            'forceIframeTransport'\n        ],\n\n        _blobSlice: $.support.blobSlice && function () {\n            var slice = this.slice || this.webkitSlice || this.mozSlice;\n            return slice.apply(this, arguments);\n        },\n\n        _BitrateTimer: function () {\n            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());\n            this.loaded = 0;\n            this.bitrate = 0;\n            this.getBitrate = function (now, loaded, interval) {\n                var timeDiff = now - this.timestamp;\n                if (!this.bitrate || !interval || timeDiff > interval) {\n                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;\n                    this.loaded = loaded;\n                    this.timestamp = now;\n                }\n                return this.bitrate;\n            };\n        },\n\n        _isXHRUpload: function (options) {\n            return !options.forceIframeTransport &&\n                ((!options.multipart && $.support.xhrFileUpload) ||\n                $.support.xhrFormDataFileUpload);\n        },\n\n        _getFormData: function (options) {\n            var formData;\n            if ($.type(options.formData) === 'function') {\n                return options.formData(options.form);\n            }\n            if ($.isArray(options.formData)) {\n                return options.formData;\n            }\n            if ($.type(options.formData) === 'object') {\n                formData = [];\n                $.each(options.formData, function (name, value) {\n                    formData.push({name: name, value: value});\n                });\n                return formData;\n            }\n            return [];\n        },\n\n        _getTotal: function (files) {\n            var total = 0;\n            $.each(files, function (index, file) {\n                total += file.size || 1;\n            });\n            return total;\n        },\n\n        _initProgressObject: function (obj) {\n            var progress = {\n                loaded: 0,\n                total: 0,\n                bitrate: 0\n            };\n            if (obj._progress) {\n                $.extend(obj._progress, progress);\n            } else {\n                obj._progress = progress;\n            }\n        },\n\n        _initResponseObject: function (obj) {\n            var prop;\n            if (obj._response) {\n                for (prop in obj._response) {\n                    if (obj._response.hasOwnProperty(prop)) {\n                        delete obj._response[prop];\n                    }\n                }\n            } else {\n                obj._response = {};\n            }\n        },\n\n        _onProgress: function (e, data) {\n            if (e.lengthComputable) {\n                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),\n                    loaded;\n                if (data._time && data.progressInterval &&\n                        (now - data._time < data.progressInterval) &&\n                        e.loaded !== e.total) {\n                    return;\n                }\n                data._time = now;\n                loaded = Math.floor(\n                    e.loaded / e.total * (data.chunkSize || data._progress.total)\n                ) + (data.uploadedBytes || 0);\n                // Add the difference from the previously loaded state\n                // to the global loaded counter:\n                this._progress.loaded += (loaded - data._progress.loaded);\n                this._progress.bitrate = this._bitrateTimer.getBitrate(\n                    now,\n                    this._progress.loaded,\n                    data.bitrateInterval\n                );\n                data._progress.loaded = data.loaded = loaded;\n                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(\n                    now,\n                    loaded,\n                    data.bitrateInterval\n                );\n                // Trigger a custom progress event with a total data property set\n                // to the file size(s) of the current upload and a loaded data\n                // property calculated accordingly:\n                this._trigger(\n                    'progress',\n                    $.Event('progress', {delegatedEvent: e}),\n                    data\n                );\n                // Trigger a global progress event for all current file uploads,\n                // including ajax calls queued for sequential file uploads:\n                this._trigger(\n                    'progressall',\n                    $.Event('progressall', {delegatedEvent: e}),\n                    this._progress\n                );\n            }\n        },\n\n        _initProgressListener: function (options) {\n            var that = this,\n                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();\n            // Accesss to the native XHR object is required to add event listeners\n            // for the upload progress event:\n            if (xhr.upload) {\n                $(xhr.upload).bind('progress', function (e) {\n                    var oe = e.originalEvent;\n                    // Make sure the progress event properties get copied over:\n                    e.lengthComputable = oe.lengthComputable;\n                    e.loaded = oe.loaded;\n                    e.total = oe.total;\n                    that._onProgress(e, options);\n                });\n                options.xhr = function () {\n                    return xhr;\n                };\n            }\n        },\n\n        _deinitProgressListener: function (options) {\n            var xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();\n            if (xhr.upload) {\n                $(xhr.upload).unbind('progress');\n            }\n        },\n\n        _isInstanceOf: function (type, obj) {\n            // Cross-frame instanceof check\n            return Object.prototype.toString.call(obj) === '[object ' + type + ']';\n        },\n\n        _getUniqueFilename: function (name, map) {\n            name = String(name);\n            if (map[name]) {\n                name = name.replace(\n                    /(?: \\(([\\d]+)\\))?(\\.[^.]+)?$/,\n                    function (_, p1, p2) {\n                        var index = p1 ? Number(p1) + 1 : 1;\n                        var ext = p2 || '';\n                        return ' (' + index + ')' + ext;\n                    }\n                );\n                return this._getUniqueFilename(name, map);\n            }\n            map[name] = true;\n            return name;\n        },\n\n        _initXHRData: function (options) {\n            var that = this,\n                formData,\n                file = options.files[0],\n                // Ignore non-multipart setting if not supported:\n                multipart = options.multipart || !$.support.xhrFileUpload,\n                paramName = $.type(options.paramName) === 'array' ?\n                    options.paramName[0] : options.paramName;\n            options.headers = $.extend({}, options.headers);\n            if (options.contentRange) {\n                options.headers['Content-Range'] = options.contentRange;\n            }\n            if (!multipart || options.blob || !this._isInstanceOf('File', file)) {\n                options.headers['Content-Disposition'] = 'attachment; filename=\"' +\n                    encodeURI(file.uploadName || file.name) + '\"';\n            }\n            if (!multipart) {\n                options.contentType = file.type || 'application/octet-stream';\n                options.data = options.blob || file;\n            } else if ($.support.xhrFormDataFileUpload) {\n                if (options.postMessage) {\n                    // window.postMessage does not allow sending FormData\n                    // objects, so we just add the File/Blob objects to\n                    // the formData array and let the postMessage window\n                    // create the FormData object out of this array:\n                    formData = this._getFormData(options);\n                    if (options.blob) {\n                        formData.push({\n                            name: paramName,\n                            value: options.blob\n                        });\n                    } else {\n                        $.each(options.files, function (index, file) {\n                            formData.push({\n                                name: ($.type(options.paramName) === 'array' &&\n                                    options.paramName[index]) || paramName,\n                                value: file\n                            });\n                        });\n                    }\n                } else {\n                    if (that._isInstanceOf('FormData', options.formData)) {\n                        formData = options.formData;\n                    } else {\n                        formData = new FormData();\n                        $.each(this._getFormData(options), function (index, field) {\n                            formData.append(field.name, field.value);\n                        });\n                    }\n                    if (options.blob) {\n                        formData.append(\n                            paramName,\n                            options.blob,\n                            file.uploadName || file.name\n                        );\n                    } else {\n                        $.each(options.files, function (index, file) {\n                            // This check allows the tests to run with\n                            // dummy objects:\n                            if (that._isInstanceOf('File', file) ||\n                                    that._isInstanceOf('Blob', file)) {\n                                var fileName = file.uploadName || file.name;\n                                if (options.uniqueFilenames) {\n                                    fileName = that._getUniqueFilename(\n                                        fileName,\n                                        options.uniqueFilenames\n                                    );\n                                }\n                                formData.append(\n                                    ($.type(options.paramName) === 'array' &&\n                                        options.paramName[index]) || paramName,\n                                    file,\n                                    fileName\n                                );\n                            }\n                        });\n                    }\n                }\n                options.data = formData;\n            }\n            // Blob reference is not needed anymore, free memory:\n            options.blob = null;\n        },\n\n        _initIframeSettings: function (options) {\n            var targetHost = $('<a></a>').prop('href', options.url).prop('host');\n            // Setting the dataType to iframe enables the iframe transport:\n            options.dataType = 'iframe ' + (options.dataType || '');\n            // The iframe transport accepts a serialized array as form data:\n            options.formData = this._getFormData(options);\n            // Add redirect url to form data on cross-domain uploads:\n            if (options.redirect && targetHost && targetHost !== location.host) {\n                options.formData.push({\n                    name: options.redirectParamName || 'redirect',\n                    value: options.redirect\n                });\n            }\n        },\n\n        _initDataSettings: function (options) {\n            if (this._isXHRUpload(options)) {\n                if (!this._chunkedUpload(options, true)) {\n                    if (!options.data) {\n                        this._initXHRData(options);\n                    }\n                    this._initProgressListener(options);\n                }\n                if (options.postMessage) {\n                    // Setting the dataType to postmessage enables the\n                    // postMessage transport:\n                    options.dataType = 'postmessage ' + (options.dataType || '');\n                }\n            } else {\n                this._initIframeSettings(options);\n            }\n        },\n\n        _getParamName: function (options) {\n            var fileInput = $(options.fileInput),\n                paramName = options.paramName;\n            if (!paramName) {\n                paramName = [];\n                fileInput.each(function () {\n                    var input = $(this),\n                        name = input.prop('name') || 'files[]',\n                        i = (input.prop('files') || [1]).length;\n                    while (i) {\n                        paramName.push(name);\n                        i -= 1;\n                    }\n                });\n                if (!paramName.length) {\n                    paramName = [fileInput.prop('name') || 'files[]'];\n                }\n            } else if (!$.isArray(paramName)) {\n                paramName = [paramName];\n            }\n            return paramName;\n        },\n\n        _initFormSettings: function (options) {\n            // Retrieve missing options from the input field and the\n            // associated form, if available:\n            if (!options.form || !options.form.length) {\n                options.form = $(options.fileInput.prop('form'));\n                // If the given file input doesn't have an associated form,\n                // use the default widget file input's form:\n                if (!options.form.length) {\n                    options.form = $(this.options.fileInput.prop('form'));\n                }\n            }\n            options.paramName = this._getParamName(options);\n            if (!options.url) {\n                options.url = options.form.prop('action') || location.href;\n            }\n            // The HTTP request method must be \"POST\" or \"PUT\":\n            options.type = (options.type ||\n                ($.type(options.form.prop('method')) === 'string' &&\n                    options.form.prop('method')) || ''\n                ).toUpperCase();\n            if (options.type !== 'POST' && options.type !== 'PUT' &&\n                    options.type !== 'PATCH') {\n                options.type = 'POST';\n            }\n            if (!options.formAcceptCharset) {\n                options.formAcceptCharset = options.form.attr('accept-charset');\n            }\n        },\n\n        _getAJAXSettings: function (data) {\n            var options = $.extend({}, this.options, data);\n            this._initFormSettings(options);\n            this._initDataSettings(options);\n            return options;\n        },\n\n        // jQuery 1.6 doesn't provide .state(),\n        // while jQuery 1.8+ removed .isRejected() and .isResolved():\n        _getDeferredState: function (deferred) {\n            if (deferred.state) {\n                return deferred.state();\n            }\n            if (deferred.isResolved()) {\n                return 'resolved';\n            }\n            if (deferred.isRejected()) {\n                return 'rejected';\n            }\n            return 'pending';\n        },\n\n        // Maps jqXHR callbacks to the equivalent\n        // methods of the given Promise object:\n        _enhancePromise: function (promise) {\n            promise.success = promise.done;\n            promise.error = promise.fail;\n            promise.complete = promise.always;\n            return promise;\n        },\n\n        // Creates and returns a Promise object enhanced with\n        // the jqXHR methods abort, success, error and complete:\n        _getXHRPromise: function (resolveOrReject, context, args) {\n            var dfd = $.Deferred(),\n                promise = dfd.promise();\n            context = context || this.options.context || promise;\n            if (resolveOrReject === true) {\n                dfd.resolveWith(context, args);\n            } else if (resolveOrReject === false) {\n                dfd.rejectWith(context, args);\n            }\n            promise.abort = dfd.promise;\n            return this._enhancePromise(promise);\n        },\n\n        // Adds convenience methods to the data callback argument:\n        _addConvenienceMethods: function (e, data) {\n            var that = this,\n                getPromise = function (args) {\n                    return $.Deferred().resolveWith(that, args).promise();\n                };\n            data.process = function (resolveFunc, rejectFunc) {\n                if (resolveFunc || rejectFunc) {\n                    data._processQueue = this._processQueue =\n                        (this._processQueue || getPromise([this])).then(\n                            function () {\n                                if (data.errorThrown) {\n                                    return $.Deferred()\n                                        .rejectWith(that, [data]).promise();\n                                }\n                                return getPromise(arguments);\n                            }\n                        ).then(resolveFunc, rejectFunc);\n                }\n                return this._processQueue || getPromise([this]);\n            };\n            data.submit = function () {\n                if (this.state() !== 'pending') {\n                    data.jqXHR = this.jqXHR =\n                        (that._trigger(\n                            'submit',\n                            $.Event('submit', {delegatedEvent: e}),\n                            this\n                        ) !== false) && that._onSend(e, this);\n                }\n                return this.jqXHR || that._getXHRPromise();\n            };\n            data.abort = function () {\n                if (this.jqXHR) {\n                    return this.jqXHR.abort();\n                }\n                this.errorThrown = 'abort';\n                that._trigger('fail', null, this);\n                return that._getXHRPromise(false);\n            };\n            data.state = function () {\n                if (this.jqXHR) {\n                    return that._getDeferredState(this.jqXHR);\n                }\n                if (this._processQueue) {\n                    return that._getDeferredState(this._processQueue);\n                }\n            };\n            data.processing = function () {\n                return !this.jqXHR && this._processQueue && that\n                    ._getDeferredState(this._processQueue) === 'pending';\n            };\n            data.progress = function () {\n                return this._progress;\n            };\n            data.response = function () {\n                return this._response;\n            };\n        },\n\n        // Parses the Range header from the server response\n        // and returns the uploaded bytes:\n        _getUploadedBytes: function (jqXHR) {\n            var range = jqXHR.getResponseHeader('Range'),\n                parts = range && range.split('-'),\n                upperBytesPos = parts && parts.length > 1 &&\n                    parseInt(parts[1], 10);\n            return upperBytesPos && upperBytesPos + 1;\n        },\n\n        // Uploads a file in multiple, sequential requests\n        // by splitting the file up in multiple blob chunks.\n        // If the second parameter is true, only tests if the file\n        // should be uploaded in chunks, but does not invoke any\n        // upload requests:\n        _chunkedUpload: function (options, testOnly) {\n            options.uploadedBytes = options.uploadedBytes || 0;\n            var that = this,\n                file = options.files[0],\n                fs = file.size,\n                ub = options.uploadedBytes,\n                mcs = options.maxChunkSize || fs,\n                slice = this._blobSlice,\n                dfd = $.Deferred(),\n                promise = dfd.promise(),\n                jqXHR,\n                upload;\n            if (!(this._isXHRUpload(options) && slice && (ub || ($.type(mcs) === 'function' ? mcs(options) : mcs) < fs)) ||\n                    options.data) {\n                return false;\n            }\n            if (testOnly) {\n                return true;\n            }\n            if (ub >= fs) {\n                file.error = options.i18n('uploadedBytes');\n                return this._getXHRPromise(\n                    false,\n                    options.context,\n                    [null, 'error', file.error]\n                );\n            }\n            // The chunk upload method:\n            upload = function () {\n                // Clone the options object for each chunk upload:\n                var o = $.extend({}, options),\n                    currentLoaded = o._progress.loaded;\n                o.blob = slice.call(\n                    file,\n                    ub,\n                    ub + ($.type(mcs) === 'function' ? mcs(o) : mcs),\n                    file.type\n                );\n                // Store the current chunk size, as the blob itself\n                // will be dereferenced after data processing:\n                o.chunkSize = o.blob.size;\n                // Expose the chunk bytes position range:\n                o.contentRange = 'bytes ' + ub + '-' +\n                    (ub + o.chunkSize - 1) + '/' + fs;\n                // Trigger chunkbeforesend to allow form data to be updated for this chunk\n                that._trigger('chunkbeforesend', null, o);\n                // Process the upload data (the blob and potential form data):\n                that._initXHRData(o);\n                // Add progress listeners for this chunk upload:\n                that._initProgressListener(o);\n                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||\n                        that._getXHRPromise(false, o.context))\n                    .done(function (result, textStatus, jqXHR) {\n                        ub = that._getUploadedBytes(jqXHR) ||\n                            (ub + o.chunkSize);\n                        // Create a progress event if no final progress event\n                        // with loaded equaling total has been triggered\n                        // for this chunk:\n                        if (currentLoaded + o.chunkSize - o._progress.loaded) {\n                            that._onProgress($.Event('progress', {\n                                lengthComputable: true,\n                                loaded: ub - o.uploadedBytes,\n                                total: ub - o.uploadedBytes\n                            }), o);\n                        }\n                        options.uploadedBytes = o.uploadedBytes = ub;\n                        o.result = result;\n                        o.textStatus = textStatus;\n                        o.jqXHR = jqXHR;\n                        that._trigger('chunkdone', null, o);\n                        that._trigger('chunkalways', null, o);\n                        if (ub < fs) {\n                            // File upload not yet complete,\n                            // continue with the next chunk:\n                            upload();\n                        } else {\n                            dfd.resolveWith(\n                                o.context,\n                                [result, textStatus, jqXHR]\n                            );\n                        }\n                    })\n                    .fail(function (jqXHR, textStatus, errorThrown) {\n                        o.jqXHR = jqXHR;\n                        o.textStatus = textStatus;\n                        o.errorThrown = errorThrown;\n                        that._trigger('chunkfail', null, o);\n                        that._trigger('chunkalways', null, o);\n                        dfd.rejectWith(\n                            o.context,\n                            [jqXHR, textStatus, errorThrown]\n                        );\n                    })\n                    .always(function () {\n                        that._deinitProgressListener(o);\n                    });\n            };\n            this._enhancePromise(promise);\n            promise.abort = function () {\n                return jqXHR.abort();\n            };\n            upload();\n            return promise;\n        },\n\n        _beforeSend: function (e, data) {\n            if (this._active === 0) {\n                // the start callback is triggered when an upload starts\n                // and no other uploads are currently running,\n                // equivalent to the global ajaxStart event:\n                this._trigger('start');\n                // Set timer for global bitrate progress calculation:\n                this._bitrateTimer = new this._BitrateTimer();\n                // Reset the global progress values:\n                this._progress.loaded = this._progress.total = 0;\n                this._progress.bitrate = 0;\n            }\n            // Make sure the container objects for the .response() and\n            // .progress() methods on the data object are available\n            // and reset to their initial state:\n            this._initResponseObject(data);\n            this._initProgressObject(data);\n            data._progress.loaded = data.loaded = data.uploadedBytes || 0;\n            data._progress.total = data.total = this._getTotal(data.files) || 1;\n            data._progress.bitrate = data.bitrate = 0;\n            this._active += 1;\n            // Initialize the global progress values:\n            this._progress.loaded += data.loaded;\n            this._progress.total += data.total;\n        },\n\n        _onDone: function (result, textStatus, jqXHR, options) {\n            var total = options._progress.total,\n                response = options._response;\n            if (options._progress.loaded < total) {\n                // Create a progress event if no final progress event\n                // with loaded equaling total has been triggered:\n                this._onProgress($.Event('progress', {\n                    lengthComputable: true,\n                    loaded: total,\n                    total: total\n                }), options);\n            }\n            response.result = options.result = result;\n            response.textStatus = options.textStatus = textStatus;\n            response.jqXHR = options.jqXHR = jqXHR;\n            this._trigger('done', null, options);\n        },\n\n        _onFail: function (jqXHR, textStatus, errorThrown, options) {\n            var response = options._response;\n            if (options.recalculateProgress) {\n                // Remove the failed (error or abort) file upload from\n                // the global progress calculation:\n                this._progress.loaded -= options._progress.loaded;\n                this._progress.total -= options._progress.total;\n            }\n            response.jqXHR = options.jqXHR = jqXHR;\n            response.textStatus = options.textStatus = textStatus;\n            response.errorThrown = options.errorThrown = errorThrown;\n            this._trigger('fail', null, options);\n        },\n\n        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {\n            // jqXHRorResult, textStatus and jqXHRorError are added to the\n            // options object via done and fail callbacks\n            this._trigger('always', null, options);\n        },\n\n        _onSend: function (e, data) {\n            if (!data.submit) {\n                this._addConvenienceMethods(e, data);\n            }\n            var that = this,\n                jqXHR,\n                aborted,\n                slot,\n                pipe,\n                options = that._getAJAXSettings(data),\n                send = function () {\n                    that._sending += 1;\n                    // Set timer for bitrate progress calculation:\n                    options._bitrateTimer = new that._BitrateTimer();\n                    jqXHR = jqXHR || (\n                        ((aborted || that._trigger(\n                            'send',\n                            $.Event('send', {delegatedEvent: e}),\n                            options\n                        ) === false) &&\n                        that._getXHRPromise(false, options.context, aborted)) ||\n                        that._chunkedUpload(options) || $.ajax(options)\n                    ).done(function (result, textStatus, jqXHR) {\n                        that._onDone(result, textStatus, jqXHR, options);\n                    }).fail(function (jqXHR, textStatus, errorThrown) {\n                        that._onFail(jqXHR, textStatus, errorThrown, options);\n                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {\n                        that._deinitProgressListener(options);\n                        that._onAlways(\n                            jqXHRorResult,\n                            textStatus,\n                            jqXHRorError,\n                            options\n                        );\n                        that._sending -= 1;\n                        that._active -= 1;\n                        if (options.limitConcurrentUploads &&\n                                options.limitConcurrentUploads > that._sending) {\n                            // Start the next queued upload,\n                            // that has not been aborted:\n                            var nextSlot = that._slots.shift();\n                            while (nextSlot) {\n                                if (that._getDeferredState(nextSlot) === 'pending') {\n                                    nextSlot.resolve();\n                                    break;\n                                }\n                                nextSlot = that._slots.shift();\n                            }\n                        }\n                        if (that._active === 0) {\n                            // The stop callback is triggered when all uploads have\n                            // been completed, equivalent to the global ajaxStop event:\n                            that._trigger('stop');\n                        }\n                    });\n                    return jqXHR;\n                };\n            this._beforeSend(e, options);\n            if (this.options.sequentialUploads ||\n                    (this.options.limitConcurrentUploads &&\n                    this.options.limitConcurrentUploads <= this._sending)) {\n                if (this.options.limitConcurrentUploads > 1) {\n                    slot = $.Deferred();\n                    this._slots.push(slot);\n                    pipe = slot.then(send);\n                } else {\n                    this._sequence = this._sequence.then(send, send);\n                    pipe = this._sequence;\n                }\n                // Return the piped Promise object, enhanced with an abort method,\n                // which is delegated to the jqXHR object of the current upload,\n                // and jqXHR callbacks mapped to the equivalent Promise methods:\n                pipe.abort = function () {\n                    aborted = [undefined, 'abort', 'abort'];\n                    if (!jqXHR) {\n                        if (slot) {\n                            slot.rejectWith(options.context, aborted);\n                        }\n                        return send();\n                    }\n                    return jqXHR.abort();\n                };\n                return this._enhancePromise(pipe);\n            }\n            return send();\n        },\n\n        _onAdd: function (e, data) {\n            var that = this,\n                result = true,\n                options = $.extend({}, this.options, data),\n                files = data.files,\n                filesLength = files.length,\n                limit = options.limitMultiFileUploads,\n                limitSize = options.limitMultiFileUploadSize,\n                overhead = options.limitMultiFileUploadSizeOverhead,\n                batchSize = 0,\n                paramName = this._getParamName(options),\n                paramNameSet,\n                paramNameSlice,\n                fileSet,\n                i,\n                j = 0;\n            if (!filesLength) {\n                return false;\n            }\n            if (limitSize && files[0].size === undefined) {\n                limitSize = undefined;\n            }\n            if (!(options.singleFileUploads || limit || limitSize) ||\n                    !this._isXHRUpload(options)) {\n                fileSet = [files];\n                paramNameSet = [paramName];\n            } else if (!(options.singleFileUploads || limitSize) && limit) {\n                fileSet = [];\n                paramNameSet = [];\n                for (i = 0; i < filesLength; i += limit) {\n                    fileSet.push(files.slice(i, i + limit));\n                    paramNameSlice = paramName.slice(i, i + limit);\n                    if (!paramNameSlice.length) {\n                        paramNameSlice = paramName;\n                    }\n                    paramNameSet.push(paramNameSlice);\n                }\n            } else if (!options.singleFileUploads && limitSize) {\n                fileSet = [];\n                paramNameSet = [];\n                for (i = 0; i < filesLength; i = i + 1) {\n                    batchSize += files[i].size + overhead;\n                    if (i + 1 === filesLength ||\n                            ((batchSize + files[i + 1].size + overhead) > limitSize) ||\n                            (limit && i + 1 - j >= limit)) {\n                        fileSet.push(files.slice(j, i + 1));\n                        paramNameSlice = paramName.slice(j, i + 1);\n                        if (!paramNameSlice.length) {\n                            paramNameSlice = paramName;\n                        }\n                        paramNameSet.push(paramNameSlice);\n                        j = i + 1;\n                        batchSize = 0;\n                    }\n                }\n            } else {\n                paramNameSet = paramName;\n            }\n            data.originalFiles = files;\n            $.each(fileSet || files, function (index, element) {\n                var newData = $.extend({}, data);\n                newData.files = fileSet ? element : [element];\n                newData.paramName = paramNameSet[index];\n                that._initResponseObject(newData);\n                that._initProgressObject(newData);\n                that._addConvenienceMethods(e, newData);\n                result = that._trigger(\n                    'add',\n                    $.Event('add', {delegatedEvent: e}),\n                    newData\n                );\n                return result;\n            });\n            return result;\n        },\n\n        _replaceFileInput: function (data) {\n            var input = data.fileInput,\n                inputClone = input.clone(true),\n                restoreFocus = input.is(document.activeElement);\n            // Add a reference for the new cloned file input to the data argument:\n            data.fileInputClone = inputClone;\n            $('<form></form>').append(inputClone)[0].reset();\n            // Detaching allows to insert the fileInput on another form\n            // without loosing the file input value:\n            input.after(inputClone).detach();\n            // If the fileInput had focus before it was detached,\n            // restore focus to the inputClone.\n            if (restoreFocus) {\n                inputClone.focus();\n            }\n            // Avoid memory leaks with the detached file input:\n            $.cleanData(input.unbind('remove'));\n            // Replace the original file input element in the fileInput\n            // elements set with the clone, which has been copied including\n            // event handlers:\n            this.options.fileInput = this.options.fileInput.map(function (i, el) {\n                if (el === input[0]) {\n                    return inputClone[0];\n                }\n                return el;\n            });\n            // If the widget has been initialized on the file input itself,\n            // override this.element with the file input clone:\n            if (input[0] === this.element[0]) {\n                this.element = inputClone;\n            }\n        },\n\n        _handleFileTreeEntry: function (entry, path) {\n            var that = this,\n                dfd = $.Deferred(),\n                entries = [],\n                dirReader,\n                errorHandler = function (e) {\n                    if (e && !e.entry) {\n                        e.entry = entry;\n                    }\n                    // Since $.when returns immediately if one\n                    // Deferred is rejected, we use resolve instead.\n                    // This allows valid files and invalid items\n                    // to be returned together in one set:\n                    dfd.resolve([e]);\n                },\n                successHandler = function (entries) {\n                    that._handleFileTreeEntries(\n                        entries,\n                        path + entry.name + '/'\n                    ).done(function (files) {\n                        dfd.resolve(files);\n                    }).fail(errorHandler);\n                },\n                readEntries = function () {\n                    dirReader.readEntries(function (results) {\n                        if (!results.length) {\n                            successHandler(entries);\n                        } else {\n                            entries = entries.concat(results);\n                            readEntries();\n                        }\n                    }, errorHandler);\n                };\n            path = path || '';\n            if (entry.isFile) {\n                if (entry._file) {\n                    // Workaround for Chrome bug #149735\n                    entry._file.relativePath = path;\n                    dfd.resolve(entry._file);\n                } else {\n                    entry.file(function (file) {\n                        file.relativePath = path;\n                        dfd.resolve(file);\n                    }, errorHandler);\n                }\n            } else if (entry.isDirectory) {\n                dirReader = entry.createReader();\n                readEntries();\n            } else {\n                // Return an empty list for file system items\n                // other than files or directories:\n                dfd.resolve([]);\n            }\n            return dfd.promise();\n        },\n\n        _handleFileTreeEntries: function (entries, path) {\n            var that = this;\n            return $.when.apply(\n                $,\n                $.map(entries, function (entry) {\n                    return that._handleFileTreeEntry(entry, path);\n                })\n            ).then(function () {\n                return Array.prototype.concat.apply(\n                    [],\n                    arguments\n                );\n            });\n        },\n\n        _getDroppedFiles: function (dataTransfer) {\n            dataTransfer = dataTransfer || {};\n            var items = dataTransfer.items;\n            if (items && items.length && (items[0].webkitGetAsEntry ||\n                    items[0].getAsEntry)) {\n                return this._handleFileTreeEntries(\n                    $.map(items, function (item) {\n                        var entry;\n                        if (item.webkitGetAsEntry) {\n                            entry = item.webkitGetAsEntry();\n                            if (entry) {\n                                // Workaround for Chrome bug #149735:\n                                entry._file = item.getAsFile();\n                            }\n                            return entry;\n                        }\n                        return item.getAsEntry();\n                    })\n                );\n            }\n            return $.Deferred().resolve(\n                $.makeArray(dataTransfer.files)\n            ).promise();\n        },\n\n        _getSingleFileInputFiles: function (fileInput) {\n            fileInput = $(fileInput);\n            var entries = fileInput.prop('webkitEntries') ||\n                    fileInput.prop('entries'),\n                files,\n                value;\n            if (entries && entries.length) {\n                return this._handleFileTreeEntries(entries);\n            }\n            files = $.makeArray(fileInput.prop('files'));\n            if (!files.length) {\n                value = fileInput.prop('value');\n                if (!value) {\n                    return $.Deferred().resolve([]).promise();\n                }\n                // If the files property is not available, the browser does not\n                // support the File API and we add a pseudo File object with\n                // the input value as name with path information removed:\n                files = [{name: value.replace(/^.*\\\\/, '')}];\n            } else if (files[0].name === undefined && files[0].fileName) {\n                // File normalization for Safari 4 and Firefox 3:\n                $.each(files, function (index, file) {\n                    file.name = file.fileName;\n                    file.size = file.fileSize;\n                });\n            }\n            return $.Deferred().resolve(files).promise();\n        },\n\n        _getFileInputFiles: function (fileInput) {\n            if (!(fileInput instanceof $) || fileInput.length === 1) {\n                return this._getSingleFileInputFiles(fileInput);\n            }\n            return $.when.apply(\n                $,\n                $.map(fileInput, this._getSingleFileInputFiles)\n            ).then(function () {\n                return Array.prototype.concat.apply(\n                    [],\n                    arguments\n                );\n            });\n        },\n\n        _onChange: function (e) {\n            var that = this,\n                data = {\n                    fileInput: $(e.target),\n                    form: $(e.target.form)\n                };\n            this._getFileInputFiles(data.fileInput).always(function (files) {\n                data.files = files;\n                if (that.options.replaceFileInput) {\n                    that._replaceFileInput(data);\n                }\n                if (that._trigger(\n                        'change',\n                        $.Event('change', {delegatedEvent: e}),\n                        data\n                    ) !== false) {\n                    that._onAdd(e, data);\n                }\n            });\n        },\n\n        _onPaste: function (e) {\n            var items = e.originalEvent && e.originalEvent.clipboardData &&\n                    e.originalEvent.clipboardData.items,\n                data = {files: []};\n            if (items && items.length) {\n                $.each(items, function (index, item) {\n                    var file = item.getAsFile && item.getAsFile();\n                    if (file) {\n                        data.files.push(file);\n                    }\n                });\n                if (this._trigger(\n                        'paste',\n                        $.Event('paste', {delegatedEvent: e}),\n                        data\n                    ) !== false) {\n                    this._onAdd(e, data);\n                }\n            }\n        },\n\n        _onDrop: function (e) {\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\n            var that = this,\n                dataTransfer = e.dataTransfer,\n                data = {};\n            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n                e.preventDefault();\n                this._getDroppedFiles(dataTransfer).always(function (files) {\n                    data.files = files;\n                    if (that._trigger(\n                            'drop',\n                            $.Event('drop', {delegatedEvent: e}),\n                            data\n                        ) !== false) {\n                        that._onAdd(e, data);\n                    }\n                });\n            }\n        },\n\n        _onDragOver: getDragHandler('dragover'),\n\n        _onDragEnter: getDragHandler('dragenter'),\n\n        _onDragLeave: getDragHandler('dragleave'),\n\n        _initEventHandlers: function () {\n            if (this._isXHRUpload(this.options)) {\n                this._on(this.options.dropZone, {\n                    dragover: this._onDragOver,\n                    drop: this._onDrop,\n                    // event.preventDefault() on dragenter is required for IE10+:\n                    dragenter: this._onDragEnter,\n                    // dragleave is not required, but added for completeness:\n                    dragleave: this._onDragLeave\n                });\n                this._on(this.options.pasteZone, {\n                    paste: this._onPaste\n                });\n            }\n            if ($.support.fileInput) {\n                this._on(this.options.fileInput, {\n                    change: this._onChange\n                });\n            }\n        },\n\n        _destroyEventHandlers: function () {\n            this._off(this.options.dropZone, 'dragenter dragleave dragover drop');\n            this._off(this.options.pasteZone, 'paste');\n            this._off(this.options.fileInput, 'change');\n        },\n\n        _destroy: function () {\n            this._destroyEventHandlers();\n        },\n\n        _setOption: function (key, value) {\n            var reinit = $.inArray(key, this._specialOptions) !== -1;\n            if (reinit) {\n                this._destroyEventHandlers();\n            }\n            this._super(key, value);\n            if (reinit) {\n                this._initSpecialOptions();\n                this._initEventHandlers();\n            }\n        },\n\n        _initSpecialOptions: function () {\n            var options = this.options;\n            if (options.fileInput === undefined) {\n                options.fileInput = this.element.is('input[type=\"file\"]') ?\n                        this.element : this.element.find('input[type=\"file\"]');\n            } else if (!(options.fileInput instanceof $)) {\n                options.fileInput = $(options.fileInput);\n            }\n            if (!(options.dropZone instanceof $)) {\n                options.dropZone = $(options.dropZone);\n            }\n            if (!(options.pasteZone instanceof $)) {\n                options.pasteZone = $(options.pasteZone);\n            }\n        },\n\n        _getRegExp: function (str) {\n            var parts = str.split('/'),\n                modifiers = parts.pop();\n            parts.shift();\n            return new RegExp(parts.join('/'), modifiers);\n        },\n\n        _isRegExpOption: function (key, value) {\n            return key !== 'url' && $.type(value) === 'string' &&\n                /^\\/.*\\/[igm]{0,3}$/.test(value);\n        },\n\n        _initDataAttributes: function () {\n            var that = this,\n                options = this.options,\n                data = this.element.data();\n            // Initialize options set via HTML5 data-attributes:\n            $.each(\n                this.element[0].attributes,\n                function (index, attr) {\n                    var key = attr.name.toLowerCase(),\n                        value;\n                    if (/^data-/.test(key)) {\n                        // Convert hyphen-ated key to camelCase:\n                        key = key.slice(5).replace(/-[a-z]/g, function (str) {\n                            return str.charAt(1).toUpperCase();\n                        });\n                        value = data[key];\n                        if (that._isRegExpOption(key, value)) {\n                            value = that._getRegExp(value);\n                        }\n                        options[key] = value;\n                    }\n                }\n            );\n        },\n\n        _create: function () {\n            this._initDataAttributes();\n            this._initSpecialOptions();\n            this._slots = [];\n            this._sequence = this._getXHRPromise(true);\n            this._sending = this._active = 0;\n            this._initProgressObject(this);\n            this._initEventHandlers();\n        },\n\n        // This method is exposed to the widget API and allows to query\n        // the number of active uploads:\n        active: function () {\n            return this._active;\n        },\n\n        // This method is exposed to the widget API and allows to query\n        // the widget upload progress.\n        // It returns an object with loaded, total and bitrate properties\n        // for the running uploads:\n        progress: function () {\n            return this._progress;\n        },\n\n        // This method is exposed to the widget API and allows adding files\n        // using the fileupload API. The data parameter accepts an object which\n        // must have a files property and can contain additional options:\n        // .fileupload('add', {files: filesList});\n        add: function (data) {\n            var that = this;\n            if (!data || this.options.disabled) {\n                return;\n            }\n            if (data.fileInput && !data.files) {\n                this._getFileInputFiles(data.fileInput).always(function (files) {\n                    data.files = files;\n                    that._onAdd(null, data);\n                });\n            } else {\n                data.files = $.makeArray(data.files);\n                this._onAdd(null, data);\n            }\n        },\n\n        // This method is exposed to the widget API and allows sending files\n        // using the fileupload API. The data parameter accepts an object which\n        // must have a files or fileInput property and can contain additional options:\n        // .fileupload('send', {files: filesList});\n        // The method returns a Promise object for the file upload call.\n        send: function (data) {\n            if (data && !this.options.disabled) {\n                if (data.fileInput && !data.files) {\n                    var that = this,\n                        dfd = $.Deferred(),\n                        promise = dfd.promise(),\n                        jqXHR,\n                        aborted;\n                    promise.abort = function () {\n                        aborted = true;\n                        if (jqXHR) {\n                            return jqXHR.abort();\n                        }\n                        dfd.reject(null, 'abort', 'abort');\n                        return promise;\n                    };\n                    this._getFileInputFiles(data.fileInput).always(\n                        function (files) {\n                            if (aborted) {\n                                return;\n                            }\n                            if (!files.length) {\n                                dfd.reject();\n                                return;\n                            }\n                            data.files = files;\n                            jqXHR = that._onSend(null, data);\n                            jqXHR.then(\n                                function (result, textStatus, jqXHR) {\n                                    dfd.resolve(result, textStatus, jqXHR);\n                                },\n                                function (jqXHR, textStatus, errorThrown) {\n                                    dfd.reject(jqXHR, textStatus, errorThrown);\n                                }\n                            );\n                        }\n                    );\n                    return this._enhancePromise(promise);\n                }\n                data.files = $.makeArray(data.files);\n                if (data.files.length) {\n                    return this._onSend(null, data);\n                }\n            }\n            return this._getXHRPromise(false, data && data.context);\n        }\n\n    });\n\n}));\n","/*! @preserve\r\n * bootbox.js\r\n * version: 5.4.0\r\n * author: Nick Payne <nick@kurai.co.uk>\r\n * license: MIT\r\n * http://bootboxjs.com/\r\n */\r\n(function (root, factory) {\r\n  'use strict';\r\n  if (typeof define === 'function' && define.amd) {\r\n    // AMD\r\n    define(['jquery'], factory);\r\n  } else if (typeof exports === 'object') {\r\n    // Node, CommonJS-like\r\n    module.exports = factory(require('jquery'));\r\n  } else {\r\n    // Browser globals (root is window)\r\n    root.bootbox = factory(root.jQuery);\r\n  }\r\n}(this, function init($, undefined) {\r\n  'use strict';\r\n\r\n  //  Polyfills Object.keys, if necessary.\r\n  //  @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\r\n  if (!Object.keys) {\r\n    Object.keys = (function () {\r\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\r\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\r\n        dontEnums = [\r\n          'toString',\r\n          'toLocaleString',\r\n          'valueOf',\r\n          'hasOwnProperty',\r\n          'isPrototypeOf',\r\n          'propertyIsEnumerable',\r\n          'constructor'\r\n        ],\r\n        dontEnumsLength = dontEnums.length;\r\n\r\n      return function (obj) {\r\n        if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {\r\n          throw new TypeError('Object.keys called on non-object');\r\n        }\r\n\r\n        var result = [], prop, i;\r\n\r\n        for (prop in obj) {\r\n          if (hasOwnProperty.call(obj, prop)) {\r\n            result.push(prop);\r\n          }\r\n        }\r\n\r\n        if (hasDontEnumBug) {\r\n          for (i = 0; i < dontEnumsLength; i++) {\r\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\r\n              result.push(dontEnums[i]);\r\n            }\r\n          }\r\n        }\r\n\r\n        return result;\r\n      };\r\n    }());\r\n  }\r\n\r\n  var exports = {};\r\n\r\n  var VERSION = '5.0.0';\r\n  exports.VERSION = VERSION;\r\n\r\n  var locales = {\r\n      ar : {\r\n        OK      : 'موافق',\r\n        CANCEL  : 'الغاء',\r\n        CONFIRM : 'تأكيد'\r\n      },\r\n      bg_BG : {\r\n        OK      : 'Ок',\r\n        CANCEL  : 'Отказ',\r\n        CONFIRM : 'Потвърждавам'\r\n      },\r\n      br : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Cancelar',\r\n        CONFIRM : 'Sim'\r\n      },\r\n      cs : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Zrušit',\r\n        CONFIRM : 'Potvrdit'\r\n      },\r\n      da : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Annuller',\r\n        CONFIRM : 'Accepter'\r\n      },\r\n      de : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Abbrechen',\r\n        CONFIRM : 'Akzeptieren'\r\n      },\r\n      el : {\r\n        OK      : 'Εντάξει',\r\n        CANCEL  : 'Ακύρωση',\r\n        CONFIRM : 'Επιβεβαίωση'\r\n      },\r\n      en : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Cancel',\r\n        CONFIRM : 'OK'\r\n      },\r\n      es : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Cancelar',\r\n        CONFIRM : 'Aceptar'\r\n      },\r\n      eu : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Ezeztatu',\r\n        CONFIRM : 'Onartu'\r\n      },\r\n      et : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Katkesta',\r\n        CONFIRM : 'OK'\r\n      },\r\n      fa : {\r\n        OK      : 'قبول',\r\n        CANCEL  : 'لغو',\r\n        CONFIRM : 'تایید'\r\n      },\r\n      fi : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Peruuta',\r\n        CONFIRM : 'OK'\r\n      },\r\n      fr : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Annuler',\r\n        CONFIRM : 'Confirmer'\r\n      },\r\n      he : {\r\n        OK      : 'אישור',\r\n        CANCEL  : 'ביטול',\r\n        CONFIRM : 'אישור'\r\n      },\r\n      hu : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Mégsem',\r\n        CONFIRM : 'Megerősít'\r\n      },\r\n      hr : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Odustani',\r\n        CONFIRM : 'Potvrdi'\r\n      },\r\n      id : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Batal',\r\n        CONFIRM : 'OK'\r\n      },\r\n      it : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Annulla',\r\n        CONFIRM : 'Conferma'\r\n      },\r\n      ja : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'キャンセル',\r\n        CONFIRM : '確認'\r\n      },\r\n      ka : {\r\n        OK: 'OK',\r\n        CANCEL: 'გაუქმება',\r\n        CONFIRM: 'დადასტურება'\r\n      },\r\n      ko : {\r\n        OK: 'OK',\r\n        CANCEL: '취소',\r\n        CONFIRM: '확인'\r\n      },\r\n      lt : {\r\n        OK      : 'Gerai',\r\n        CANCEL  : 'Atšaukti',\r\n        CONFIRM : 'Patvirtinti'\r\n      },\r\n      lv : {\r\n        OK      : 'Labi',\r\n        CANCEL  : 'Atcelt',\r\n        CONFIRM : 'Apstiprināt'\r\n      },\r\n      nl : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Annuleren',\r\n        CONFIRM : 'Accepteren'\r\n      },\r\n      no : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Avbryt',\r\n        CONFIRM : 'OK'\r\n      },\r\n      pl : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Anuluj',\r\n        CONFIRM : 'Potwierdź'\r\n      },\r\n      pt : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Cancelar',\r\n        CONFIRM : 'Confirmar'\r\n      },\r\n      ru : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Отмена',\r\n        CONFIRM : 'Применить'\r\n      },\r\n      sk : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Zrušiť',\r\n        CONFIRM : 'Potvrdiť'\r\n      },\r\n      sl : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Prekliči',\r\n        CONFIRM : 'Potrdi'\r\n      },\r\n      sq : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Anulo',\r\n        CONFIRM : 'Prano'\r\n      },\r\n      sv : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Avbryt',\r\n        CONFIRM : 'OK'\r\n      },\r\n      sw: {\r\n        OK      : 'Sawa',\r\n        CANCEL  : 'Ghairi',\r\n        CONFIRM: 'Thibitisha'\r\n      },\r\n      ta:{\r\n        OK      : 'சரி',\r\n        CANCEL  : 'ரத்து செய்',\r\n        CONFIRM : 'உறுதி செய்'\r\n      },\r\n      th : {\r\n        OK      : 'ตกลง',\r\n        CANCEL  : 'ยกเลิก',\r\n        CONFIRM : 'ยืนยัน'\r\n      },\r\n      tr : {\r\n        OK      : 'Tamam',\r\n        CANCEL  : 'İptal',\r\n        CONFIRM : 'Onayla'\r\n      },\r\n      uk : {\r\n        OK      : 'OK',\r\n        CANCEL  : 'Відміна',\r\n        CONFIRM : 'Прийняти'\r\n      },\r\n      zh_CN : {\r\n        OK      : 'OK',\r\n        CANCEL  : '取消',\r\n        CONFIRM : '确认'\r\n      },\r\n      zh_TW : {\r\n        OK      : 'OK',\r\n        CANCEL  : '取消',\r\n        CONFIRM : '確認'\r\n      }\r\n  };\r\n\r\n  var templates = {\r\n    dialog:\r\n    '<div class=\"bootbox modal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">' +\r\n    '<div class=\"modal-dialog\">' +\r\n    '<div class=\"modal-content\">' +\r\n    '<div class=\"modal-body\"><div class=\"bootbox-body\"></div></div>' +\r\n    '</div>' +\r\n    '</div>' +\r\n    '</div>',\r\n    header:\r\n    '<div class=\"modal-header\">' +\r\n    '<h5 class=\"modal-title\"></h5>' +\r\n    '</div>',\r\n    footer:\r\n    '<div class=\"modal-footer\"></div>',\r\n    closeButton:\r\n    '<button type=\"button\" class=\"bootbox-close-button close\" aria-hidden=\"true\">&times;</button>',\r\n    form:\r\n    '<form class=\"bootbox-form\"></form>',\r\n    button:\r\n    '<button type=\"button\" class=\"btn\"></button>',\r\n    option:\r\n    '<option></option>',\r\n    promptMessage:\r\n    '<div class=\"bootbox-prompt-message\"></div>',\r\n    inputs: {\r\n      text:\r\n      '<input class=\"bootbox-input bootbox-input-text form-control\" autocomplete=\"off\" type=\"text\" />',\r\n      textarea:\r\n      '<textarea class=\"bootbox-input bootbox-input-textarea form-control\"></textarea>',\r\n      email:\r\n      '<input class=\"bootbox-input bootbox-input-email form-control\" autocomplete=\"off\" type=\"email\" />',\r\n      select:\r\n      '<select class=\"bootbox-input bootbox-input-select form-control\"></select>',\r\n      checkbox:\r\n      '<div class=\"form-check checkbox\"><label class=\"form-check-label\"><input class=\"form-check-input bootbox-input bootbox-input-checkbox\" type=\"checkbox\" /></label></div>',\r\n      radio:\r\n      '<div class=\"form-check radio\"><label class=\"form-check-label\"><input class=\"form-check-input bootbox-input bootbox-input-radio\" type=\"radio\" name=\"bootbox-radio\" /></label></div>',\r\n      date:\r\n      '<input class=\"bootbox-input bootbox-input-date form-control\" autocomplete=\"off\" type=\"date\" />',\r\n      time:\r\n      '<input class=\"bootbox-input bootbox-input-time form-control\" autocomplete=\"off\" type=\"time\" />',\r\n      number:\r\n      '<input class=\"bootbox-input bootbox-input-number form-control\" autocomplete=\"off\" type=\"number\" />',\r\n      password:\r\n      '<input class=\"bootbox-input bootbox-input-password form-control\" autocomplete=\"off\" type=\"password\" />',\r\n      range:\r\n      '<input class=\"bootbox-input bootbox-input-range form-control-range\" autocomplete=\"off\" type=\"range\" />'\r\n    }\r\n  };\r\n\r\n\r\n  var defaults = {\r\n    // default language\r\n    locale: 'en',\r\n    // show backdrop or not. Default to static so user has to interact with dialog\r\n    backdrop: 'static',\r\n    // animate the modal in/out\r\n    animate: true,\r\n    // additional class string applied to the top level dialog\r\n    className: null,\r\n    // whether or not to include a close button\r\n    closeButton: true,\r\n    // show the dialog immediately by default\r\n    show: true,\r\n    // dialog container\r\n    container: 'body',\r\n    // default value (used by the prompt helper)\r\n    value: '',\r\n    // default input type (used by the prompt helper)\r\n    inputType: 'text',\r\n    // switch button order from cancel/confirm (default) to confirm/cancel\r\n    swapButtonOrder: false,\r\n    // center modal vertically in page\r\n    centerVertical: false,\r\n    // Append \"multiple\" property to the select when using the \"prompt\" helper\r\n    multiple: false,\r\n    // Automatically scroll modal content when height exceeds viewport height\r\n    scrollable: false\r\n  };\r\n\r\n\r\n  // PUBLIC FUNCTIONS\r\n  // *************************************************************************************************************\r\n\r\n  // Return all currently registered locales, or a specific locale if \"name\" is defined\r\n  exports.locales = function (name) {\r\n    return name ? locales[name] : locales;\r\n  };\r\n\r\n\r\n  // Register localized strings for the OK, CONFIRM, and CANCEL buttons\r\n  exports.addLocale = function (name, values) {\r\n    $.each(['OK', 'CANCEL', 'CONFIRM'], function (_, v) {\r\n      if (!values[v]) {\r\n        throw new Error('Please supply a translation for \"' + v + '\"');\r\n      }\r\n    });\r\n\r\n    locales[name] = {\r\n      OK: values.OK,\r\n      CANCEL: values.CANCEL,\r\n      CONFIRM: values.CONFIRM\r\n    };\r\n\r\n    return exports;\r\n  };\r\n\r\n\r\n  // Remove a previously-registered locale\r\n  exports.removeLocale = function (name) {\r\n    if (name !== 'en') {\r\n      delete locales[name];\r\n    }\r\n    else {\r\n      throw new Error('\"en\" is used as the default and fallback locale and cannot be removed.');\r\n    }\r\n\r\n    return exports;\r\n  };\r\n\r\n\r\n  // Set the default locale\r\n  exports.setLocale = function (name) {\r\n    return exports.setDefaults('locale', name);\r\n  };\r\n\r\n\r\n  // Override default value(s) of Bootbox.\r\n  exports.setDefaults = function () {\r\n    var values = {};\r\n\r\n    if (arguments.length === 2) {\r\n      // allow passing of single key/value...\r\n      values[arguments[0]] = arguments[1];\r\n    } else {\r\n      // ... and as an object too\r\n      values = arguments[0];\r\n    }\r\n\r\n    $.extend(defaults, values);\r\n\r\n    return exports;\r\n  };\r\n\r\n\r\n  // Hides all currently active Bootbox modals\r\n  exports.hideAll = function () {\r\n    $('.bootbox').modal('hide');\r\n\r\n    return exports;\r\n  };\r\n\r\n\r\n  // Allows the base init() function to be overridden\r\n  exports.init = function (_$) {\r\n    return init(_$ || $);\r\n  };\r\n\r\n\r\n  // CORE HELPER FUNCTIONS\r\n  // *************************************************************************************************************\r\n\r\n  // Core dialog function\r\n  exports.dialog = function (options) {\r\n    if ($.fn.modal === undefined) {\r\n      throw new Error(\r\n        '\"$.fn.modal\" is not defined; please double check you have included ' +\r\n        'the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ ' +\r\n        'for more details.'\r\n      );\r\n    }\r\n\r\n    options = sanitize(options);\r\n\r\n    if ($.fn.modal.Constructor.VERSION) {\r\n      options.fullBootstrapVersion = $.fn.modal.Constructor.VERSION;\r\n      var i = options.fullBootstrapVersion.indexOf('.');\r\n      options.bootstrap = options.fullBootstrapVersion.substring(0, i);\r\n    }\r\n    else {\r\n      // Assuming version 2.3.2, as that was the last \"supported\" 2.x version\r\n      options.bootstrap = '2';\r\n      options.fullBootstrapVersion = '2.3.2';\r\n      console.warn('Bootbox will *mostly* work with Bootstrap 2, but we do not officially support it. Please upgrade, if possible.');\r\n    }\r\n\r\n    var dialog = $(templates.dialog);\r\n    var innerDialog = dialog.find('.modal-dialog');\r\n    var body = dialog.find('.modal-body');\r\n    var header = $(templates.header);\r\n    var footer = $(templates.footer);\r\n    var buttons = options.buttons;\r\n\r\n    var callbacks = {\r\n      onEscape: options.onEscape\r\n    };\r\n\r\n    body.find('.bootbox-body').html(options.message);\r\n\r\n    // Only attempt to create buttons if at least one has \r\n    // been defined in the options object\r\n    if (getKeyLength(options.buttons) > 0) {\r\n      each(buttons, function (key, b) {\r\n        var button = $(templates.button);\r\n        button.data('bb-handler', key);\r\n        button.addClass(b.className);\r\n\r\n        switch (key) {\r\n          case 'ok':\r\n          case 'confirm':\r\n            button.addClass('bootbox-accept');\r\n            break;\r\n\r\n          case 'cancel':\r\n            button.addClass('bootbox-cancel');\r\n            break;\r\n        }\r\n\r\n        button.html(b.label);\r\n        footer.append(button);\r\n\r\n        callbacks[key] = b.callback;\r\n      });\r\n\r\n      body.after(footer);\r\n    }\r\n\r\n    if (options.animate === true) {\r\n      dialog.addClass('fade');\r\n    }\r\n\r\n    if (options.className) {\r\n      dialog.addClass(options.className);\r\n    }\r\n\r\n    if (options.size) {\r\n      // Requires Bootstrap 3.1.0 or higher\r\n      if (options.fullBootstrapVersion.substring(0, 3) < '3.1') {\r\n        console.warn('\"size\" requires Bootstrap 3.1.0 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');\r\n      }\r\n\r\n      switch (options.size) {\r\n        case 'small':\r\n        case 'sm':\r\n          innerDialog.addClass('modal-sm');\r\n          break;\r\n\r\n        case 'large':\r\n        case 'lg':\r\n          innerDialog.addClass('modal-lg');\r\n          break;\r\n\r\n        case 'extra-large':\r\n        case 'xl':\r\n          innerDialog.addClass('modal-xl');\r\n\r\n          // Requires Bootstrap 4.2.0 or higher\r\n          if (options.fullBootstrapVersion.substring(0, 3) < '4.2') {\r\n            console.warn('Using size \"xl\"/\"extra-large\" requires Bootstrap 4.2.0 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');\r\n          }\r\n          break;\r\n      }\r\n    }\r\n\r\n    if (options.scrollable) {\r\n      innerDialog.addClass('modal-dialog-scrollable');\r\n\r\n      // Requires Bootstrap 4.3.0 or higher\r\n      if (options.fullBootstrapVersion.substring(0, 3) < '4.3') {\r\n        console.warn('Using \"scrollable\" requires Bootstrap 4.3.0 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');\r\n      }\r\n    }\r\n\r\n    if (options.title) {\r\n      body.before(header);\r\n      dialog.find('.modal-title').html(options.title);\r\n    }\r\n\r\n    if (options.closeButton) {\r\n      var closeButton = $(templates.closeButton);\r\n\r\n      if (options.title) {\r\n        if (options.bootstrap > 3) {\r\n          dialog.find('.modal-header').append(closeButton);\r\n        }\r\n        else {\r\n          dialog.find('.modal-header').prepend(closeButton);\r\n        }\r\n      } else {\r\n        closeButton.prependTo(body);\r\n      }\r\n    }\r\n\r\n    if (options.centerVertical) {\r\n      innerDialog.addClass('modal-dialog-centered');\r\n\r\n      // Requires Bootstrap 4.0.0-beta.3 or higher\r\n      if (options.fullBootstrapVersion < '4.0.0') {\r\n        console.warn('\"centerVertical\" requires Bootstrap 4.0.0-beta.3 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');\r\n      }\r\n    }\r\n\r\n    // Bootstrap event listeners; these handle extra\r\n    // setup & teardown required after the underlying\r\n    // modal has performed certain actions.\r\n\r\n    // make sure we unbind any listeners once the dialog has definitively been dismissed\r\n    dialog.one('hide.bs.modal', { dialog: dialog }, unbindModal);\r\n\r\n    if (options.onHide) {\r\n      if ($.isFunction(options.onHide)) {\r\n        dialog.on('hide.bs.modal', options.onHide);\r\n      }\r\n      else {\r\n        throw new Error('Argument supplied to \"onHide\" must be a function');\r\n      }\r\n    }\r\n\r\n    dialog.one('hidden.bs.modal', { dialog: dialog }, destroyModal);\r\n\r\n    if (options.onHidden) {\r\n      if ($.isFunction(options.onHidden)) {\r\n        dialog.on('hidden.bs.modal', options.onHidden);\r\n      }\r\n      else {\r\n        throw new Error('Argument supplied to \"onHidden\" must be a function');\r\n      }\r\n    }\r\n\r\n    if (options.onShow) {\r\n      if ($.isFunction(options.onShow)) {\r\n        dialog.on('show.bs.modal', options.onShow);\r\n      }\r\n      else {\r\n        throw new Error('Argument supplied to \"onShow\" must be a function');\r\n      }\r\n    }\r\n\r\n    dialog.one('shown.bs.modal', { dialog: dialog }, focusPrimaryButton);\r\n\r\n    if (options.onShown) {\r\n      if ($.isFunction(options.onShown)) {\r\n        dialog.on('shown.bs.modal', options.onShown);\r\n      }\r\n      else {\r\n        throw new Error('Argument supplied to \"onShown\" must be a function');\r\n      }\r\n    }\r\n\r\n    // Bootbox event listeners; used to decouple some\r\n    // behaviours from their respective triggers\r\n\r\n    if (options.backdrop !== 'static') {\r\n      // A boolean true/false according to the Bootstrap docs\r\n      // should show a dialog the user can dismiss by clicking on\r\n      // the background.\r\n      // We always only ever pass static/false to the actual\r\n      // $.modal function because with \"true\" we can't trap\r\n      // this event (the .modal-backdrop swallows it)\r\n      // However, we still want to sort-of respect true\r\n      // and invoke the escape mechanism instead\r\n      dialog.on('click.dismiss.bs.modal', function (e) {\r\n        // @NOTE: the target varies in >= 3.3.x releases since the modal backdrop\r\n        // moved *inside* the outer dialog rather than *alongside* it\r\n        if (dialog.children('.modal-backdrop').length) {\r\n          e.currentTarget = dialog.children('.modal-backdrop').get(0);\r\n        }\r\n\r\n        if (e.target !== e.currentTarget) {\r\n          return;\r\n        }\r\n\r\n        dialog.trigger('escape.close.bb');\r\n      });\r\n    }\r\n\r\n    dialog.on('escape.close.bb', function (e) {\r\n      // the if statement looks redundant but it isn't; without it\r\n      // if we *didn't* have an onEscape handler then processCallback\r\n      // would automatically dismiss the dialog\r\n      if (callbacks.onEscape) {\r\n        processCallback(e, dialog, callbacks.onEscape);\r\n      }\r\n    });\r\n\r\n\r\n    dialog.on('click', '.modal-footer button:not(.disabled)', function (e) {\r\n      var callbackKey = $(this).data('bb-handler');\r\n\r\n      if (callbackKey !== undefined) {\r\n        // Only process callbacks for buttons we recognize:\r\n        processCallback(e, dialog, callbacks[callbackKey]);\r\n      }\r\n    });\r\n\r\n    dialog.on('click', '.bootbox-close-button', function (e) {\r\n      // onEscape might be falsy but that's fine; the fact is\r\n      // if the user has managed to click the close button we\r\n      // have to close the dialog, callback or not\r\n      processCallback(e, dialog, callbacks.onEscape);\r\n    });\r\n\r\n    dialog.on('keyup', function (e) {\r\n      if (e.which === 27) {\r\n        dialog.trigger('escape.close.bb');\r\n      }\r\n    });\r\n\r\n    // the remainder of this method simply deals with adding our\r\n    // dialog element to the DOM, augmenting it with Bootstrap's modal\r\n    // functionality and then giving the resulting object back\r\n    // to our caller\r\n\r\n    $(options.container).append(dialog);\r\n\r\n    dialog.modal({\r\n      backdrop: options.backdrop ? 'static' : false,\r\n      keyboard: false,\r\n      show: false\r\n    });\r\n\r\n    if (options.show) {\r\n      dialog.modal('show');\r\n    }\r\n\r\n    return dialog;\r\n  };\r\n\r\n\r\n  // Helper function to simulate the native alert() behavior. **NOTE**: This is non-blocking, so any\r\n  // code that must happen after the alert is dismissed should be placed within the callback function \r\n  // for this alert.\r\n  exports.alert = function () {\r\n    var options;\r\n\r\n    options = mergeDialogOptions('alert', ['ok'], ['message', 'callback'], arguments);\r\n\r\n    // @TODO: can this move inside exports.dialog when we're iterating over each\r\n    // button and checking its button.callback value instead?\r\n    if (options.callback && !$.isFunction(options.callback)) {\r\n      throw new Error('alert requires the \"callback\" property to be a function when provided');\r\n    }\r\n\r\n    // override the ok and escape callback to make sure they just invoke\r\n    // the single user-supplied one (if provided)\r\n    options.buttons.ok.callback = options.onEscape = function () {\r\n      if ($.isFunction(options.callback)) {\r\n        return options.callback.call(this);\r\n      }\r\n\r\n      return true;\r\n    };\r\n\r\n    return exports.dialog(options);\r\n  };\r\n\r\n\r\n  // Helper function to simulate the native confirm() behavior. **NOTE**: This is non-blocking, so any\r\n  // code that must happen after the confirm is dismissed should be placed within the callback function \r\n  // for this confirm.\r\n  exports.confirm = function () {\r\n    var options;\r\n\r\n    options = mergeDialogOptions('confirm', ['cancel', 'confirm'], ['message', 'callback'], arguments);\r\n\r\n    // confirm specific validation; they don't make sense without a callback so make\r\n    // sure it's present\r\n    if (!$.isFunction(options.callback)) {\r\n      throw new Error('confirm requires a callback');\r\n    }\r\n\r\n    // overrides; undo anything the user tried to set they shouldn't have\r\n    options.buttons.cancel.callback = options.onEscape = function () {\r\n      return options.callback.call(this, false);\r\n    };\r\n\r\n    options.buttons.confirm.callback = function () {\r\n      return options.callback.call(this, true);\r\n    };\r\n\r\n    return exports.dialog(options);\r\n  };\r\n\r\n\r\n  // Helper function to simulate the native prompt() behavior. **NOTE**: This is non-blocking, so any\r\n  // code that must happen after the prompt is dismissed should be placed within the callback function \r\n  // for this prompt.\r\n  exports.prompt = function () {\r\n    var options;\r\n    var promptDialog;\r\n    var form;\r\n    var input;\r\n    var shouldShow;\r\n    var inputOptions;\r\n\r\n    // we have to create our form first otherwise\r\n    // its value is undefined when gearing up our options\r\n    // @TODO this could be solved by allowing message to\r\n    // be a function instead...\r\n    form = $(templates.form);\r\n\r\n    // prompt defaults are more complex than others in that\r\n    // users can override more defaults\r\n    options = mergeDialogOptions('prompt', ['cancel', 'confirm'], ['title', 'callback'], arguments);\r\n\r\n    if (!options.value) {\r\n      options.value = defaults.value;\r\n    }\r\n\r\n    if (!options.inputType) {\r\n      options.inputType = defaults.inputType;\r\n    }\r\n\r\n    // capture the user's show value; we always set this to false before\r\n    // spawning the dialog to give us a chance to attach some handlers to\r\n    // it, but we need to make sure we respect a preference not to show it\r\n    shouldShow = (options.show === undefined) ? defaults.show : options.show;\r\n\r\n    // This is required prior to calling the dialog builder below - we need to \r\n    // add an event handler just before the prompt is shown\r\n    options.show = false;\r\n\r\n    // Handles the 'cancel' action\r\n    options.buttons.cancel.callback = options.onEscape = function () {\r\n      return options.callback.call(this, null);\r\n    };\r\n\r\n    // Prompt submitted - extract the prompt value. This requires a bit of work, \r\n    // given the different input types available.\r\n    options.buttons.confirm.callback = function () {\r\n      var value;\r\n\r\n      if (options.inputType === 'checkbox') {\r\n        value = input.find('input:checked').map(function () {\r\n          return $(this).val();\r\n        }).get();\r\n      } else if (options.inputType === 'radio') {\r\n        value = input.find('input:checked').val();\r\n      }\r\n      else {\r\n        if (input[0].checkValidity && !input[0].checkValidity()) {\r\n          // prevents button callback from being called\r\n          return false;\r\n        } else {\r\n          if (options.inputType === 'select' && options.multiple === true) {\r\n            value = input.find('option:selected').map(function () {\r\n              return $(this).val();\r\n            }).get();\r\n          }\r\n          else {\r\n            value = input.val();\r\n          }\r\n        }\r\n      }\r\n\r\n      return options.callback.call(this, value);\r\n    };\r\n\r\n    // prompt-specific validation\r\n    if (!options.title) {\r\n      throw new Error('prompt requires a title');\r\n    }\r\n\r\n    if (!$.isFunction(options.callback)) {\r\n      throw new Error('prompt requires a callback');\r\n    }\r\n\r\n    if (!templates.inputs[options.inputType]) {\r\n      throw new Error('Invalid prompt type');\r\n    }\r\n\r\n    // create the input based on the supplied type\r\n    input = $(templates.inputs[options.inputType]);\r\n\r\n    switch (options.inputType) {\r\n      case 'text':\r\n      case 'textarea':\r\n      case 'email':\r\n      case 'password':\r\n        input.val(options.value);\r\n\r\n        if (options.placeholder) {\r\n          input.attr('placeholder', options.placeholder);\r\n        }\r\n\r\n        if (options.pattern) {\r\n          input.attr('pattern', options.pattern);\r\n        }\r\n\r\n        if (options.maxlength) {\r\n          input.attr('maxlength', options.maxlength);\r\n        }\r\n\r\n        if (options.required) {\r\n          input.prop({ 'required': true });\r\n        }\r\n\r\n        if (options.rows && !isNaN(parseInt(options.rows))) {\r\n          if (options.inputType === 'textarea') {\r\n            input.attr({ 'rows': options.rows });\r\n          }\r\n        }\r\n\r\n        break;\r\n\r\n\r\n      case 'date':\r\n      case 'time':\r\n      case 'number':\r\n      case 'range':\r\n        input.val(options.value);\r\n\r\n        if (options.placeholder) {\r\n          input.attr('placeholder', options.placeholder);\r\n        }\r\n\r\n        if (options.pattern) {\r\n          input.attr('pattern', options.pattern);\r\n        }\r\n\r\n        if (options.required) {\r\n          input.prop({ 'required': true });\r\n        }\r\n\r\n        // These input types have extra attributes which affect their input validation.\r\n        // Warning: For most browsers, date inputs are buggy in their implementation of 'step', so \r\n        // this attribute will have no effect. Therefore, we don't set the attribute for date inputs.\r\n        // @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date#Setting_maximum_and_minimum_dates\r\n        if (options.inputType !== 'date') {\r\n          if (options.step) {\r\n            if (options.step === 'any' || (!isNaN(options.step) && parseFloat(options.step) > 0)) {\r\n              input.attr('step', options.step);\r\n            }\r\n            else {\r\n              throw new Error('\"step\" must be a valid positive number or the value \"any\". See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-step for more information.');\r\n            }\r\n          }\r\n        }\r\n\r\n        if (minAndMaxAreValid(options.inputType, options.min, options.max)) {\r\n          if (options.min !== undefined) {\r\n            input.attr('min', options.min);\r\n          }\r\n          if (options.max !== undefined) {\r\n            input.attr('max', options.max);\r\n          }\r\n        }\r\n\r\n        break;\r\n\r\n\r\n      case 'select':\r\n        var groups = {};\r\n        inputOptions = options.inputOptions || [];\r\n\r\n        if (!$.isArray(inputOptions)) {\r\n          throw new Error('Please pass an array of input options');\r\n        }\r\n\r\n        if (!inputOptions.length) {\r\n          throw new Error('prompt with \"inputType\" set to \"select\" requires at least one option');\r\n        }\r\n\r\n        // placeholder is not actually a valid attribute for select,\r\n        // but we'll allow it, assuming it might be used for a plugin\r\n        if (options.placeholder) {\r\n          input.attr('placeholder', options.placeholder);\r\n        }\r\n\r\n        if (options.required) {\r\n          input.prop({ 'required': true });\r\n        }\r\n\r\n        if (options.multiple) {\r\n          input.prop({ 'multiple': true });\r\n        }\r\n\r\n        each(inputOptions, function (_, option) {\r\n          // assume the element to attach to is the input...\r\n          var elem = input;\r\n\r\n          if (option.value === undefined || option.text === undefined) {\r\n            throw new Error('each option needs a \"value\" property and a \"text\" property');\r\n          }\r\n\r\n          // ... but override that element if this option sits in a group\r\n\r\n          if (option.group) {\r\n            // initialise group if necessary\r\n            if (!groups[option.group]) {\r\n              groups[option.group] = $('<optgroup />').attr('label', option.group);\r\n            }\r\n\r\n            elem = groups[option.group];\r\n          }\r\n\r\n          var o = $(templates.option);\r\n          o.attr('value', option.value).text(option.text);\r\n          elem.append(o);\r\n        });\r\n\r\n        each(groups, function (_, group) {\r\n          input.append(group);\r\n        });\r\n\r\n        // safe to set a select's value as per a normal input\r\n        input.val(options.value);\r\n\r\n        break;\r\n\r\n\r\n      case 'checkbox':\r\n        var checkboxValues = $.isArray(options.value) ? options.value : [options.value];\r\n        inputOptions = options.inputOptions || [];\r\n\r\n        if (!inputOptions.length) {\r\n          throw new Error('prompt with \"inputType\" set to \"checkbox\" requires at least one option');\r\n        }\r\n\r\n        // checkboxes have to nest within a containing element, so\r\n        // they break the rules a bit and we end up re-assigning\r\n        // our 'input' element to this container instead\r\n        input = $('<div class=\"bootbox-checkbox-list\"></div>');\r\n\r\n        each(inputOptions, function (_, option) {\r\n          if (option.value === undefined || option.text === undefined) {\r\n            throw new Error('each option needs a \"value\" property and a \"text\" property');\r\n          }\r\n\r\n          var checkbox = $(templates.inputs[options.inputType]);\r\n\r\n          checkbox.find('input').attr('value', option.value);\r\n          checkbox.find('label').append('\\n' + option.text);\r\n\r\n          // we've ensured values is an array so we can always iterate over it\r\n          each(checkboxValues, function (_, value) {\r\n            if (value === option.value) {\r\n              checkbox.find('input').prop('checked', true);\r\n            }\r\n          });\r\n\r\n          input.append(checkbox);\r\n        });\r\n        break;\r\n\r\n\r\n      case 'radio':\r\n        // Make sure that value is not an array (only a single radio can ever be checked)\r\n        if (options.value !== undefined && $.isArray(options.value)) {\r\n          throw new Error('prompt with \"inputType\" set to \"radio\" requires a single, non-array value for \"value\"');\r\n        }\r\n\r\n        inputOptions = options.inputOptions || [];\r\n\r\n        if (!inputOptions.length) {\r\n          throw new Error('prompt with \"inputType\" set to \"radio\" requires at least one option');\r\n        }\r\n\r\n        // Radiobuttons have to nest within a containing element, so\r\n        // they break the rules a bit and we end up re-assigning\r\n        // our 'input' element to this container instead\r\n        input = $('<div class=\"bootbox-radiobutton-list\"></div>');\r\n\r\n        // Radiobuttons should always have an initial checked input checked in a \"group\".\r\n        // If value is undefined or doesn't match an input option, select the first radiobutton\r\n        var checkFirstRadio = true;\r\n\r\n        each(inputOptions, function (_, option) {\r\n          if (option.value === undefined || option.text === undefined) {\r\n            throw new Error('each option needs a \"value\" property and a \"text\" property');\r\n          }\r\n\r\n          var radio = $(templates.inputs[options.inputType]);\r\n\r\n          radio.find('input').attr('value', option.value);\r\n          radio.find('label').append('\\n' + option.text);\r\n\r\n          if (options.value !== undefined) {\r\n            if (option.value === options.value) {\r\n              radio.find('input').prop('checked', true);\r\n              checkFirstRadio = false;\r\n            }\r\n          }\r\n\r\n          input.append(radio);\r\n        });\r\n\r\n        if (checkFirstRadio) {\r\n          input.find('input[type=\"radio\"]').first().prop('checked', true);\r\n        }\r\n        break;\r\n    }\r\n\r\n    // now place it in our form\r\n    form.append(input);\r\n\r\n    form.on('submit', function (e) {\r\n      e.preventDefault();\r\n      // Fix for SammyJS (or similar JS routing library) hijacking the form post.\r\n      e.stopPropagation();\r\n\r\n      // @TODO can we actually click *the* button object instead?\r\n      // e.g. buttons.confirm.click() or similar\r\n      promptDialog.find('.bootbox-accept').trigger('click');\r\n    });\r\n\r\n    if ($.trim(options.message) !== '') {\r\n      // Add the form to whatever content the user may have added.\r\n      var message = $(templates.promptMessage).html(options.message);\r\n      form.prepend(message);\r\n      options.message = form;\r\n    }\r\n    else {\r\n      options.message = form;\r\n    }\r\n\r\n    // Generate the dialog\r\n    promptDialog = exports.dialog(options);\r\n\r\n    // clear the existing handler focusing the submit button...\r\n    promptDialog.off('shown.bs.modal', focusPrimaryButton);\r\n\r\n    // ...and replace it with one focusing our input, if possible\r\n    promptDialog.on('shown.bs.modal', function () {\r\n      // need the closure here since input isn't\r\n      // an object otherwise\r\n      input.focus();\r\n    });\r\n\r\n    if (shouldShow === true) {\r\n      promptDialog.modal('show');\r\n    }\r\n\r\n    return promptDialog;\r\n  };\r\n\r\n\r\n  // INTERNAL FUNCTIONS\r\n  // *************************************************************************************************************\r\n\r\n  // Map a flexible set of arguments into a single returned object\r\n  // If args.length is already one just return it, otherwise\r\n  // use the properties argument to map the unnamed args to\r\n  // object properties.\r\n  // So in the latter case:\r\n  //  mapArguments([\"foo\", $.noop], [\"message\", \"callback\"])\r\n  //  -> { message: \"foo\", callback: $.noop }\r\n  function mapArguments(args, properties) {\r\n    var argn = args.length;\r\n    var options = {};\r\n\r\n    if (argn < 1 || argn > 2) {\r\n      throw new Error('Invalid argument length');\r\n    }\r\n\r\n    if (argn === 2 || typeof args[0] === 'string') {\r\n      options[properties[0]] = args[0];\r\n      options[properties[1]] = args[1];\r\n    } else {\r\n      options = args[0];\r\n    }\r\n\r\n    return options;\r\n  }\r\n\r\n\r\n  //  Merge a set of default dialog options with user supplied arguments\r\n  function mergeArguments(defaults, args, properties) {\r\n    return $.extend(\r\n      // deep merge\r\n      true,\r\n      // ensure the target is an empty, unreferenced object\r\n      {},\r\n      // the base options object for this type of dialog (often just buttons)\r\n      defaults,\r\n      // args could be an object or array; if it's an array properties will\r\n      // map it to a proper options object\r\n      mapArguments(\r\n        args,\r\n        properties\r\n      )\r\n    );\r\n  }\r\n\r\n\r\n  //  This entry-level method makes heavy use of composition to take a simple\r\n  //  range of inputs and return valid options suitable for passing to bootbox.dialog\r\n  function mergeDialogOptions(className, labels, properties, args) {\r\n    var locale;\r\n    if (args && args[0]) {\r\n      locale = args[0].locale || defaults.locale;\r\n      var swapButtons = args[0].swapButtonOrder || defaults.swapButtonOrder;\r\n\r\n      if (swapButtons) {\r\n        labels = labels.reverse();\r\n      }\r\n    }\r\n\r\n    //  build up a base set of dialog properties\r\n    var baseOptions = {\r\n      className: 'bootbox-' + className,\r\n      buttons: createLabels(labels, locale)\r\n    };\r\n\r\n    // Ensure the buttons properties generated, *after* merging\r\n    // with user args are still valid against the supplied labels\r\n    return validateButtons(\r\n      // merge the generated base properties with user supplied arguments\r\n      mergeArguments(\r\n        baseOptions,\r\n        args,\r\n        // if args.length > 1, properties specify how each arg maps to an object key\r\n        properties\r\n      ),\r\n      labels\r\n    );\r\n  }\r\n\r\n\r\n  //  Checks each button object to see if key is valid. \r\n  //  This function will only be called by the alert, confirm, and prompt helpers. \r\n  function validateButtons(options, buttons) {\r\n    var allowedButtons = {};\r\n    each(buttons, function (key, value) {\r\n      allowedButtons[value] = true;\r\n    });\r\n\r\n    each(options.buttons, function (key) {\r\n      if (allowedButtons[key] === undefined) {\r\n        throw new Error('button key \"' + key + '\" is not allowed (options are ' + buttons.join(' ') + ')');\r\n      }\r\n    });\r\n\r\n    return options;\r\n  }\r\n\r\n\r\n\r\n  //  From a given list of arguments, return a suitable object of button labels.\r\n  //  All this does is normalise the given labels and translate them where possible.\r\n  //  e.g. \"ok\", \"confirm\" -> { ok: \"OK\", cancel: \"Annuleren\" }\r\n  function createLabels(labels, locale) {\r\n    var buttons = {};\r\n\r\n    for (var i = 0, j = labels.length; i < j; i++) {\r\n      var argument = labels[i];\r\n      var key = argument.toLowerCase();\r\n      var value = argument.toUpperCase();\r\n\r\n      buttons[key] = {\r\n        label: getText(value, locale)\r\n      };\r\n    }\r\n\r\n    return buttons;\r\n  }\r\n\r\n\r\n\r\n  //  Get localized text from a locale. Defaults to 'en' locale if no locale \r\n  //  provided or a non-registered locale is requested\r\n  function getText(key, locale) {\r\n    var labels = locales[locale];\r\n\r\n    return labels ? labels[key] : locales.en[key];\r\n  }\r\n\r\n\r\n\r\n  //  Filter and tidy up any user supplied parameters to this dialog.\r\n  //  Also looks for any shorthands used and ensures that the options\r\n  //  which are returned are all normalized properly\r\n  function sanitize(options) {\r\n    var buttons;\r\n    var total;\r\n\r\n    if (typeof options !== 'object') {\r\n      throw new Error('Please supply an object of options');\r\n    }\r\n\r\n    if (!options.message) {\r\n      throw new Error('\"message\" option must not be null or an empty string.');\r\n    }\r\n\r\n    // make sure any supplied options take precedence over defaults\r\n    options = $.extend({}, defaults, options);\r\n\r\n    // no buttons is still a valid dialog but it's cleaner to always have\r\n    // a buttons object to iterate over, even if it's empty\r\n    if (!options.buttons) {\r\n      options.buttons = {};\r\n    }\r\n\r\n    buttons = options.buttons;\r\n\r\n    total = getKeyLength(buttons);\r\n\r\n    each(buttons, function (key, button, index) {\r\n      if ($.isFunction(button)) {\r\n        // short form, assume value is our callback. Since button\r\n        // isn't an object it isn't a reference either so re-assign it\r\n        button = buttons[key] = {\r\n          callback: button\r\n        };\r\n      }\r\n\r\n      // before any further checks make sure by now button is the correct type\r\n      if ($.type(button) !== 'object') {\r\n        throw new Error('button with key \"' + key + '\" must be an object');\r\n      }\r\n\r\n      if (!button.label) {\r\n        // the lack of an explicit label means we'll assume the key is good enough\r\n        button.label = key;\r\n      }\r\n\r\n      if (!button.className) {\r\n        var isPrimary = false;\r\n        if (options.swapButtonOrder) {\r\n          isPrimary = index === 0;\r\n        }\r\n        else {\r\n          isPrimary = index === total - 1;\r\n        }\r\n\r\n        if (total <= 2 && isPrimary) {\r\n          // always add a primary to the main option in a one or two-button dialog\r\n          button.className = 'btn-primary';\r\n        } else {\r\n          // adding both classes allows us to target both BS3 and BS4 without needing to check the version\r\n          button.className = 'btn-secondary btn-default';\r\n        }\r\n      }\r\n    });\r\n\r\n    return options;\r\n  }\r\n\r\n\r\n  //  Returns a count of the properties defined on the object\r\n  function getKeyLength(obj) {\r\n    return Object.keys(obj).length;\r\n  }\r\n\r\n\r\n  //  Tiny wrapper function around jQuery.each; just adds index as the third parameter\r\n  function each(collection, iterator) {\r\n    var index = 0;\r\n    $.each(collection, function (key, value) {\r\n      iterator(key, value, index++);\r\n    });\r\n  }\r\n\r\n\r\n  function focusPrimaryButton(e) {\r\n    e.data.dialog.find('.bootbox-accept').first().trigger('focus');\r\n  }\r\n\r\n\r\n  function destroyModal(e) {\r\n    // ensure we don't accidentally intercept hidden events triggered\r\n    // by children of the current dialog. We shouldn't need to handle this anymore, \r\n    // now that Bootstrap namespaces its events, but still worth doing.\r\n    if (e.target === e.data.dialog[0]) {\r\n      e.data.dialog.remove();\r\n    }\r\n  }\r\n\r\n\r\n  function unbindModal(e) {\r\n    if (e.target === e.data.dialog[0]) {\r\n      e.data.dialog.off('escape.close.bb');\r\n      e.data.dialog.off('click');\r\n    }\r\n  }\r\n\r\n\r\n  //  Handle the invoked dialog callback\r\n  function processCallback(e, dialog, callback) {\r\n    e.stopPropagation();\r\n    e.preventDefault();\r\n\r\n    // by default we assume a callback will get rid of the dialog,\r\n    // although it is given the opportunity to override this\r\n\r\n    // so, if the callback can be invoked and it *explicitly returns false*\r\n    // then we'll set a flag to keep the dialog active...\r\n    var preserveDialog = $.isFunction(callback) && callback.call(dialog, e) === false;\r\n\r\n    // ... otherwise we'll bin it\r\n    if (!preserveDialog) {\r\n      dialog.modal('hide');\r\n    }\r\n  }\r\n\r\n  // Validate `min` and `max` values based on the current `inputType` value\r\n  function minAndMaxAreValid(type, min, max) {\r\n    var result = false;\r\n    var minValid = true;\r\n    var maxValid = true;\r\n\r\n    if (type === 'date') {\r\n      if (min !== undefined && !(minValid = dateIsValid(min))) {\r\n        console.warn('Browsers which natively support the \"date\" input type expect date values to be of the form \"YYYY-MM-DD\" (see ISO-8601 https://www.iso.org/iso-8601-date-and-time-format.html). Bootbox does not enforce this rule, but your min value may not be enforced by this browser.');\r\n      }\r\n      else if (max !== undefined && !(maxValid = dateIsValid(max))) {\r\n        console.warn('Browsers which natively support the \"date\" input type expect date values to be of the form \"YYYY-MM-DD\" (see ISO-8601 https://www.iso.org/iso-8601-date-and-time-format.html). Bootbox does not enforce this rule, but your max value may not be enforced by this browser.');\r\n      }\r\n    }\r\n    else if (type === 'time') {\r\n      if (min !== undefined && !(minValid = timeIsValid(min))) {\r\n        throw new Error('\"min\" is not a valid time. See https://www.w3.org/TR/2012/WD-html-markup-20120315/datatypes.html#form.data.time for more information.');\r\n      }\r\n      else if (max !== undefined && !(maxValid = timeIsValid(max))) {\r\n        throw new Error('\"max\" is not a valid time. See https://www.w3.org/TR/2012/WD-html-markup-20120315/datatypes.html#form.data.time for more information.');\r\n      }\r\n    }\r\n    else {\r\n      if (min !== undefined && isNaN(min)) {\r\n        minValid = false;\r\n        throw new Error('\"min\" must be a valid number. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-min for more information.');\r\n      }\r\n\r\n      if (max !== undefined && isNaN(max)) {\r\n        maxValid = false;\r\n        throw new Error('\"max\" must be a valid number. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-max for more information.');\r\n      }\r\n    }\r\n\r\n    if (minValid && maxValid) {\r\n      if (max <= min) {\r\n        throw new Error('\"max\" must be greater than \"min\". See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-max for more information.');\r\n      }\r\n      else {\r\n        result = true;\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  function timeIsValid(value) {\r\n    return /([01][0-9]|2[0-3]):[0-5][0-9]?:[0-5][0-9]/.test(value);\r\n  }\r\n\r\n  function dateIsValid(value) {\r\n    return /(\\d{4})-(\\d{2})-(\\d{2})/.test(value);\r\n  }\r\n\r\n  //  The Bootbox object\r\n  return exports;\r\n}));","/**\r\n* @version: 3.1\r\n* @author: Dan Grossman http://www.dangrossman.info/\r\n* @copyright: Copyright (c) 2012-2019 Dan Grossman. All rights reserved.\r\n* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php\r\n* @website: http://www.daterangepicker.com/\r\n*/\r\n// Following the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js\r\n(function (root, factory) {\r\n    if (typeof define === 'function' && define.amd) {\r\n        // AMD. Make globaly available as well\r\n        define(['moment', 'jquery'], function (moment, jquery) {\r\n            if (!jquery.fn) jquery.fn = {}; // webpack server rendering\r\n            if (typeof moment !== 'function' && moment.hasOwnProperty('default')) moment = moment['default']\r\n            return factory(moment, jquery);\r\n        });\r\n    } else if (typeof module === 'object' && module.exports) {\r\n        // Node / Browserify\r\n        //isomorphic issue\r\n        var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined;\r\n        if (!jQuery) {\r\n            jQuery = require('jquery');\r\n            if (!jQuery.fn) jQuery.fn = {};\r\n        }\r\n        var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment');\r\n        module.exports = factory(moment, jQuery);\r\n    } else {\r\n        // Browser globals\r\n        root.daterangepicker = factory(root.moment, root.jQuery);\r\n    }\r\n}(this, function(moment, $) {\r\n    var DateRangePicker = function(element, options, cb) {\r\n\r\n        //default settings for options\r\n        this.parentEl = 'body';\r\n        this.element = $(element);\r\n        this.startDate = moment().startOf('day');\r\n        this.endDate = moment().endOf('day');\r\n        this.minDate = false;\r\n        this.maxDate = false;\r\n        this.maxSpan = false;\r\n        this.autoApply = false;\r\n        this.singleDatePicker = false;\r\n        this.showDropdowns = false;\r\n        this.minYear = moment().subtract(100, 'year').format('YYYY');\r\n        this.maxYear = moment().add(100, 'year').format('YYYY');\r\n        this.showWeekNumbers = false;\r\n        this.showISOWeekNumbers = false;\r\n        this.showCustomRangeLabel = true;\r\n        this.timePicker = false;\r\n        this.timePicker24Hour = false;\r\n        this.timePickerIncrement = 1;\r\n        this.timePickerSeconds = false;\r\n        this.linkedCalendars = true;\r\n        this.autoUpdateInput = true;\r\n        this.alwaysShowCalendars = false;\r\n        this.ranges = {};\r\n\r\n        this.opens = 'right';\r\n        if (this.element.hasClass('pull-right'))\r\n            this.opens = 'left';\r\n\r\n        this.drops = 'down';\r\n        if (this.element.hasClass('dropup'))\r\n            this.drops = 'up';\r\n\r\n        this.buttonClasses = 'btn btn-sm';\r\n        this.applyButtonClasses = 'btn-primary';\r\n        this.cancelButtonClasses = 'btn-default';\r\n\r\n        this.locale = {\r\n            direction: 'ltr',\r\n            format: moment.localeData().longDateFormat('L'),\r\n            separator: ' - ',\r\n            applyLabel: 'Apply',\r\n            cancelLabel: 'Cancel',\r\n            weekLabel: 'W',\r\n            customRangeLabel: 'Custom Range',\r\n            daysOfWeek: moment.weekdaysMin(),\r\n            monthNames: moment.monthsShort(),\r\n            firstDay: moment.localeData().firstDayOfWeek()\r\n        };\r\n\r\n        this.callback = function() { };\r\n\r\n        //some state information\r\n        this.isShowing = false;\r\n        this.leftCalendar = {};\r\n        this.rightCalendar = {};\r\n\r\n        //custom options from user\r\n        if (typeof options !== 'object' || options === null)\r\n            options = {};\r\n\r\n        //allow setting options with data attributes\r\n        //data-api options will be overwritten with custom javascript options\r\n        options = $.extend(this.element.data(), options);\r\n\r\n        //html template for the picker UI\r\n        if (typeof options.template !== 'string' && !(options.template instanceof $))\r\n            options.template =\r\n            '<div class=\"daterangepicker\">' +\r\n                '<div class=\"ranges\"></div>' +\r\n                '<div class=\"drp-calendar left\">' +\r\n                    '<div class=\"calendar-table\"></div>' +\r\n                    '<div class=\"calendar-time\"></div>' +\r\n                '</div>' +\r\n                '<div class=\"drp-calendar right\">' +\r\n                    '<div class=\"calendar-table\"></div>' +\r\n                    '<div class=\"calendar-time\"></div>' +\r\n                '</div>' +\r\n                '<div class=\"drp-buttons\">' +\r\n                    '<span class=\"drp-selected\"></span>' +\r\n                    '<button class=\"cancelBtn\" type=\"button\"></button>' +\r\n                    '<button class=\"applyBtn\" disabled=\"disabled\" type=\"button\"></button> ' +\r\n                '</div>' +\r\n            '</div>';\r\n\r\n        this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl);\r\n        this.container = $(options.template).appendTo(this.parentEl);\r\n\r\n        //\r\n        // handle all the possible options overriding defaults\r\n        //\r\n\r\n        if (typeof options.locale === 'object') {\r\n\r\n            if (typeof options.locale.direction === 'string')\r\n                this.locale.direction = options.locale.direction;\r\n\r\n            if (typeof options.locale.format === 'string')\r\n                this.locale.format = options.locale.format;\r\n\r\n            if (typeof options.locale.separator === 'string')\r\n                this.locale.separator = options.locale.separator;\r\n\r\n            if (typeof options.locale.daysOfWeek === 'object')\r\n                this.locale.daysOfWeek = options.locale.daysOfWeek.slice();\r\n\r\n            if (typeof options.locale.monthNames === 'object')\r\n              this.locale.monthNames = options.locale.monthNames.slice();\r\n\r\n            if (typeof options.locale.firstDay === 'number')\r\n              this.locale.firstDay = options.locale.firstDay;\r\n\r\n            if (typeof options.locale.applyLabel === 'string')\r\n              this.locale.applyLabel = options.locale.applyLabel;\r\n\r\n            if (typeof options.locale.cancelLabel === 'string')\r\n              this.locale.cancelLabel = options.locale.cancelLabel;\r\n\r\n            if (typeof options.locale.weekLabel === 'string')\r\n              this.locale.weekLabel = options.locale.weekLabel;\r\n\r\n            if (typeof options.locale.customRangeLabel === 'string'){\r\n                //Support unicode chars in the custom range name.\r\n                var elem = document.createElement('textarea');\r\n                elem.innerHTML = options.locale.customRangeLabel;\r\n                var rangeHtml = elem.value;\r\n                this.locale.customRangeLabel = rangeHtml;\r\n            }\r\n        }\r\n        this.container.addClass(this.locale.direction);\r\n\r\n        if (typeof options.startDate === 'string')\r\n            this.startDate = moment(options.startDate, this.locale.format);\r\n\r\n        if (typeof options.endDate === 'string')\r\n            this.endDate = moment(options.endDate, this.locale.format);\r\n\r\n        if (typeof options.minDate === 'string')\r\n            this.minDate = moment(options.minDate, this.locale.format);\r\n\r\n        if (typeof options.maxDate === 'string')\r\n            this.maxDate = moment(options.maxDate, this.locale.format);\r\n\r\n        if (typeof options.startDate === 'object')\r\n            this.startDate = moment(options.startDate);\r\n\r\n        if (typeof options.endDate === 'object')\r\n            this.endDate = moment(options.endDate);\r\n\r\n        if (typeof options.minDate === 'object')\r\n            this.minDate = moment(options.minDate);\r\n\r\n        if (typeof options.maxDate === 'object')\r\n            this.maxDate = moment(options.maxDate);\r\n\r\n        // sanity check for bad options\r\n        if (this.minDate && this.startDate.isBefore(this.minDate))\r\n            this.startDate = this.minDate.clone();\r\n\r\n        // sanity check for bad options\r\n        if (this.maxDate && this.endDate.isAfter(this.maxDate))\r\n            this.endDate = this.maxDate.clone();\r\n\r\n        if (typeof options.applyButtonClasses === 'string')\r\n            this.applyButtonClasses = options.applyButtonClasses;\r\n\r\n        if (typeof options.applyClass === 'string') //backwards compat\r\n            this.applyButtonClasses = options.applyClass;\r\n\r\n        if (typeof options.cancelButtonClasses === 'string')\r\n            this.cancelButtonClasses = options.cancelButtonClasses;\r\n\r\n        if (typeof options.cancelClass === 'string') //backwards compat\r\n            this.cancelButtonClasses = options.cancelClass;\r\n\r\n        if (typeof options.maxSpan === 'object')\r\n            this.maxSpan = options.maxSpan;\r\n\r\n        if (typeof options.dateLimit === 'object') //backwards compat\r\n            this.maxSpan = options.dateLimit;\r\n\r\n        if (typeof options.opens === 'string')\r\n            this.opens = options.opens;\r\n\r\n        if (typeof options.drops === 'string')\r\n            this.drops = options.drops;\r\n\r\n        if (typeof options.showWeekNumbers === 'boolean')\r\n            this.showWeekNumbers = options.showWeekNumbers;\r\n\r\n        if (typeof options.showISOWeekNumbers === 'boolean')\r\n            this.showISOWeekNumbers = options.showISOWeekNumbers;\r\n\r\n        if (typeof options.buttonClasses === 'string')\r\n            this.buttonClasses = options.buttonClasses;\r\n\r\n        if (typeof options.buttonClasses === 'object')\r\n            this.buttonClasses = options.buttonClasses.join(' ');\r\n\r\n        if (typeof options.showDropdowns === 'boolean')\r\n            this.showDropdowns = options.showDropdowns;\r\n\r\n        if (typeof options.minYear === 'number')\r\n            this.minYear = options.minYear;\r\n\r\n        if (typeof options.maxYear === 'number')\r\n            this.maxYear = options.maxYear;\r\n\r\n        if (typeof options.showCustomRangeLabel === 'boolean')\r\n            this.showCustomRangeLabel = options.showCustomRangeLabel;\r\n\r\n        if (typeof options.singleDatePicker === 'boolean') {\r\n            this.singleDatePicker = options.singleDatePicker;\r\n            if (this.singleDatePicker)\r\n                this.endDate = this.startDate.clone();\r\n        }\r\n\r\n        if (typeof options.timePicker === 'boolean')\r\n            this.timePicker = options.timePicker;\r\n\r\n        if (typeof options.timePickerSeconds === 'boolean')\r\n            this.timePickerSeconds = options.timePickerSeconds;\r\n\r\n        if (typeof options.timePickerIncrement === 'number')\r\n            this.timePickerIncrement = options.timePickerIncrement;\r\n\r\n        if (typeof options.timePicker24Hour === 'boolean')\r\n            this.timePicker24Hour = options.timePicker24Hour;\r\n\r\n        if (typeof options.autoApply === 'boolean')\r\n            this.autoApply = options.autoApply;\r\n\r\n        if (typeof options.autoUpdateInput === 'boolean')\r\n            this.autoUpdateInput = options.autoUpdateInput;\r\n\r\n        if (typeof options.linkedCalendars === 'boolean')\r\n            this.linkedCalendars = options.linkedCalendars;\r\n\r\n        if (typeof options.isInvalidDate === 'function')\r\n            this.isInvalidDate = options.isInvalidDate;\r\n\r\n        if (typeof options.isCustomDate === 'function')\r\n            this.isCustomDate = options.isCustomDate;\r\n\r\n        if (typeof options.alwaysShowCalendars === 'boolean')\r\n            this.alwaysShowCalendars = options.alwaysShowCalendars;\r\n\r\n        // update day names order to firstDay\r\n        if (this.locale.firstDay != 0) {\r\n            var iterator = this.locale.firstDay;\r\n            while (iterator > 0) {\r\n                this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift());\r\n                iterator--;\r\n            }\r\n        }\r\n\r\n        var start, end, range;\r\n\r\n        //if no start/end dates set, check if an input element contains initial values\r\n        if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') {\r\n            if ($(this.element).is(':text')) {\r\n                var val = $(this.element).val(),\r\n                    split = val.split(this.locale.separator);\r\n\r\n                start = end = null;\r\n\r\n                if (split.length == 2) {\r\n                    start = moment(split[0], this.locale.format);\r\n                    end = moment(split[1], this.locale.format);\r\n                } else if (this.singleDatePicker && val !== \"\") {\r\n                    start = moment(val, this.locale.format);\r\n                    end = moment(val, this.locale.format);\r\n                }\r\n                if (start !== null && end !== null) {\r\n                    this.setStartDate(start);\r\n                    this.setEndDate(end);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (typeof options.ranges === 'object') {\r\n            for (range in options.ranges) {\r\n\r\n                if (typeof options.ranges[range][0] === 'string')\r\n                    start = moment(options.ranges[range][0], this.locale.format);\r\n                else\r\n                    start = moment(options.ranges[range][0]);\r\n\r\n                if (typeof options.ranges[range][1] === 'string')\r\n                    end = moment(options.ranges[range][1], this.locale.format);\r\n                else\r\n                    end = moment(options.ranges[range][1]);\r\n\r\n                // If the start or end date exceed those allowed by the minDate or maxSpan\r\n                // options, shorten the range to the allowable period.\r\n                if (this.minDate && start.isBefore(this.minDate))\r\n                    start = this.minDate.clone();\r\n\r\n                var maxDate = this.maxDate;\r\n                if (this.maxSpan && maxDate && start.clone().add(this.maxSpan).isAfter(maxDate))\r\n                    maxDate = start.clone().add(this.maxSpan);\r\n                if (maxDate && end.isAfter(maxDate))\r\n                    end = maxDate.clone();\r\n\r\n                // If the end of the range is before the minimum or the start of the range is\r\n                // after the maximum, don't display this range option at all.\r\n                if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day'))\r\n                  || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day')))\r\n                    continue;\r\n\r\n                //Support unicode chars in the range names.\r\n                var elem = document.createElement('textarea');\r\n                elem.innerHTML = range;\r\n                var rangeHtml = elem.value;\r\n\r\n                this.ranges[rangeHtml] = [start, end];\r\n            }\r\n\r\n            var list = '<ul>';\r\n            for (range in this.ranges) {\r\n                list += '<li data-range-key=\"' + range + '\">' + range + '</li>';\r\n            }\r\n            if (this.showCustomRangeLabel) {\r\n                list += '<li data-range-key=\"' + this.locale.customRangeLabel + '\">' + this.locale.customRangeLabel + '</li>';\r\n            }\r\n            list += '</ul>';\r\n            this.container.find('.ranges').prepend(list);\r\n        }\r\n\r\n        if (typeof cb === 'function') {\r\n            this.callback = cb;\r\n        }\r\n\r\n        if (!this.timePicker) {\r\n            this.startDate = this.startDate.startOf('day');\r\n            this.endDate = this.endDate.endOf('day');\r\n            this.container.find('.calendar-time').hide();\r\n        }\r\n\r\n        //can't be used together for now\r\n        if (this.timePicker && this.autoApply)\r\n            this.autoApply = false;\r\n\r\n        if (this.autoApply) {\r\n            this.container.addClass('auto-apply');\r\n        }\r\n\r\n        if (typeof options.ranges === 'object')\r\n            this.container.addClass('show-ranges');\r\n\r\n        if (this.singleDatePicker) {\r\n            this.container.addClass('single');\r\n            this.container.find('.drp-calendar.left').addClass('single');\r\n            this.container.find('.drp-calendar.left').show();\r\n            this.container.find('.drp-calendar.right').hide();\r\n            if (!this.timePicker && this.autoApply) {\r\n                this.container.addClass('auto-apply');\r\n            }\r\n        }\r\n\r\n        if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) {\r\n            this.container.addClass('show-calendar');\r\n        }\r\n\r\n        this.container.addClass('opens' + this.opens);\r\n\r\n        //apply CSS classes and labels to buttons\r\n        this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses);\r\n        if (this.applyButtonClasses.length)\r\n            this.container.find('.applyBtn').addClass(this.applyButtonClasses);\r\n        if (this.cancelButtonClasses.length)\r\n            this.container.find('.cancelBtn').addClass(this.cancelButtonClasses);\r\n        this.container.find('.applyBtn').html(this.locale.applyLabel);\r\n        this.container.find('.cancelBtn').html(this.locale.cancelLabel);\r\n\r\n        //\r\n        // event listeners\r\n        //\r\n\r\n        this.container.find('.drp-calendar')\r\n            .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this))\r\n            .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this))\r\n            .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this))\r\n            .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this))\r\n            .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this))\r\n            .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this))\r\n            .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this));\r\n\r\n        this.container.find('.ranges')\r\n            .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this));\r\n\r\n        this.container.find('.drp-buttons')\r\n            .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this))\r\n            .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this));\r\n\r\n        if (this.element.is('input') || this.element.is('button')) {\r\n            this.element.on({\r\n                'click.daterangepicker': $.proxy(this.show, this),\r\n                'focus.daterangepicker': $.proxy(this.show, this),\r\n                'keyup.daterangepicker': $.proxy(this.elementChanged, this),\r\n                'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility\r\n            });\r\n        } else {\r\n            this.element.on('click.daterangepicker', $.proxy(this.toggle, this));\r\n            this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this));\r\n        }\r\n\r\n        //\r\n        // if attached to a text input, set the initial value\r\n        //\r\n\r\n        this.updateElement();\r\n\r\n    };\r\n\r\n    DateRangePicker.prototype = {\r\n\r\n        constructor: DateRangePicker,\r\n\r\n        setStartDate: function(startDate) {\r\n            if (typeof startDate === 'string')\r\n                this.startDate = moment(startDate, this.locale.format);\r\n\r\n            if (typeof startDate === 'object')\r\n                this.startDate = moment(startDate);\r\n\r\n            if (!this.timePicker)\r\n                this.startDate = this.startDate.startOf('day');\r\n\r\n            if (this.timePicker && this.timePickerIncrement)\r\n                this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\r\n\r\n            if (this.minDate && this.startDate.isBefore(this.minDate)) {\r\n                this.startDate = this.minDate.clone();\r\n                if (this.timePicker && this.timePickerIncrement)\r\n                    this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\r\n            }\r\n\r\n            if (this.maxDate && this.startDate.isAfter(this.maxDate)) {\r\n                this.startDate = this.maxDate.clone();\r\n                if (this.timePicker && this.timePickerIncrement)\r\n                    this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\r\n            }\r\n\r\n            if (!this.isShowing)\r\n                this.updateElement();\r\n\r\n            this.updateMonthsInView();\r\n        },\r\n\r\n        setEndDate: function(endDate) {\r\n            if (typeof endDate === 'string')\r\n                this.endDate = moment(endDate, this.locale.format);\r\n\r\n            if (typeof endDate === 'object')\r\n                this.endDate = moment(endDate);\r\n\r\n            if (!this.timePicker)\r\n                this.endDate = this.endDate.endOf('day');\r\n\r\n            if (this.timePicker && this.timePickerIncrement)\r\n                this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\r\n\r\n            if (this.endDate.isBefore(this.startDate))\r\n                this.endDate = this.startDate.clone();\r\n\r\n            if (this.maxDate && this.endDate.isAfter(this.maxDate))\r\n                this.endDate = this.maxDate.clone();\r\n\r\n            if (this.maxSpan && this.startDate.clone().add(this.maxSpan).isBefore(this.endDate))\r\n                this.endDate = this.startDate.clone().add(this.maxSpan);\r\n\r\n            this.previousRightTime = this.endDate.clone();\r\n\r\n            this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format));\r\n\r\n            if (!this.isShowing)\r\n                this.updateElement();\r\n\r\n            this.updateMonthsInView();\r\n        },\r\n\r\n        isInvalidDate: function() {\r\n            return false;\r\n        },\r\n\r\n        isCustomDate: function() {\r\n            return false;\r\n        },\r\n\r\n        updateView: function() {\r\n            if (this.timePicker) {\r\n                this.renderTimePicker('left');\r\n                this.renderTimePicker('right');\r\n                if (!this.endDate) {\r\n                    this.container.find('.right .calendar-time select').prop('disabled', true).addClass('disabled');\r\n                } else {\r\n                    this.container.find('.right .calendar-time select').prop('disabled', false).removeClass('disabled');\r\n                }\r\n            }\r\n            if (this.endDate)\r\n                this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format));\r\n            this.updateMonthsInView();\r\n            this.updateCalendars();\r\n            this.updateFormInputs();\r\n        },\r\n\r\n        updateMonthsInView: function() {\r\n            if (this.endDate) {\r\n\r\n                //if both dates are visible already, do nothing\r\n                if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month &&\r\n                    (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM'))\r\n                    &&\r\n                    (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM'))\r\n                    ) {\r\n                    return;\r\n                }\r\n\r\n                this.leftCalendar.month = this.startDate.clone().date(2);\r\n                if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) {\r\n                    this.rightCalendar.month = this.endDate.clone().date(2);\r\n                } else {\r\n                    this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');\r\n                }\r\n\r\n            } else {\r\n                if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) {\r\n                    this.leftCalendar.month = this.startDate.clone().date(2);\r\n                    this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');\r\n                }\r\n            }\r\n            if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) {\r\n              this.rightCalendar.month = this.maxDate.clone().date(2);\r\n              this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month');\r\n            }\r\n        },\r\n\r\n        updateCalendars: function() {\r\n\r\n            if (this.timePicker) {\r\n                var hour, minute, second;\r\n                if (this.endDate) {\r\n                    hour = parseInt(this.container.find('.left .hourselect').val(), 10);\r\n                    minute = parseInt(this.container.find('.left .minuteselect').val(), 10);\r\n                    if (isNaN(minute)) {\r\n                        minute = parseInt(this.container.find('.left .minuteselect option:last').val(), 10);\r\n                    }\r\n                    second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0;\r\n                    if (!this.timePicker24Hour) {\r\n                        var ampm = this.container.find('.left .ampmselect').val();\r\n                        if (ampm === 'PM' && hour < 12)\r\n                            hour += 12;\r\n                        if (ampm === 'AM' && hour === 12)\r\n                            hour = 0;\r\n                    }\r\n                } else {\r\n                    hour = parseInt(this.container.find('.right .hourselect').val(), 10);\r\n                    minute = parseInt(this.container.find('.right .minuteselect').val(), 10);\r\n                    if (isNaN(minute)) {\r\n                        minute = parseInt(this.container.find('.right .minuteselect option:last').val(), 10);\r\n                    }\r\n                    second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0;\r\n                    if (!this.timePicker24Hour) {\r\n                        var ampm = this.container.find('.right .ampmselect').val();\r\n                        if (ampm === 'PM' && hour < 12)\r\n                            hour += 12;\r\n                        if (ampm === 'AM' && hour === 12)\r\n                            hour = 0;\r\n                    }\r\n                }\r\n                this.leftCalendar.month.hour(hour).minute(minute).second(second);\r\n                this.rightCalendar.month.hour(hour).minute(minute).second(second);\r\n            }\r\n\r\n            this.renderCalendar('left');\r\n            this.renderCalendar('right');\r\n\r\n            //highlight any predefined range matching the current start and end dates\r\n            this.container.find('.ranges li').removeClass('active');\r\n            if (this.endDate == null) return;\r\n\r\n            this.calculateChosenLabel();\r\n        },\r\n\r\n        renderCalendar: function(side) {\r\n\r\n            //\r\n            // Build the matrix of dates that will populate the calendar\r\n            //\r\n\r\n            var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar;\r\n            var month = calendar.month.month();\r\n            var year = calendar.month.year();\r\n            var hour = calendar.month.hour();\r\n            var minute = calendar.month.minute();\r\n            var second = calendar.month.second();\r\n            var daysInMonth = moment([year, month]).daysInMonth();\r\n            var firstDay = moment([year, month, 1]);\r\n            var lastDay = moment([year, month, daysInMonth]);\r\n            var lastMonth = moment(firstDay).subtract(1, 'month').month();\r\n            var lastYear = moment(firstDay).subtract(1, 'month').year();\r\n            var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth();\r\n            var dayOfWeek = firstDay.day();\r\n\r\n            //initialize a 6 rows x 7 columns array for the calendar\r\n            var calendar = [];\r\n            calendar.firstDay = firstDay;\r\n            calendar.lastDay = lastDay;\r\n\r\n            for (var i = 0; i < 6; i++) {\r\n                calendar[i] = [];\r\n            }\r\n\r\n            //populate the calendar with date objects\r\n            var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1;\r\n            if (startDay > daysInLastMonth)\r\n                startDay -= 7;\r\n\r\n            if (dayOfWeek == this.locale.firstDay)\r\n                startDay = daysInLastMonth - 6;\r\n\r\n            var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]);\r\n\r\n            var col, row;\r\n            for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) {\r\n                if (i > 0 && col % 7 === 0) {\r\n                    col = 0;\r\n                    row++;\r\n                }\r\n                calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second);\r\n                curDate.hour(12);\r\n\r\n                if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') {\r\n                    calendar[row][col] = this.minDate.clone();\r\n                }\r\n\r\n                if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') {\r\n                    calendar[row][col] = this.maxDate.clone();\r\n                }\r\n\r\n            }\r\n\r\n            //make the calendar object available to hoverDate/clickDate\r\n            if (side == 'left') {\r\n                this.leftCalendar.calendar = calendar;\r\n            } else {\r\n                this.rightCalendar.calendar = calendar;\r\n            }\r\n\r\n            //\r\n            // Display the calendar\r\n            //\r\n\r\n            var minDate = side == 'left' ? this.minDate : this.startDate;\r\n            var maxDate = this.maxDate;\r\n            var selected = side == 'left' ? this.startDate : this.endDate;\r\n            var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'};\r\n\r\n            var html = '<table class=\"table-condensed\">';\r\n            html += '<thead>';\r\n            html += '<tr>';\r\n\r\n            // add empty cell for week number\r\n            if (this.showWeekNumbers || this.showISOWeekNumbers)\r\n                html += '<th></th>';\r\n\r\n            if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) {\r\n                html += '<th class=\"prev available\"><span></span></th>';\r\n            } else {\r\n                html += '<th></th>';\r\n            }\r\n\r\n            var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(\" YYYY\");\r\n\r\n            if (this.showDropdowns) {\r\n                var currentMonth = calendar[1][1].month();\r\n                var currentYear = calendar[1][1].year();\r\n                var maxYear = (maxDate && maxDate.year()) || (this.maxYear);\r\n                var minYear = (minDate && minDate.year()) || (this.minYear);\r\n                var inMinYear = currentYear == minYear;\r\n                var inMaxYear = currentYear == maxYear;\r\n\r\n                var monthHtml = '<select class=\"monthselect\">';\r\n                for (var m = 0; m < 12; m++) {\r\n                    if ((!inMinYear || (minDate && m >= minDate.month())) && (!inMaxYear || (maxDate && m <= maxDate.month()))) {\r\n                        monthHtml += \"<option value='\" + m + \"'\" +\r\n                            (m === currentMonth ? \" selected='selected'\" : \"\") +\r\n                            \">\" + this.locale.monthNames[m] + \"</option>\";\r\n                    } else {\r\n                        monthHtml += \"<option value='\" + m + \"'\" +\r\n                            (m === currentMonth ? \" selected='selected'\" : \"\") +\r\n                            \" disabled='disabled'>\" + this.locale.monthNames[m] + \"</option>\";\r\n                    }\r\n                }\r\n                monthHtml += \"</select>\";\r\n\r\n                var yearHtml = '<select class=\"yearselect\">';\r\n                for (var y = minYear; y <= maxYear; y++) {\r\n                    yearHtml += '<option value=\"' + y + '\"' +\r\n                        (y === currentYear ? ' selected=\"selected\"' : '') +\r\n                        '>' + y + '</option>';\r\n                }\r\n                yearHtml += '</select>';\r\n\r\n                dateHtml = monthHtml + yearHtml;\r\n            }\r\n\r\n            html += '<th colspan=\"5\" class=\"month\">' + dateHtml + '</th>';\r\n            if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) {\r\n                html += '<th class=\"next available\"><span></span></th>';\r\n            } else {\r\n                html += '<th></th>';\r\n            }\r\n\r\n            html += '</tr>';\r\n            html += '<tr>';\r\n\r\n            // add week number label\r\n            if (this.showWeekNumbers || this.showISOWeekNumbers)\r\n                html += '<th class=\"week\">' + this.locale.weekLabel + '</th>';\r\n\r\n            $.each(this.locale.daysOfWeek, function(index, dayOfWeek) {\r\n                html += '<th>' + dayOfWeek + '</th>';\r\n            });\r\n\r\n            html += '</tr>';\r\n            html += '</thead>';\r\n            html += '<tbody>';\r\n\r\n            //adjust maxDate to reflect the maxSpan setting in order to\r\n            //grey out end dates beyond the maxSpan\r\n            if (this.endDate == null && this.maxSpan) {\r\n                var maxLimit = this.startDate.clone().add(this.maxSpan).endOf('day');\r\n                if (!maxDate || maxLimit.isBefore(maxDate)) {\r\n                    maxDate = maxLimit;\r\n                }\r\n            }\r\n\r\n            for (var row = 0; row < 6; row++) {\r\n                html += '<tr>';\r\n\r\n                // add week number\r\n                if (this.showWeekNumbers)\r\n                    html += '<td class=\"week\">' + calendar[row][0].week() + '</td>';\r\n                else if (this.showISOWeekNumbers)\r\n                    html += '<td class=\"week\">' + calendar[row][0].isoWeek() + '</td>';\r\n\r\n                for (var col = 0; col < 7; col++) {\r\n\r\n                    var classes = [];\r\n\r\n                    //highlight today's date\r\n                    if (calendar[row][col].isSame(new Date(), \"day\"))\r\n                        classes.push('today');\r\n\r\n                    //highlight weekends\r\n                    if (calendar[row][col].isoWeekday() > 5)\r\n                        classes.push('weekend');\r\n\r\n                    //grey out the dates in other months displayed at beginning and end of this calendar\r\n                    if (calendar[row][col].month() != calendar[1][1].month())\r\n                        classes.push('off', 'ends');\r\n\r\n                    //don't allow selection of dates before the minimum date\r\n                    if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day'))\r\n                        classes.push('off', 'disabled');\r\n\r\n                    //don't allow selection of dates after the maximum date\r\n                    if (maxDate && calendar[row][col].isAfter(maxDate, 'day'))\r\n                        classes.push('off', 'disabled');\r\n\r\n                    //don't allow selection of date if a custom function decides it's invalid\r\n                    if (this.isInvalidDate(calendar[row][col]))\r\n                        classes.push('off', 'disabled');\r\n\r\n                    //highlight the currently selected start date\r\n                    if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD'))\r\n                        classes.push('active', 'start-date');\r\n\r\n                    //highlight the currently selected end date\r\n                    if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD'))\r\n                        classes.push('active', 'end-date');\r\n\r\n                    //highlight dates in-between the selected dates\r\n                    if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate)\r\n                        classes.push('in-range');\r\n\r\n                    //apply custom classes for this date\r\n                    var isCustom = this.isCustomDate(calendar[row][col]);\r\n                    if (isCustom !== false) {\r\n                        if (typeof isCustom === 'string')\r\n                            classes.push(isCustom);\r\n                        else\r\n                            Array.prototype.push.apply(classes, isCustom);\r\n                    }\r\n\r\n                    var cname = '', disabled = false;\r\n                    for (var i = 0; i < classes.length; i++) {\r\n                        cname += classes[i] + ' ';\r\n                        if (classes[i] == 'disabled')\r\n                            disabled = true;\r\n                    }\r\n                    if (!disabled)\r\n                        cname += 'available';\r\n\r\n                    html += '<td class=\"' + cname.replace(/^\\s+|\\s+$/g, '') + '\" data-title=\"' + 'r' + row + 'c' + col + '\">' + calendar[row][col].date() + '</td>';\r\n\r\n                }\r\n                html += '</tr>';\r\n            }\r\n\r\n            html += '</tbody>';\r\n            html += '</table>';\r\n\r\n            this.container.find('.drp-calendar.' + side + ' .calendar-table').html(html);\r\n\r\n        },\r\n\r\n        renderTimePicker: function(side) {\r\n\r\n            // Don't bother updating the time picker if it's currently disabled\r\n            // because an end date hasn't been clicked yet\r\n            if (side == 'right' && !this.endDate) return;\r\n\r\n            var html, selected, minDate, maxDate = this.maxDate;\r\n\r\n            if (this.maxSpan && (!this.maxDate || this.startDate.clone().add(this.maxSpan).isBefore(this.maxDate)))\r\n                maxDate = this.startDate.clone().add(this.maxSpan);\r\n\r\n            if (side == 'left') {\r\n                selected = this.startDate.clone();\r\n                minDate = this.minDate;\r\n            } else if (side == 'right') {\r\n                selected = this.endDate.clone();\r\n                minDate = this.startDate;\r\n\r\n                //Preserve the time already selected\r\n                var timeSelector = this.container.find('.drp-calendar.right .calendar-time');\r\n                if (timeSelector.html() != '') {\r\n\r\n                    selected.hour(!isNaN(selected.hour()) ? selected.hour() : timeSelector.find('.hourselect option:selected').val());\r\n                    selected.minute(!isNaN(selected.minute()) ? selected.minute() : timeSelector.find('.minuteselect option:selected').val());\r\n                    selected.second(!isNaN(selected.second()) ? selected.second() : timeSelector.find('.secondselect option:selected').val());\r\n\r\n                    if (!this.timePicker24Hour) {\r\n                        var ampm = timeSelector.find('.ampmselect option:selected').val();\r\n                        if (ampm === 'PM' && selected.hour() < 12)\r\n                            selected.hour(selected.hour() + 12);\r\n                        if (ampm === 'AM' && selected.hour() === 12)\r\n                            selected.hour(0);\r\n                    }\r\n\r\n                }\r\n\r\n                if (selected.isBefore(this.startDate))\r\n                    selected = this.startDate.clone();\r\n\r\n                if (maxDate && selected.isAfter(maxDate))\r\n                    selected = maxDate.clone();\r\n\r\n            }\r\n\r\n            //\r\n            // hours\r\n            //\r\n\r\n            html = '<select class=\"hourselect\">';\r\n\r\n            var start = this.timePicker24Hour ? 0 : 1;\r\n            var end = this.timePicker24Hour ? 23 : 12;\r\n\r\n            for (var i = start; i <= end; i++) {\r\n                var i_in_24 = i;\r\n                if (!this.timePicker24Hour)\r\n                    i_in_24 = selected.hour() >= 12 ? (i == 12 ? 12 : i + 12) : (i == 12 ? 0 : i);\r\n\r\n                var time = selected.clone().hour(i_in_24);\r\n                var disabled = false;\r\n                if (minDate && time.minute(59).isBefore(minDate))\r\n                    disabled = true;\r\n                if (maxDate && time.minute(0).isAfter(maxDate))\r\n                    disabled = true;\r\n\r\n                if (i_in_24 == selected.hour() && !disabled) {\r\n                    html += '<option value=\"' + i + '\" selected=\"selected\">' + i + '</option>';\r\n                } else if (disabled) {\r\n                    html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + i + '</option>';\r\n                } else {\r\n                    html += '<option value=\"' + i + '\">' + i + '</option>';\r\n                }\r\n            }\r\n\r\n            html += '</select> ';\r\n\r\n            //\r\n            // minutes\r\n            //\r\n\r\n            html += ': <select class=\"minuteselect\">';\r\n\r\n            for (var i = 0; i < 60; i += this.timePickerIncrement) {\r\n                var padded = i < 10 ? '0' + i : i;\r\n                var time = selected.clone().minute(i);\r\n\r\n                var disabled = false;\r\n                if (minDate && time.second(59).isBefore(minDate))\r\n                    disabled = true;\r\n                if (maxDate && time.second(0).isAfter(maxDate))\r\n                    disabled = true;\r\n\r\n                if (selected.minute() == i && !disabled) {\r\n                    html += '<option value=\"' + i + '\" selected=\"selected\">' + padded + '</option>';\r\n                } else if (disabled) {\r\n                    html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + padded + '</option>';\r\n                } else {\r\n                    html += '<option value=\"' + i + '\">' + padded + '</option>';\r\n                }\r\n            }\r\n\r\n            html += '</select> ';\r\n\r\n            //\r\n            // seconds\r\n            //\r\n\r\n            if (this.timePickerSeconds) {\r\n                html += ': <select class=\"secondselect\">';\r\n\r\n                for (var i = 0; i < 60; i++) {\r\n                    var padded = i < 10 ? '0' + i : i;\r\n                    var time = selected.clone().second(i);\r\n\r\n                    var disabled = false;\r\n                    if (minDate && time.isBefore(minDate))\r\n                        disabled = true;\r\n                    if (maxDate && time.isAfter(maxDate))\r\n                        disabled = true;\r\n\r\n                    if (selected.second() == i && !disabled) {\r\n                        html += '<option value=\"' + i + '\" selected=\"selected\">' + padded + '</option>';\r\n                    } else if (disabled) {\r\n                        html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + padded + '</option>';\r\n                    } else {\r\n                        html += '<option value=\"' + i + '\">' + padded + '</option>';\r\n                    }\r\n                }\r\n\r\n                html += '</select> ';\r\n            }\r\n\r\n            //\r\n            // AM/PM\r\n            //\r\n\r\n            if (!this.timePicker24Hour) {\r\n                html += '<select class=\"ampmselect\">';\r\n\r\n                var am_html = '';\r\n                var pm_html = '';\r\n\r\n                if (minDate && selected.clone().hour(12).minute(0).second(0).isBefore(minDate))\r\n                    am_html = ' disabled=\"disabled\" class=\"disabled\"';\r\n\r\n                if (maxDate && selected.clone().hour(0).minute(0).second(0).isAfter(maxDate))\r\n                    pm_html = ' disabled=\"disabled\" class=\"disabled\"';\r\n\r\n                if (selected.hour() >= 12) {\r\n                    html += '<option value=\"AM\"' + am_html + '>AM</option><option value=\"PM\" selected=\"selected\"' + pm_html + '>PM</option>';\r\n                } else {\r\n                    html += '<option value=\"AM\" selected=\"selected\"' + am_html + '>AM</option><option value=\"PM\"' + pm_html + '>PM</option>';\r\n                }\r\n\r\n                html += '</select>';\r\n            }\r\n\r\n            this.container.find('.drp-calendar.' + side + ' .calendar-time').html(html);\r\n\r\n        },\r\n\r\n        updateFormInputs: function() {\r\n\r\n            if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) {\r\n                this.container.find('button.applyBtn').prop('disabled', false);\r\n            } else {\r\n                this.container.find('button.applyBtn').prop('disabled', true);\r\n            }\r\n\r\n        },\r\n\r\n        move: function() {\r\n            var parentOffset = { top: 0, left: 0 },\r\n                containerTop,\r\n                drops = this.drops;\r\n\r\n            var parentRightEdge = $(window).width();\r\n            if (!this.parentEl.is('body')) {\r\n                parentOffset = {\r\n                    top: this.parentEl.offset().top - this.parentEl.scrollTop(),\r\n                    left: this.parentEl.offset().left - this.parentEl.scrollLeft()\r\n                };\r\n                parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left;\r\n            }\r\n\r\n            switch (drops) {\r\n            case 'auto':\r\n                containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top;\r\n                if (containerTop + this.container.outerHeight() >= this.parentEl[0].scrollHeight) {\r\n                    containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top;\r\n                    drops = 'up';\r\n                }\r\n                break;\r\n            case 'up':\r\n                containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top;\r\n                break;\r\n            default:\r\n                containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top;\r\n                break;\r\n            }\r\n\r\n            // Force the container to it's actual width\r\n            this.container.css({\r\n              top: 0,\r\n              left: 0,\r\n              right: 'auto'\r\n            });\r\n            var containerWidth = this.container.outerWidth();\r\n\r\n            this.container.toggleClass('drop-up', drops == 'up');\r\n\r\n            if (this.opens == 'left') {\r\n                var containerRight = parentRightEdge - this.element.offset().left - this.element.outerWidth();\r\n                if (containerWidth + containerRight > $(window).width()) {\r\n                    this.container.css({\r\n                        top: containerTop,\r\n                        right: 'auto',\r\n                        left: 9\r\n                    });\r\n                } else {\r\n                    this.container.css({\r\n                        top: containerTop,\r\n                        right: containerRight,\r\n                        left: 'auto'\r\n                    });\r\n                }\r\n            } else if (this.opens == 'center') {\r\n                var containerLeft = this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2\r\n                                        - containerWidth / 2;\r\n                if (containerLeft < 0) {\r\n                    this.container.css({\r\n                        top: containerTop,\r\n                        right: 'auto',\r\n                        left: 9\r\n                    });\r\n                } else if (containerLeft + containerWidth > $(window).width()) {\r\n                    this.container.css({\r\n                        top: containerTop,\r\n                        left: 'auto',\r\n                        right: 0\r\n                    });\r\n                } else {\r\n                    this.container.css({\r\n                        top: containerTop,\r\n                        left: containerLeft,\r\n                        right: 'auto'\r\n                    });\r\n                }\r\n            } else {\r\n                var containerLeft = this.element.offset().left - parentOffset.left;\r\n                if (containerLeft + containerWidth > $(window).width()) {\r\n                    this.container.css({\r\n                        top: containerTop,\r\n                        left: 'auto',\r\n                        right: 0\r\n                    });\r\n                } else {\r\n                    this.container.css({\r\n                        top: containerTop,\r\n                        left: containerLeft,\r\n                        right: 'auto'\r\n                    });\r\n                }\r\n            }\r\n        },\r\n\r\n        show: function(e) {\r\n            if (this.isShowing) return;\r\n\r\n            // Create a click proxy that is private to this instance of datepicker, for unbinding\r\n            this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this);\r\n\r\n            // Bind global datepicker mousedown for hiding and\r\n            $(document)\r\n              .on('mousedown.daterangepicker', this._outsideClickProxy)\r\n              // also support mobile devices\r\n              .on('touchend.daterangepicker', this._outsideClickProxy)\r\n              // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them\r\n              .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy)\r\n              // and also close when focus changes to outside the picker (eg. tabbing between controls)\r\n              .on('focusin.daterangepicker', this._outsideClickProxy);\r\n\r\n            // Reposition the picker if the window is resized while it's open\r\n            $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this));\r\n\r\n            this.oldStartDate = this.startDate.clone();\r\n            this.oldEndDate = this.endDate.clone();\r\n            this.previousRightTime = this.endDate.clone();\r\n\r\n            this.updateView();\r\n            this.container.show();\r\n            this.move();\r\n            this.element.trigger('show.daterangepicker', this);\r\n            this.isShowing = true;\r\n        },\r\n\r\n        hide: function(e) {\r\n            if (!this.isShowing) return;\r\n\r\n            //incomplete date selection, revert to last values\r\n            if (!this.endDate) {\r\n                this.startDate = this.oldStartDate.clone();\r\n                this.endDate = this.oldEndDate.clone();\r\n            }\r\n\r\n            //if a new date range was selected, invoke the user callback function\r\n            if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate))\r\n                this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel);\r\n\r\n            //if picker is attached to a text input, update it\r\n            this.updateElement();\r\n\r\n            $(document).off('.daterangepicker');\r\n            $(window).off('.daterangepicker');\r\n            this.container.hide();\r\n            this.element.trigger('hide.daterangepicker', this);\r\n            this.isShowing = false;\r\n        },\r\n\r\n        toggle: function(e) {\r\n            if (this.isShowing) {\r\n                this.hide();\r\n            } else {\r\n                this.show();\r\n            }\r\n        },\r\n\r\n        outsideClick: function(e) {\r\n            var target = $(e.target);\r\n            // if the page is clicked anywhere except within the daterangerpicker/button\r\n            // itself then call this.hide()\r\n            if (\r\n                // ie modal dialog fix\r\n                e.type == \"focusin\" ||\r\n                target.closest(this.element).length ||\r\n                target.closest(this.container).length ||\r\n                target.closest('.calendar-table').length\r\n                ) return;\r\n            this.hide();\r\n            this.element.trigger('outsideClick.daterangepicker', this);\r\n        },\r\n\r\n        showCalendars: function() {\r\n            this.container.addClass('show-calendar');\r\n            this.move();\r\n            this.element.trigger('showCalendar.daterangepicker', this);\r\n        },\r\n\r\n        hideCalendars: function() {\r\n            this.container.removeClass('show-calendar');\r\n            this.element.trigger('hideCalendar.daterangepicker', this);\r\n        },\r\n\r\n        clickRange: function(e) {\r\n            var label = e.target.getAttribute('data-range-key');\r\n            this.chosenLabel = label;\r\n            if (label == this.locale.customRangeLabel) {\r\n                this.showCalendars();\r\n            } else {\r\n                var dates = this.ranges[label];\r\n                this.startDate = dates[0];\r\n                this.endDate = dates[1];\r\n\r\n                if (!this.timePicker) {\r\n                    this.startDate.startOf('day');\r\n                    this.endDate.endOf('day');\r\n                }\r\n\r\n                if (!this.alwaysShowCalendars)\r\n                    this.hideCalendars();\r\n                this.clickApply();\r\n            }\r\n        },\r\n\r\n        clickPrev: function(e) {\r\n            var cal = $(e.target).parents('.drp-calendar');\r\n            if (cal.hasClass('left')) {\r\n                this.leftCalendar.month.subtract(1, 'month');\r\n                if (this.linkedCalendars)\r\n                    this.rightCalendar.month.subtract(1, 'month');\r\n            } else {\r\n                this.rightCalendar.month.subtract(1, 'month');\r\n            }\r\n            this.updateCalendars();\r\n        },\r\n\r\n        clickNext: function(e) {\r\n            var cal = $(e.target).parents('.drp-calendar');\r\n            if (cal.hasClass('left')) {\r\n                this.leftCalendar.month.add(1, 'month');\r\n            } else {\r\n                this.rightCalendar.month.add(1, 'month');\r\n                if (this.linkedCalendars)\r\n                    this.leftCalendar.month.add(1, 'month');\r\n            }\r\n            this.updateCalendars();\r\n        },\r\n\r\n        hoverDate: function(e) {\r\n\r\n            //ignore dates that can't be selected\r\n            if (!$(e.target).hasClass('available')) return;\r\n\r\n            var title = $(e.target).attr('data-title');\r\n            var row = title.substr(1, 1);\r\n            var col = title.substr(3, 1);\r\n            var cal = $(e.target).parents('.drp-calendar');\r\n            var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\r\n\r\n            //highlight the dates between the start date and the date being hovered as a potential end date\r\n            var leftCalendar = this.leftCalendar;\r\n            var rightCalendar = this.rightCalendar;\r\n            var startDate = this.startDate;\r\n            if (!this.endDate) {\r\n                this.container.find('.drp-calendar tbody td').each(function(index, el) {\r\n\r\n                    //skip week numbers, only look at dates\r\n                    if ($(el).hasClass('week')) return;\r\n\r\n                    var title = $(el).attr('data-title');\r\n                    var row = title.substr(1, 1);\r\n                    var col = title.substr(3, 1);\r\n                    var cal = $(el).parents('.drp-calendar');\r\n                    var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col];\r\n\r\n                    if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) {\r\n                        $(el).addClass('in-range');\r\n                    } else {\r\n                        $(el).removeClass('in-range');\r\n                    }\r\n\r\n                });\r\n            }\r\n\r\n        },\r\n\r\n        clickDate: function(e) {\r\n\r\n            if (!$(e.target).hasClass('available')) return;\r\n\r\n            var title = $(e.target).attr('data-title');\r\n            var row = title.substr(1, 1);\r\n            var col = title.substr(3, 1);\r\n            var cal = $(e.target).parents('.drp-calendar');\r\n            var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\r\n\r\n            //\r\n            // this function needs to do a few things:\r\n            // * alternate between selecting a start and end date for the range,\r\n            // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date\r\n            // * if autoapply is enabled, and an end date was chosen, apply the selection\r\n            // * if single date picker mode, and time picker isn't enabled, apply the selection immediately\r\n            // * if one of the inputs above the calendars was focused, cancel that manual input\r\n            //\r\n\r\n            if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start\r\n                if (this.timePicker) {\r\n                    var hour = parseInt(this.container.find('.left .hourselect').val(), 10);\r\n                    if (!this.timePicker24Hour) {\r\n                        var ampm = this.container.find('.left .ampmselect').val();\r\n                        if (ampm === 'PM' && hour < 12)\r\n                            hour += 12;\r\n                        if (ampm === 'AM' && hour === 12)\r\n                            hour = 0;\r\n                    }\r\n                    var minute = parseInt(this.container.find('.left .minuteselect').val(), 10);\r\n                    if (isNaN(minute)) {\r\n                        minute = parseInt(this.container.find('.left .minuteselect option:last').val(), 10);\r\n                    }\r\n                    var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0;\r\n                    date = date.clone().hour(hour).minute(minute).second(second);\r\n                }\r\n                this.endDate = null;\r\n                this.setStartDate(date.clone());\r\n            } else if (!this.endDate && date.isBefore(this.startDate)) {\r\n                //special case: clicking the same date for start/end,\r\n                //but the time of the end date is before the start date\r\n                this.setEndDate(this.startDate.clone());\r\n            } else { // picking end\r\n                if (this.timePicker) {\r\n                    var hour = parseInt(this.container.find('.right .hourselect').val(), 10);\r\n                    if (!this.timePicker24Hour) {\r\n                        var ampm = this.container.find('.right .ampmselect').val();\r\n                        if (ampm === 'PM' && hour < 12)\r\n                            hour += 12;\r\n                        if (ampm === 'AM' && hour === 12)\r\n                            hour = 0;\r\n                    }\r\n                    var minute = parseInt(this.container.find('.right .minuteselect').val(), 10);\r\n                    if (isNaN(minute)) {\r\n                        minute = parseInt(this.container.find('.right .minuteselect option:last').val(), 10);\r\n                    }\r\n                    var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0;\r\n                    date = date.clone().hour(hour).minute(minute).second(second);\r\n                }\r\n                this.setEndDate(date.clone());\r\n                if (this.autoApply) {\r\n                  this.calculateChosenLabel();\r\n                  this.clickApply();\r\n                }\r\n            }\r\n\r\n            if (this.singleDatePicker) {\r\n                this.setEndDate(this.startDate);\r\n                if (!this.timePicker && this.autoApply)\r\n                    this.clickApply();\r\n            }\r\n\r\n            this.updateView();\r\n\r\n            //This is to cancel the blur event handler if the mouse was in one of the inputs\r\n            e.stopPropagation();\r\n\r\n        },\r\n\r\n        calculateChosenLabel: function () {\r\n            var customRange = true;\r\n            var i = 0;\r\n            for (var range in this.ranges) {\r\n              if (this.timePicker) {\r\n                    var format = this.timePickerSeconds ? \"YYYY-MM-DD HH:mm:ss\" : \"YYYY-MM-DD HH:mm\";\r\n                    //ignore times when comparing dates if time picker seconds is not enabled\r\n                    if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) {\r\n                        customRange = false;\r\n                        this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key');\r\n                        break;\r\n                    }\r\n                } else {\r\n                    //ignore times when comparing dates if time picker is not enabled\r\n                    if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) {\r\n                        customRange = false;\r\n                        this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key');\r\n                        break;\r\n                    }\r\n                }\r\n                i++;\r\n            }\r\n            if (customRange) {\r\n                if (this.showCustomRangeLabel) {\r\n                    this.chosenLabel = this.container.find('.ranges li:last').addClass('active').attr('data-range-key');\r\n                } else {\r\n                    this.chosenLabel = null;\r\n                }\r\n                this.showCalendars();\r\n            }\r\n        },\r\n\r\n        clickApply: function(e) {\r\n            this.hide();\r\n            this.element.trigger('apply.daterangepicker', this);\r\n        },\r\n\r\n        clickCancel: function(e) {\r\n            this.startDate = this.oldStartDate;\r\n            this.endDate = this.oldEndDate;\r\n            this.hide();\r\n            this.element.trigger('cancel.daterangepicker', this);\r\n        },\r\n\r\n        monthOrYearChanged: function(e) {\r\n            var isLeft = $(e.target).closest('.drp-calendar').hasClass('left'),\r\n                leftOrRight = isLeft ? 'left' : 'right',\r\n                cal = this.container.find('.drp-calendar.'+leftOrRight);\r\n\r\n            // Month must be Number for new moment versions\r\n            var month = parseInt(cal.find('.monthselect').val(), 10);\r\n            var year = cal.find('.yearselect').val();\r\n\r\n            if (!isLeft) {\r\n                if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) {\r\n                    month = this.startDate.month();\r\n                    year = this.startDate.year();\r\n                }\r\n            }\r\n\r\n            if (this.minDate) {\r\n                if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) {\r\n                    month = this.minDate.month();\r\n                    year = this.minDate.year();\r\n                }\r\n            }\r\n\r\n            if (this.maxDate) {\r\n                if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) {\r\n                    month = this.maxDate.month();\r\n                    year = this.maxDate.year();\r\n                }\r\n            }\r\n\r\n            if (isLeft) {\r\n                this.leftCalendar.month.month(month).year(year);\r\n                if (this.linkedCalendars)\r\n                    this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month');\r\n            } else {\r\n                this.rightCalendar.month.month(month).year(year);\r\n                if (this.linkedCalendars)\r\n                    this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month');\r\n            }\r\n            this.updateCalendars();\r\n        },\r\n\r\n        timeChanged: function(e) {\r\n\r\n            var cal = $(e.target).closest('.drp-calendar'),\r\n                isLeft = cal.hasClass('left');\r\n\r\n            var hour = parseInt(cal.find('.hourselect').val(), 10);\r\n            var minute = parseInt(cal.find('.minuteselect').val(), 10);\r\n            if (isNaN(minute)) {\r\n                minute = parseInt(cal.find('.minuteselect option:last').val(), 10);\r\n            }\r\n            var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0;\r\n\r\n            if (!this.timePicker24Hour) {\r\n                var ampm = cal.find('.ampmselect').val();\r\n                if (ampm === 'PM' && hour < 12)\r\n                    hour += 12;\r\n                if (ampm === 'AM' && hour === 12)\r\n                    hour = 0;\r\n            }\r\n\r\n            if (isLeft) {\r\n                var start = this.startDate.clone();\r\n                start.hour(hour);\r\n                start.minute(minute);\r\n                start.second(second);\r\n                this.setStartDate(start);\r\n                if (this.singleDatePicker) {\r\n                    this.endDate = this.startDate.clone();\r\n                } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) {\r\n                    this.setEndDate(start.clone());\r\n                }\r\n            } else if (this.endDate) {\r\n                var end = this.endDate.clone();\r\n                end.hour(hour);\r\n                end.minute(minute);\r\n                end.second(second);\r\n                this.setEndDate(end);\r\n            }\r\n\r\n            //update the calendars so all clickable dates reflect the new time component\r\n            this.updateCalendars();\r\n\r\n            //update the form inputs above the calendars with the new time\r\n            this.updateFormInputs();\r\n\r\n            //re-render the time pickers because changing one selection can affect what's enabled in another\r\n            this.renderTimePicker('left');\r\n            this.renderTimePicker('right');\r\n\r\n        },\r\n\r\n        elementChanged: function() {\r\n            if (!this.element.is('input')) return;\r\n            if (!this.element.val().length) return;\r\n\r\n            var dateString = this.element.val().split(this.locale.separator),\r\n                start = null,\r\n                end = null;\r\n\r\n            if (dateString.length === 2) {\r\n                start = moment(dateString[0], this.locale.format);\r\n                end = moment(dateString[1], this.locale.format);\r\n            }\r\n\r\n            if (this.singleDatePicker || start === null || end === null) {\r\n                start = moment(this.element.val(), this.locale.format);\r\n                end = start;\r\n            }\r\n\r\n            if (!start.isValid() || !end.isValid()) return;\r\n\r\n            this.setStartDate(start);\r\n            this.setEndDate(end);\r\n            this.updateView();\r\n        },\r\n\r\n        keydown: function(e) {\r\n            //hide on tab or enter\r\n            if ((e.keyCode === 9) || (e.keyCode === 13)) {\r\n                this.hide();\r\n            }\r\n\r\n            //hide on esc and prevent propagation\r\n            if (e.keyCode === 27) {\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n\r\n                this.hide();\r\n            }\r\n        },\r\n\r\n        updateElement: function() {\r\n            if (this.element.is('input') && this.autoUpdateInput) {\r\n                var newValue = this.startDate.format(this.locale.format);\r\n                if (!this.singleDatePicker) {\r\n                    newValue += this.locale.separator + this.endDate.format(this.locale.format);\r\n                }\r\n                if (newValue !== this.element.val()) {\r\n                    this.element.val(newValue).trigger('change');\r\n                }\r\n            }\r\n        },\r\n\r\n        remove: function() {\r\n            this.container.remove();\r\n            this.element.off('.daterangepicker');\r\n            this.element.removeData();\r\n        }\r\n\r\n    };\r\n\r\n    $.fn.daterangepicker = function(options, callback) {\r\n        var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options);\r\n        this.each(function() {\r\n            var el = $(this);\r\n            if (el.data('daterangepicker'))\r\n                el.data('daterangepicker').remove();\r\n            el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback));\r\n        });\r\n        return this;\r\n    };\r\n\r\n    return DateRangePicker;\r\n\r\n}));\r\n","/*!\r\n * Bootstrap-select v1.13.17 (https://developer.snapappointments.com/bootstrap-select)\r\n *\r\n * Copyright 2012-2020 SnapAppointments, LLC\r\n * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)\r\n */\r\n\r\n(function (root, factory) {\r\n  if (root === undefined && window !== undefined) root = window;\r\n  if (typeof define === 'function' && define.amd) {\r\n    // AMD. Register as an anonymous module unless amdModuleId is set\r\n    define([\"jquery\"], function (a0) {\r\n      return (factory(a0));\r\n    });\r\n  } else if (typeof module === 'object' && module.exports) {\r\n    // Node. Does not work with strict CommonJS, but\r\n    // only CommonJS-like environments that support module.exports,\r\n    // like Node.\r\n    module.exports = factory(require(\"jquery\"));\r\n  } else {\r\n    factory(root[\"jQuery\"]);\r\n  }\r\n}(this, function (jQuery) {\r\n\r\n(function ($) {\r\n  'use strict';\r\n\r\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\r\n\r\n  var uriAttrs = [\r\n    'background',\r\n    'cite',\r\n    'href',\r\n    'itemtype',\r\n    'longdesc',\r\n    'poster',\r\n    'src',\r\n    'xlink:href'\r\n  ];\r\n\r\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\r\n\r\n  var DefaultWhitelist = {\r\n    // Global attributes allowed on any supplied element below.\r\n    '*': ['class', 'dir', 'id', 'lang', 'role', 'tabindex', 'style', ARIA_ATTRIBUTE_PATTERN],\r\n    a: ['target', 'href', 'title', 'rel'],\r\n    area: [],\r\n    b: [],\r\n    br: [],\r\n    col: [],\r\n    code: [],\r\n    div: [],\r\n    em: [],\r\n    hr: [],\r\n    h1: [],\r\n    h2: [],\r\n    h3: [],\r\n    h4: [],\r\n    h5: [],\r\n    h6: [],\r\n    i: [],\r\n    img: ['src', 'alt', 'title', 'width', 'height'],\r\n    li: [],\r\n    ol: [],\r\n    p: [],\r\n    pre: [],\r\n    s: [],\r\n    small: [],\r\n    span: [],\r\n    sub: [],\r\n    sup: [],\r\n    strong: [],\r\n    u: [],\r\n    ul: []\r\n  }\r\n\r\n  /**\r\n   * A pattern that recognizes a commonly useful subset of URLs that are safe.\r\n   *\r\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\r\n   */\r\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\r\n\r\n  /**\r\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\r\n   *\r\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\r\n   */\r\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\r\n\r\n  function allowedAttribute (attr, allowedAttributeList) {\r\n    var attrName = attr.nodeName.toLowerCase()\r\n\r\n    if ($.inArray(attrName, allowedAttributeList) !== -1) {\r\n      if ($.inArray(attrName, uriAttrs) !== -1) {\r\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\r\n      }\r\n\r\n      return true\r\n    }\r\n\r\n    var regExp = $(allowedAttributeList).filter(function (index, value) {\r\n      return value instanceof RegExp\r\n    })\r\n\r\n    // Check if a regular expression validates the attribute.\r\n    for (var i = 0, l = regExp.length; i < l; i++) {\r\n      if (attrName.match(regExp[i])) {\r\n        return true\r\n      }\r\n    }\r\n\r\n    return false\r\n  }\r\n\r\n  function sanitizeHtml (unsafeElements, whiteList, sanitizeFn) {\r\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\r\n      return sanitizeFn(unsafeElements);\r\n    }\r\n\r\n    var whitelistKeys = Object.keys(whiteList);\r\n\r\n    for (var i = 0, len = unsafeElements.length; i < len; i++) {\r\n      var elements = unsafeElements[i].querySelectorAll('*');\r\n\r\n      for (var j = 0, len2 = elements.length; j < len2; j++) {\r\n        var el = elements[j];\r\n        var elName = el.nodeName.toLowerCase();\r\n\r\n        if (whitelistKeys.indexOf(elName) === -1) {\r\n          el.parentNode.removeChild(el);\r\n\r\n          continue;\r\n        }\r\n\r\n        var attributeList = [].slice.call(el.attributes);\r\n        var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\r\n\r\n        for (var k = 0, len3 = attributeList.length; k < len3; k++) {\r\n          var attr = attributeList[k];\r\n\r\n          if (!allowedAttribute(attr, whitelistedAttributes)) {\r\n            el.removeAttribute(attr.nodeName);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // Polyfill for browsers with no classList support\r\n  // Remove in v2\r\n  if (!('classList' in document.createElement('_'))) {\r\n    (function (view) {\r\n      if (!('Element' in view)) return;\r\n\r\n      var classListProp = 'classList',\r\n          protoProp = 'prototype',\r\n          elemCtrProto = view.Element[protoProp],\r\n          objCtr = Object,\r\n          classListGetter = function () {\r\n            var $elem = $(this);\r\n\r\n            return {\r\n              add: function (classes) {\r\n                classes = Array.prototype.slice.call(arguments).join(' ');\r\n                return $elem.addClass(classes);\r\n              },\r\n              remove: function (classes) {\r\n                classes = Array.prototype.slice.call(arguments).join(' ');\r\n                return $elem.removeClass(classes);\r\n              },\r\n              toggle: function (classes, force) {\r\n                return $elem.toggleClass(classes, force);\r\n              },\r\n              contains: function (classes) {\r\n                return $elem.hasClass(classes);\r\n              }\r\n            }\r\n          };\r\n\r\n      if (objCtr.defineProperty) {\r\n        var classListPropDesc = {\r\n          get: classListGetter,\r\n          enumerable: true,\r\n          configurable: true\r\n        };\r\n        try {\r\n          objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\r\n        } catch (ex) { // IE 8 doesn't support enumerable:true\r\n          // adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36\r\n          // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected\r\n          if (ex.number === undefined || ex.number === -0x7FF5EC54) {\r\n            classListPropDesc.enumerable = false;\r\n            objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\r\n          }\r\n        }\r\n      } else if (objCtr[protoProp].__defineGetter__) {\r\n        elemCtrProto.__defineGetter__(classListProp, classListGetter);\r\n      }\r\n    }(window));\r\n  }\r\n\r\n  var testElement = document.createElement('_');\r\n\r\n  testElement.classList.add('c1', 'c2');\r\n\r\n  if (!testElement.classList.contains('c2')) {\r\n    var _add = DOMTokenList.prototype.add,\r\n        _remove = DOMTokenList.prototype.remove;\r\n\r\n    DOMTokenList.prototype.add = function () {\r\n      Array.prototype.forEach.call(arguments, _add.bind(this));\r\n    }\r\n\r\n    DOMTokenList.prototype.remove = function () {\r\n      Array.prototype.forEach.call(arguments, _remove.bind(this));\r\n    }\r\n  }\r\n\r\n  testElement.classList.toggle('c3', false);\r\n\r\n  // Polyfill for IE 10 and Firefox <24, where classList.toggle does not\r\n  // support the second argument.\r\n  if (testElement.classList.contains('c3')) {\r\n    var _toggle = DOMTokenList.prototype.toggle;\r\n\r\n    DOMTokenList.prototype.toggle = function (token, force) {\r\n      if (1 in arguments && !this.contains(token) === !force) {\r\n        return force;\r\n      } else {\r\n        return _toggle.call(this, token);\r\n      }\r\n    };\r\n  }\r\n\r\n  testElement = null;\r\n\r\n  // shallow array comparison\r\n  function isEqual (array1, array2) {\r\n    return array1.length === array2.length && array1.every(function (element, index) {\r\n      return element === array2[index];\r\n    });\r\n  };\r\n\r\n  // <editor-fold desc=\"Shims\">\r\n  if (!String.prototype.startsWith) {\r\n    (function () {\r\n      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`\r\n      var defineProperty = (function () {\r\n        // IE 8 only supports `Object.defineProperty` on DOM elements\r\n        try {\r\n          var object = {};\r\n          var $defineProperty = Object.defineProperty;\r\n          var result = $defineProperty(object, object, object) && $defineProperty;\r\n        } catch (error) {\r\n        }\r\n        return result;\r\n      }());\r\n      var toString = {}.toString;\r\n      var startsWith = function (search) {\r\n        if (this == null) {\r\n          throw new TypeError();\r\n        }\r\n        var string = String(this);\r\n        if (search && toString.call(search) == '[object RegExp]') {\r\n          throw new TypeError();\r\n        }\r\n        var stringLength = string.length;\r\n        var searchString = String(search);\r\n        var searchLength = searchString.length;\r\n        var position = arguments.length > 1 ? arguments[1] : undefined;\r\n        // `ToInteger`\r\n        var pos = position ? Number(position) : 0;\r\n        if (pos != pos) { // better `isNaN`\r\n          pos = 0;\r\n        }\r\n        var start = Math.min(Math.max(pos, 0), stringLength);\r\n        // Avoid the `indexOf` call if no match is possible\r\n        if (searchLength + start > stringLength) {\r\n          return false;\r\n        }\r\n        var index = -1;\r\n        while (++index < searchLength) {\r\n          if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {\r\n            return false;\r\n          }\r\n        }\r\n        return true;\r\n      };\r\n      if (defineProperty) {\r\n        defineProperty(String.prototype, 'startsWith', {\r\n          'value': startsWith,\r\n          'configurable': true,\r\n          'writable': true\r\n        });\r\n      } else {\r\n        String.prototype.startsWith = startsWith;\r\n      }\r\n    }());\r\n  }\r\n\r\n  if (!Object.keys) {\r\n    Object.keys = function (\r\n      o, // object\r\n      k, // key\r\n      r  // result array\r\n    ) {\r\n      // initialize object and result\r\n      r = [];\r\n      // iterate over object keys\r\n      for (k in o) {\r\n        // fill result array with non-prototypical keys\r\n        r.hasOwnProperty.call(o, k) && r.push(k);\r\n      }\r\n      // return result\r\n      return r;\r\n    };\r\n  }\r\n\r\n  if (HTMLSelectElement && !HTMLSelectElement.prototype.hasOwnProperty('selectedOptions')) {\r\n    Object.defineProperty(HTMLSelectElement.prototype, 'selectedOptions', {\r\n      get: function () {\r\n        return this.querySelectorAll(':checked');\r\n      }\r\n    });\r\n  }\r\n\r\n  function getSelectedOptions (select, ignoreDisabled) {\r\n    var selectedOptions = select.selectedOptions,\r\n        options = [],\r\n        opt;\r\n\r\n    if (ignoreDisabled) {\r\n      for (var i = 0, len = selectedOptions.length; i < len; i++) {\r\n        opt = selectedOptions[i];\r\n\r\n        if (!(opt.disabled || opt.parentNode.tagName === 'OPTGROUP' && opt.parentNode.disabled)) {\r\n          options.push(opt);\r\n        }\r\n      }\r\n\r\n      return options;\r\n    }\r\n\r\n    return selectedOptions;\r\n  }\r\n\r\n  // much faster than $.val()\r\n  function getSelectValues (select, selectedOptions) {\r\n    var value = [],\r\n        options = selectedOptions || select.selectedOptions,\r\n        opt;\r\n\r\n    for (var i = 0, len = options.length; i < len; i++) {\r\n      opt = options[i];\r\n\r\n      if (!(opt.disabled || opt.parentNode.tagName === 'OPTGROUP' && opt.parentNode.disabled)) {\r\n        value.push(opt.value);\r\n      }\r\n    }\r\n\r\n    if (!select.multiple) {\r\n      return !value.length ? null : value[0];\r\n    }\r\n\r\n    return value;\r\n  }\r\n\r\n  // set data-selected on select element if the value has been programmatically selected\r\n  // prior to initialization of bootstrap-select\r\n  // * consider removing or replacing an alternative method *\r\n  var valHooks = {\r\n    useDefault: false,\r\n    _set: $.valHooks.select.set\r\n  };\r\n\r\n  $.valHooks.select.set = function (elem, value) {\r\n    if (value && !valHooks.useDefault) $(elem).data('selected', true);\r\n\r\n    return valHooks._set.apply(this, arguments);\r\n  };\r\n\r\n  var changedArguments = null;\r\n\r\n  var EventIsSupported = (function () {\r\n    try {\r\n      new Event('change');\r\n      return true;\r\n    } catch (e) {\r\n      return false;\r\n    }\r\n  })();\r\n\r\n  $.fn.triggerNative = function (eventName) {\r\n    var el = this[0],\r\n        event;\r\n\r\n    if (el.dispatchEvent) { // for modern browsers & IE9+\r\n      if (EventIsSupported) {\r\n        // For modern browsers\r\n        event = new Event(eventName, {\r\n          bubbles: true\r\n        });\r\n      } else {\r\n        // For IE since it doesn't support Event constructor\r\n        event = document.createEvent('Event');\r\n        event.initEvent(eventName, true, false);\r\n      }\r\n\r\n      el.dispatchEvent(event);\r\n    } else if (el.fireEvent) { // for IE8\r\n      event = document.createEventObject();\r\n      event.eventType = eventName;\r\n      el.fireEvent('on' + eventName, event);\r\n    } else {\r\n      // fall back to jQuery.trigger\r\n      this.trigger(eventName);\r\n    }\r\n  };\r\n  // </editor-fold>\r\n\r\n  function stringSearch (li, searchString, method, normalize) {\r\n    var stringTypes = [\r\n          'display',\r\n          'subtext',\r\n          'tokens'\r\n        ],\r\n        searchSuccess = false;\r\n\r\n    for (var i = 0; i < stringTypes.length; i++) {\r\n      var stringType = stringTypes[i],\r\n          string = li[stringType];\r\n\r\n      if (string) {\r\n        string = string.toString();\r\n\r\n        // Strip HTML tags. This isn't perfect, but it's much faster than any other method\r\n        if (stringType === 'display') {\r\n          string = string.replace(/<[^>]+>/g, '');\r\n        }\r\n\r\n        if (normalize) string = normalizeToBase(string);\r\n        string = string.toUpperCase();\r\n\r\n        if (method === 'contains') {\r\n          searchSuccess = string.indexOf(searchString) >= 0;\r\n        } else {\r\n          searchSuccess = string.startsWith(searchString);\r\n        }\r\n\r\n        if (searchSuccess) break;\r\n      }\r\n    }\r\n\r\n    return searchSuccess;\r\n  }\r\n\r\n  function toInteger (value) {\r\n    return parseInt(value, 10) || 0;\r\n  }\r\n\r\n  // Borrowed from Lodash (_.deburr)\r\n  /** Used to map Latin Unicode letters to basic Latin letters. */\r\n  var deburredLetters = {\r\n    // Latin-1 Supplement block.\r\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\r\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\r\n    '\\xc7': 'C',  '\\xe7': 'c',\r\n    '\\xd0': 'D',  '\\xf0': 'd',\r\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\r\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\r\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\r\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\r\n    '\\xd1': 'N',  '\\xf1': 'n',\r\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\r\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\r\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\r\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\r\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\r\n    '\\xc6': 'Ae', '\\xe6': 'ae',\r\n    '\\xde': 'Th', '\\xfe': 'th',\r\n    '\\xdf': 'ss',\r\n    // Latin Extended-A block.\r\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\r\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\r\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\r\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\r\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\r\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\r\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\r\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\r\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\r\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\r\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\r\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\r\n    '\\u0134': 'J',  '\\u0135': 'j',\r\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\r\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\r\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\r\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\r\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\r\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\r\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\r\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\r\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\r\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\r\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\r\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\r\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\r\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\r\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\r\n    '\\u0174': 'W',  '\\u0175': 'w',\r\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\r\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\r\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\r\n    '\\u0132': 'IJ', '\\u0133': 'ij',\r\n    '\\u0152': 'Oe', '\\u0153': 'oe',\r\n    '\\u0149': \"'n\", '\\u017f': 's'\r\n  };\r\n\r\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\r\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\r\n\r\n  /** Used to compose unicode character classes. */\r\n  var rsComboMarksRange = '\\\\u0300-\\\\u036f',\r\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\r\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\r\n      rsComboMarksExtendedRange = '\\\\u1ab0-\\\\u1aff',\r\n      rsComboMarksSupplementRange = '\\\\u1dc0-\\\\u1dff',\r\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange;\r\n\r\n  /** Used to compose unicode capture groups. */\r\n  var rsCombo = '[' + rsComboRange + ']';\r\n\r\n  /**\r\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\r\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\r\n   */\r\n  var reComboMark = RegExp(rsCombo, 'g');\r\n\r\n  function deburrLetter (key) {\r\n    return deburredLetters[key];\r\n  };\r\n\r\n  function normalizeToBase (string) {\r\n    string = string.toString();\r\n    return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\r\n  }\r\n\r\n  // List of HTML entities for escaping.\r\n  var escapeMap = {\r\n    '&': '&amp;',\r\n    '<': '&lt;',\r\n    '>': '&gt;',\r\n    '\"': '&quot;',\r\n    \"'\": '&#x27;',\r\n    '`': '&#x60;'\r\n  };\r\n\r\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\r\n  var createEscaper = function (map) {\r\n    var escaper = function (match) {\r\n      return map[match];\r\n    };\r\n    // Regexes for identifying a key that needs to be escaped.\r\n    var source = '(?:' + Object.keys(map).join('|') + ')';\r\n    var testRegexp = RegExp(source);\r\n    var replaceRegexp = RegExp(source, 'g');\r\n    return function (string) {\r\n      string = string == null ? '' : '' + string;\r\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\r\n    };\r\n  };\r\n\r\n  var htmlEscape = createEscaper(escapeMap);\r\n\r\n  /**\r\n   * ------------------------------------------------------------------------\r\n   * Constants\r\n   * ------------------------------------------------------------------------\r\n   */\r\n\r\n  var keyCodeMap = {\r\n    32: ' ',\r\n    48: '0',\r\n    49: '1',\r\n    50: '2',\r\n    51: '3',\r\n    52: '4',\r\n    53: '5',\r\n    54: '6',\r\n    55: '7',\r\n    56: '8',\r\n    57: '9',\r\n    59: ';',\r\n    65: 'A',\r\n    66: 'B',\r\n    67: 'C',\r\n    68: 'D',\r\n    69: 'E',\r\n    70: 'F',\r\n    71: 'G',\r\n    72: 'H',\r\n    73: 'I',\r\n    74: 'J',\r\n    75: 'K',\r\n    76: 'L',\r\n    77: 'M',\r\n    78: 'N',\r\n    79: 'O',\r\n    80: 'P',\r\n    81: 'Q',\r\n    82: 'R',\r\n    83: 'S',\r\n    84: 'T',\r\n    85: 'U',\r\n    86: 'V',\r\n    87: 'W',\r\n    88: 'X',\r\n    89: 'Y',\r\n    90: 'Z',\r\n    96: '0',\r\n    97: '1',\r\n    98: '2',\r\n    99: '3',\r\n    100: '4',\r\n    101: '5',\r\n    102: '6',\r\n    103: '7',\r\n    104: '8',\r\n    105: '9'\r\n  };\r\n\r\n  var keyCodes = {\r\n    ESCAPE: 27, // KeyboardEvent.which value for Escape (Esc) key\r\n    ENTER: 13, // KeyboardEvent.which value for Enter key\r\n    SPACE: 32, // KeyboardEvent.which value for space key\r\n    TAB: 9, // KeyboardEvent.which value for tab key\r\n    ARROW_UP: 38, // KeyboardEvent.which value for up arrow key\r\n    ARROW_DOWN: 40 // KeyboardEvent.which value for down arrow key\r\n  }\r\n\r\n  var version = {\r\n    success: false,\r\n    major: '3'\r\n  };\r\n\r\n  try {\r\n    version.full = ($.fn.dropdown.Constructor.VERSION || '').split(' ')[0].split('.');\r\n    version.major = version.full[0];\r\n    version.success = true;\r\n  } catch (err) {\r\n    // do nothing\r\n  }\r\n\r\n  var selectId = 0;\r\n\r\n  var EVENT_KEY = '.bs.select';\r\n\r\n  var classNames = {\r\n    DISABLED: 'disabled',\r\n    DIVIDER: 'divider',\r\n    SHOW: 'open',\r\n    DROPUP: 'dropup',\r\n    MENU: 'dropdown-menu',\r\n    MENURIGHT: 'dropdown-menu-right',\r\n    MENULEFT: 'dropdown-menu-left',\r\n    // to-do: replace with more advanced template/customization options\r\n    BUTTONCLASS: 'btn-default',\r\n    POPOVERHEADER: 'popover-title',\r\n    ICONBASE: 'glyphicon',\r\n    TICKICON: 'glyphicon-ok'\r\n  }\r\n\r\n  var Selector = {\r\n    MENU: '.' + classNames.MENU\r\n  }\r\n\r\n  var elementTemplates = {\r\n    div: document.createElement('div'),\r\n    span: document.createElement('span'),\r\n    i: document.createElement('i'),\r\n    subtext: document.createElement('small'),\r\n    a: document.createElement('a'),\r\n    li: document.createElement('li'),\r\n    whitespace: document.createTextNode('\\u00A0'),\r\n    fragment: document.createDocumentFragment()\r\n  }\r\n\r\n  elementTemplates.noResults = elementTemplates.li.cloneNode(false);\r\n  elementTemplates.noResults.className = 'no-results';\r\n\r\n  elementTemplates.a.setAttribute('role', 'option');\r\n  elementTemplates.a.className = 'dropdown-item';\r\n\r\n  elementTemplates.subtext.className = 'text-muted';\r\n\r\n  elementTemplates.text = elementTemplates.span.cloneNode(false);\r\n  elementTemplates.text.className = 'text';\r\n\r\n  elementTemplates.checkMark = elementTemplates.span.cloneNode(false);\r\n\r\n  var REGEXP_ARROW = new RegExp(keyCodes.ARROW_UP + '|' + keyCodes.ARROW_DOWN);\r\n  var REGEXP_TAB_OR_ESCAPE = new RegExp('^' + keyCodes.TAB + '$|' + keyCodes.ESCAPE);\r\n\r\n  var generateOption = {\r\n    li: function (content, classes, optgroup) {\r\n      var li = elementTemplates.li.cloneNode(false);\r\n\r\n      if (content) {\r\n        if (content.nodeType === 1 || content.nodeType === 11) {\r\n          li.appendChild(content);\r\n        } else {\r\n          li.innerHTML = content;\r\n        }\r\n      }\r\n\r\n      if (typeof classes !== 'undefined' && classes !== '') li.className = classes;\r\n      if (typeof optgroup !== 'undefined' && optgroup !== null) li.classList.add('optgroup-' + optgroup);\r\n\r\n      return li;\r\n    },\r\n\r\n    a: function (text, classes, inline) {\r\n      var a = elementTemplates.a.cloneNode(true);\r\n\r\n      if (text) {\r\n        if (text.nodeType === 11) {\r\n          a.appendChild(text);\r\n        } else {\r\n          a.insertAdjacentHTML('beforeend', text);\r\n        }\r\n      }\r\n\r\n      if (typeof classes !== 'undefined' && classes !== '') a.classList.add.apply(a.classList, classes.split(/\\s+/));\r\n      if (inline) a.setAttribute('style', inline);\r\n\r\n      return a;\r\n    },\r\n\r\n    text: function (options, useFragment) {\r\n      var textElement = elementTemplates.text.cloneNode(false),\r\n          subtextElement,\r\n          iconElement;\r\n\r\n      if (options.content) {\r\n        textElement.innerHTML = options.content;\r\n      } else {\r\n        textElement.textContent = options.text;\r\n\r\n        if (options.icon) {\r\n          var whitespace = elementTemplates.whitespace.cloneNode(false);\r\n\r\n          // need to use <i> for icons in the button to prevent a breaking change\r\n          // note: switch to span in next major release\r\n          iconElement = (useFragment === true ? elementTemplates.i : elementTemplates.span).cloneNode(false);\r\n          iconElement.className = this.options.iconBase + ' ' + options.icon;\r\n\r\n          elementTemplates.fragment.appendChild(iconElement);\r\n          elementTemplates.fragment.appendChild(whitespace);\r\n        }\r\n\r\n        if (options.subtext) {\r\n          subtextElement = elementTemplates.subtext.cloneNode(false);\r\n          subtextElement.textContent = options.subtext;\r\n          textElement.appendChild(subtextElement);\r\n        }\r\n      }\r\n\r\n      if (useFragment === true) {\r\n        while (textElement.childNodes.length > 0) {\r\n          elementTemplates.fragment.appendChild(textElement.childNodes[0]);\r\n        }\r\n      } else {\r\n        elementTemplates.fragment.appendChild(textElement);\r\n      }\r\n\r\n      return elementTemplates.fragment;\r\n    },\r\n\r\n    label: function (options) {\r\n      var textElement = elementTemplates.text.cloneNode(false),\r\n          subtextElement,\r\n          iconElement;\r\n\r\n      textElement.innerHTML = options.display;\r\n\r\n      if (options.icon) {\r\n        var whitespace = elementTemplates.whitespace.cloneNode(false);\r\n\r\n        iconElement = elementTemplates.span.cloneNode(false);\r\n        iconElement.className = this.options.iconBase + ' ' + options.icon;\r\n\r\n        elementTemplates.fragment.appendChild(iconElement);\r\n        elementTemplates.fragment.appendChild(whitespace);\r\n      }\r\n\r\n      if (options.subtext) {\r\n        subtextElement = elementTemplates.subtext.cloneNode(false);\r\n        subtextElement.textContent = options.subtext;\r\n        textElement.appendChild(subtextElement);\r\n      }\r\n\r\n      elementTemplates.fragment.appendChild(textElement);\r\n\r\n      return elementTemplates.fragment;\r\n    }\r\n  }\r\n\r\n  function showNoResults (searchMatch, searchValue) {\r\n    if (!searchMatch.length) {\r\n      elementTemplates.noResults.innerHTML = this.options.noneResultsText.replace('{0}', '\"' + htmlEscape(searchValue) + '\"');\r\n      this.$menuInner[0].firstChild.appendChild(elementTemplates.noResults);\r\n    }\r\n  }\r\n\r\n  var Selectpicker = function (element, options) {\r\n    var that = this;\r\n\r\n    // bootstrap-select has been initialized - revert valHooks.select.set back to its original function\r\n    if (!valHooks.useDefault) {\r\n      $.valHooks.select.set = valHooks._set;\r\n      valHooks.useDefault = true;\r\n    }\r\n\r\n    this.$element = $(element);\r\n    this.$newElement = null;\r\n    this.$button = null;\r\n    this.$menu = null;\r\n    this.options = options;\r\n    this.selectpicker = {\r\n      main: {},\r\n      search: {},\r\n      current: {}, // current changes if a search is in progress\r\n      view: {},\r\n      isSearching: false,\r\n      keydown: {\r\n        keyHistory: '',\r\n        resetKeyHistory: {\r\n          start: function () {\r\n            return setTimeout(function () {\r\n              that.selectpicker.keydown.keyHistory = '';\r\n            }, 800);\r\n          }\r\n        }\r\n      }\r\n    };\r\n\r\n    this.sizeInfo = {};\r\n\r\n    // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a\r\n    // data-attribute)\r\n    if (this.options.title === null) {\r\n      this.options.title = this.$element.attr('title');\r\n    }\r\n\r\n    // Format window padding\r\n    var winPad = this.options.windowPadding;\r\n    if (typeof winPad === 'number') {\r\n      this.options.windowPadding = [winPad, winPad, winPad, winPad];\r\n    }\r\n\r\n    // Expose public methods\r\n    this.val = Selectpicker.prototype.val;\r\n    this.render = Selectpicker.prototype.render;\r\n    this.refresh = Selectpicker.prototype.refresh;\r\n    this.setStyle = Selectpicker.prototype.setStyle;\r\n    this.selectAll = Selectpicker.prototype.selectAll;\r\n    this.deselectAll = Selectpicker.prototype.deselectAll;\r\n    this.destroy = Selectpicker.prototype.destroy;\r\n    this.remove = Selectpicker.prototype.remove;\r\n    this.show = Selectpicker.prototype.show;\r\n    this.hide = Selectpicker.prototype.hide;\r\n\r\n    this.init();\r\n  };\r\n\r\n  Selectpicker.VERSION = '1.13.17';\r\n\r\n  // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.\r\n  Selectpicker.DEFAULTS = {\r\n    noneSelectedText: 'Nothing selected',\r\n    noneResultsText: 'No results matched {0}',\r\n    countSelectedText: function (numSelected, numTotal) {\r\n      return (numSelected == 1) ? '{0} item selected' : '{0} items selected';\r\n    },\r\n    maxOptionsText: function (numAll, numGroup) {\r\n      return [\r\n        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',\r\n        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'\r\n      ];\r\n    },\r\n    selectAllText: 'Select All',\r\n    deselectAllText: 'Deselect All',\r\n    doneButton: false,\r\n    doneButtonText: 'Close',\r\n    multipleSeparator: ', ',\r\n    styleBase: 'btn',\r\n    style: classNames.BUTTONCLASS,\r\n    size: 'auto',\r\n    title: null,\r\n    selectedTextFormat: 'values',\r\n    width: false,\r\n    container: false,\r\n    hideDisabled: false,\r\n    showSubtext: false,\r\n    showIcon: true,\r\n    showContent: true,\r\n    dropupAuto: true,\r\n    header: false,\r\n    liveSearch: false,\r\n    liveSearchPlaceholder: null,\r\n    liveSearchNormalize: false,\r\n    liveSearchStyle: 'contains',\r\n    actionsBox: false,\r\n    iconBase: classNames.ICONBASE,\r\n    tickIcon: classNames.TICKICON,\r\n    showTick: false,\r\n    template: {\r\n      caret: '<span class=\"caret\"></span>'\r\n    },\r\n    maxOptions: false,\r\n    mobile: false,\r\n    selectOnTab: false,\r\n    dropdownAlignRight: false,\r\n    windowPadding: 0,\r\n    virtualScroll: 600,\r\n    display: false,\r\n    sanitize: true,\r\n    sanitizeFn: null,\r\n    whiteList: DefaultWhitelist\r\n  };\r\n\r\n  Selectpicker.prototype = {\r\n\r\n    constructor: Selectpicker,\r\n\r\n    init: function () {\r\n      var that = this,\r\n          id = this.$element.attr('id');\r\n\r\n      selectId++;\r\n      this.selectId = 'bs-select-' + selectId;\r\n\r\n      this.$element[0].classList.add('bs-select-hidden');\r\n\r\n      this.multiple = this.$element.prop('multiple');\r\n      this.autofocus = this.$element.prop('autofocus');\r\n\r\n      if (this.$element[0].classList.contains('show-tick')) {\r\n        this.options.showTick = true;\r\n      }\r\n\r\n      this.$newElement = this.createDropdown();\r\n      this.buildData();\r\n      this.$element\r\n        .after(this.$newElement)\r\n        .prependTo(this.$newElement);\r\n\r\n      this.$button = this.$newElement.children('button');\r\n      this.$menu = this.$newElement.children(Selector.MENU);\r\n      this.$menuInner = this.$menu.children('.inner');\r\n      this.$searchbox = this.$menu.find('input');\r\n\r\n      this.$element[0].classList.remove('bs-select-hidden');\r\n\r\n      if (this.options.dropdownAlignRight === true) this.$menu[0].classList.add(classNames.MENURIGHT);\r\n\r\n      if (typeof id !== 'undefined') {\r\n        this.$button.attr('data-id', id);\r\n      }\r\n\r\n      this.checkDisabled();\r\n      this.clickListener();\r\n\r\n      if (this.options.liveSearch) {\r\n        this.liveSearchListener();\r\n        this.focusedParent = this.$searchbox[0];\r\n      } else {\r\n        this.focusedParent = this.$menuInner[0];\r\n      }\r\n\r\n      this.setStyle();\r\n      this.render();\r\n      this.setWidth();\r\n      if (this.options.container) {\r\n        this.selectPosition();\r\n      } else {\r\n        this.$element.on('hide' + EVENT_KEY, function () {\r\n          if (that.isVirtual()) {\r\n            // empty menu on close\r\n            var menuInner = that.$menuInner[0],\r\n                emptyMenu = menuInner.firstChild.cloneNode(false);\r\n\r\n            // replace the existing UL with an empty one - this is faster than $.empty() or innerHTML = ''\r\n            menuInner.replaceChild(emptyMenu, menuInner.firstChild);\r\n            menuInner.scrollTop = 0;\r\n          }\r\n        });\r\n      }\r\n      this.$menu.data('this', this);\r\n      this.$newElement.data('this', this);\r\n      if (this.options.mobile) this.mobile();\r\n\r\n      this.$newElement.on({\r\n        'hide.bs.dropdown': function (e) {\r\n          that.$element.trigger('hide' + EVENT_KEY, e);\r\n        },\r\n        'hidden.bs.dropdown': function (e) {\r\n          that.$element.trigger('hidden' + EVENT_KEY, e);\r\n        },\r\n        'show.bs.dropdown': function (e) {\r\n          that.$element.trigger('show' + EVENT_KEY, e);\r\n        },\r\n        'shown.bs.dropdown': function (e) {\r\n          that.$element.trigger('shown' + EVENT_KEY, e);\r\n        }\r\n      });\r\n\r\n      if (that.$element[0].hasAttribute('required')) {\r\n        this.$element.on('invalid' + EVENT_KEY, function () {\r\n          that.$button[0].classList.add('bs-invalid');\r\n\r\n          that.$element\r\n            .on('shown' + EVENT_KEY + '.invalid', function () {\r\n              that.$element\r\n                .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened\r\n                .off('shown' + EVENT_KEY + '.invalid');\r\n            })\r\n            .on('rendered' + EVENT_KEY, function () {\r\n              // if select is no longer invalid, remove the bs-invalid class\r\n              if (this.validity.valid) that.$button[0].classList.remove('bs-invalid');\r\n              that.$element.off('rendered' + EVENT_KEY);\r\n            });\r\n\r\n          that.$button.on('blur' + EVENT_KEY, function () {\r\n            that.$element.trigger('focus').trigger('blur');\r\n            that.$button.off('blur' + EVENT_KEY);\r\n          });\r\n        });\r\n      }\r\n\r\n      setTimeout(function () {\r\n        that.buildList();\r\n        that.$element.trigger('loaded' + EVENT_KEY);\r\n      });\r\n    },\r\n\r\n    createDropdown: function () {\r\n      // Options\r\n      // If we are multiple or showTick option is set, then add the show-tick class\r\n      var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',\r\n          multiselectable = this.multiple ? ' aria-multiselectable=\"true\"' : '',\r\n          inputGroup = '',\r\n          autofocus = this.autofocus ? ' autofocus' : '';\r\n\r\n      if (version.major < 4 && this.$element.parent().hasClass('input-group')) {\r\n        inputGroup = ' input-group-btn';\r\n      }\r\n\r\n      // Elements\r\n      var drop,\r\n          header = '',\r\n          searchbox = '',\r\n          actionsbox = '',\r\n          donebutton = '';\r\n\r\n      if (this.options.header) {\r\n        header =\r\n          '<div class=\"' + classNames.POPOVERHEADER + '\">' +\r\n            '<button type=\"button\" class=\"close\" aria-hidden=\"true\">&times;</button>' +\r\n              this.options.header +\r\n          '</div>';\r\n      }\r\n\r\n      if (this.options.liveSearch) {\r\n        searchbox =\r\n          '<div class=\"bs-searchbox\">' +\r\n            '<input type=\"search\" class=\"form-control\" autocomplete=\"off\"' +\r\n              (\r\n                this.options.liveSearchPlaceholder === null ? ''\r\n                :\r\n                ' placeholder=\"' + htmlEscape(this.options.liveSearchPlaceholder) + '\"'\r\n              ) +\r\n              ' role=\"combobox\" aria-label=\"Search\" aria-controls=\"' + this.selectId + '\" aria-autocomplete=\"list\">' +\r\n          '</div>';\r\n      }\r\n\r\n      if (this.multiple && this.options.actionsBox) {\r\n        actionsbox =\r\n          '<div class=\"bs-actionsbox\">' +\r\n            '<div class=\"btn-group btn-group-sm btn-block\">' +\r\n              '<button type=\"button\" class=\"actions-btn bs-select-all btn ' + classNames.BUTTONCLASS + '\">' +\r\n                this.options.selectAllText +\r\n              '</button>' +\r\n              '<button type=\"button\" class=\"actions-btn bs-deselect-all btn ' + classNames.BUTTONCLASS + '\">' +\r\n                this.options.deselectAllText +\r\n              '</button>' +\r\n            '</div>' +\r\n          '</div>';\r\n      }\r\n\r\n      if (this.multiple && this.options.doneButton) {\r\n        donebutton =\r\n          '<div class=\"bs-donebutton\">' +\r\n            '<div class=\"btn-group btn-block\">' +\r\n              '<button type=\"button\" class=\"btn btn-sm ' + classNames.BUTTONCLASS + '\">' +\r\n                this.options.doneButtonText +\r\n              '</button>' +\r\n            '</div>' +\r\n          '</div>';\r\n      }\r\n\r\n      drop =\r\n        '<div class=\"dropdown bootstrap-select' + showTick + inputGroup + '\">' +\r\n          '<button type=\"button\" tabindex=\"-1\" class=\"' + this.options.styleBase + ' dropdown-toggle\" ' + (this.options.display === 'static' ? 'data-display=\"static\"' : '') + 'data-toggle=\"dropdown\"' + autofocus + ' role=\"combobox\" aria-owns=\"' + this.selectId + '\" aria-haspopup=\"listbox\" aria-expanded=\"false\">' +\r\n            '<div class=\"filter-option\">' +\r\n              '<div class=\"filter-option-inner\">' +\r\n                '<div class=\"filter-option-inner-inner\"></div>' +\r\n              '</div> ' +\r\n            '</div>' +\r\n            (\r\n              version.major === '4' ? ''\r\n              :\r\n              '<span class=\"bs-caret\">' +\r\n                this.options.template.caret +\r\n              '</span>'\r\n            ) +\r\n          '</button>' +\r\n          '<div class=\"' + classNames.MENU + ' ' + (version.major === '4' ? '' : classNames.SHOW) + '\">' +\r\n            header +\r\n            searchbox +\r\n            actionsbox +\r\n            '<div class=\"inner ' + classNames.SHOW + '\" role=\"listbox\" id=\"' + this.selectId + '\" tabindex=\"-1\" ' + multiselectable + '>' +\r\n                '<ul class=\"' + classNames.MENU + ' inner ' + (version.major === '4' ? classNames.SHOW : '') + '\" role=\"presentation\">' +\r\n                '</ul>' +\r\n            '</div>' +\r\n            donebutton +\r\n          '</div>' +\r\n        '</div>';\r\n\r\n      return $(drop);\r\n    },\r\n\r\n    setPositionData: function () {\r\n      this.selectpicker.view.canHighlight = [];\r\n      this.selectpicker.view.size = 0;\r\n\r\n      for (var i = 0; i < this.selectpicker.current.data.length; i++) {\r\n        var li = this.selectpicker.current.data[i],\r\n            canHighlight = true;\r\n\r\n        if (li.type === 'divider') {\r\n          canHighlight = false;\r\n          li.height = this.sizeInfo.dividerHeight;\r\n        } else if (li.type === 'optgroup-label') {\r\n          canHighlight = false;\r\n          li.height = this.sizeInfo.dropdownHeaderHeight;\r\n        } else {\r\n          li.height = this.sizeInfo.liHeight;\r\n        }\r\n\r\n        if (li.disabled) canHighlight = false;\r\n\r\n        this.selectpicker.view.canHighlight.push(canHighlight);\r\n\r\n        if (canHighlight) {\r\n          this.selectpicker.view.size++;\r\n          li.posinset = this.selectpicker.view.size;\r\n        }\r\n\r\n        li.position = (i === 0 ? 0 : this.selectpicker.current.data[i - 1].position) + li.height;\r\n      }\r\n    },\r\n\r\n    isVirtual: function () {\r\n      return (this.options.virtualScroll !== false) && (this.selectpicker.main.elements.length >= this.options.virtualScroll) || this.options.virtualScroll === true;\r\n    },\r\n\r\n    createView: function (isSearching, setSize, refresh) {\r\n      var that = this,\r\n          scrollTop = 0,\r\n          active = [],\r\n          selected,\r\n          prevActive;\r\n\r\n      this.selectpicker.isSearching = isSearching;\r\n      this.selectpicker.current = isSearching ? this.selectpicker.search : this.selectpicker.main;\r\n\r\n      this.setPositionData();\r\n\r\n      if (setSize) {\r\n        if (refresh) {\r\n          scrollTop = this.$menuInner[0].scrollTop;\r\n        } else if (!that.multiple) {\r\n          var element = that.$element[0],\r\n              selectedIndex = (element.options[element.selectedIndex] || {}).liIndex;\r\n\r\n          if (typeof selectedIndex === 'number' && that.options.size !== false) {\r\n            var selectedData = that.selectpicker.main.data[selectedIndex],\r\n                position = selectedData && selectedData.position;\r\n\r\n            if (position) {\r\n              scrollTop = position - ((that.sizeInfo.menuInnerHeight + that.sizeInfo.liHeight) / 2);\r\n            }\r\n          }\r\n        }\r\n      }\r\n\r\n      scroll(scrollTop, true);\r\n\r\n      this.$menuInner.off('scroll.createView').on('scroll.createView', function (e, updateValue) {\r\n        if (!that.noScroll) scroll(this.scrollTop, updateValue);\r\n        that.noScroll = false;\r\n      });\r\n\r\n      function scroll (scrollTop, init) {\r\n        var size = that.selectpicker.current.elements.length,\r\n            chunks = [],\r\n            chunkSize,\r\n            chunkCount,\r\n            firstChunk,\r\n            lastChunk,\r\n            currentChunk,\r\n            prevPositions,\r\n            positionIsDifferent,\r\n            previousElements,\r\n            menuIsDifferent = true,\r\n            isVirtual = that.isVirtual();\r\n\r\n        that.selectpicker.view.scrollTop = scrollTop;\r\n\r\n        chunkSize = Math.ceil(that.sizeInfo.menuInnerHeight / that.sizeInfo.liHeight * 1.5); // number of options in a chunk\r\n        chunkCount = Math.round(size / chunkSize) || 1; // number of chunks\r\n\r\n        for (var i = 0; i < chunkCount; i++) {\r\n          var endOfChunk = (i + 1) * chunkSize;\r\n\r\n          if (i === chunkCount - 1) {\r\n            endOfChunk = size;\r\n          }\r\n\r\n          chunks[i] = [\r\n            (i) * chunkSize + (!i ? 0 : 1),\r\n            endOfChunk\r\n          ];\r\n\r\n          if (!size) break;\r\n\r\n          if (currentChunk === undefined && scrollTop - 1 <= that.selectpicker.current.data[endOfChunk - 1].position - that.sizeInfo.menuInnerHeight) {\r\n            currentChunk = i;\r\n          }\r\n        }\r\n\r\n        if (currentChunk === undefined) currentChunk = 0;\r\n\r\n        prevPositions = [that.selectpicker.view.position0, that.selectpicker.view.position1];\r\n\r\n        // always display previous, current, and next chunks\r\n        firstChunk = Math.max(0, currentChunk - 1);\r\n        lastChunk = Math.min(chunkCount - 1, currentChunk + 1);\r\n\r\n        that.selectpicker.view.position0 = isVirtual === false ? 0 : (Math.max(0, chunks[firstChunk][0]) || 0);\r\n        that.selectpicker.view.position1 = isVirtual === false ? size : (Math.min(size, chunks[lastChunk][1]) || 0);\r\n\r\n        positionIsDifferent = prevPositions[0] !== that.selectpicker.view.position0 || prevPositions[1] !== that.selectpicker.view.position1;\r\n\r\n        if (that.activeIndex !== undefined) {\r\n          prevActive = that.selectpicker.main.elements[that.prevActiveIndex];\r\n          active = that.selectpicker.main.elements[that.activeIndex];\r\n          selected = that.selectpicker.main.elements[that.selectedIndex];\r\n\r\n          if (init) {\r\n            if (that.activeIndex !== that.selectedIndex) {\r\n              that.defocusItem(active);\r\n            }\r\n            that.activeIndex = undefined;\r\n          }\r\n\r\n          if (that.activeIndex && that.activeIndex !== that.selectedIndex) {\r\n            that.defocusItem(selected);\r\n          }\r\n        }\r\n\r\n        if (that.prevActiveIndex !== undefined && that.prevActiveIndex !== that.activeIndex && that.prevActiveIndex !== that.selectedIndex) {\r\n          that.defocusItem(prevActive);\r\n        }\r\n\r\n        if (init || positionIsDifferent) {\r\n          previousElements = that.selectpicker.view.visibleElements ? that.selectpicker.view.visibleElements.slice() : [];\r\n\r\n          if (isVirtual === false) {\r\n            that.selectpicker.view.visibleElements = that.selectpicker.current.elements;\r\n          } else {\r\n            that.selectpicker.view.visibleElements = that.selectpicker.current.elements.slice(that.selectpicker.view.position0, that.selectpicker.view.position1);\r\n          }\r\n\r\n          that.setOptionStatus();\r\n\r\n          // if searching, check to make sure the list has actually been updated before updating DOM\r\n          // this prevents unnecessary repaints\r\n          if (isSearching || (isVirtual === false && init)) menuIsDifferent = !isEqual(previousElements, that.selectpicker.view.visibleElements);\r\n\r\n          // if virtual scroll is disabled and not searching,\r\n          // menu should never need to be updated more than once\r\n          if ((init || isVirtual === true) && menuIsDifferent) {\r\n            var menuInner = that.$menuInner[0],\r\n                menuFragment = document.createDocumentFragment(),\r\n                emptyMenu = menuInner.firstChild.cloneNode(false),\r\n                marginTop,\r\n                marginBottom,\r\n                elements = that.selectpicker.view.visibleElements,\r\n                toSanitize = [];\r\n\r\n            // replace the existing UL with an empty one - this is faster than $.empty()\r\n            menuInner.replaceChild(emptyMenu, menuInner.firstChild);\r\n\r\n            for (var i = 0, visibleElementsLen = elements.length; i < visibleElementsLen; i++) {\r\n              var element = elements[i],\r\n                  elText,\r\n                  elementData;\r\n\r\n              if (that.options.sanitize) {\r\n                elText = element.lastChild;\r\n\r\n                if (elText) {\r\n                  elementData = that.selectpicker.current.data[i + that.selectpicker.view.position0];\r\n\r\n                  if (elementData && elementData.content && !elementData.sanitized) {\r\n                    toSanitize.push(elText);\r\n                    elementData.sanitized = true;\r\n                  }\r\n                }\r\n              }\r\n\r\n              menuFragment.appendChild(element);\r\n            }\r\n\r\n            if (that.options.sanitize && toSanitize.length) {\r\n              sanitizeHtml(toSanitize, that.options.whiteList, that.options.sanitizeFn);\r\n            }\r\n\r\n            if (isVirtual === true) {\r\n              marginTop = (that.selectpicker.view.position0 === 0 ? 0 : that.selectpicker.current.data[that.selectpicker.view.position0 - 1].position);\r\n              marginBottom = (that.selectpicker.view.position1 > size - 1 ? 0 : that.selectpicker.current.data[size - 1].position - that.selectpicker.current.data[that.selectpicker.view.position1 - 1].position);\r\n\r\n              menuInner.firstChild.style.marginTop = marginTop + 'px';\r\n              menuInner.firstChild.style.marginBottom = marginBottom + 'px';\r\n            } else {\r\n              menuInner.firstChild.style.marginTop = 0;\r\n              menuInner.firstChild.style.marginBottom = 0;\r\n            }\r\n\r\n            menuInner.firstChild.appendChild(menuFragment);\r\n\r\n            // if an option is encountered that is wider than the current menu width, update the menu width accordingly\r\n            // switch to ResizeObserver with increased browser support\r\n            if (isVirtual === true && that.sizeInfo.hasScrollBar) {\r\n              var menuInnerInnerWidth = menuInner.firstChild.offsetWidth;\r\n\r\n              if (init && menuInnerInnerWidth < that.sizeInfo.menuInnerInnerWidth && that.sizeInfo.totalMenuWidth > that.sizeInfo.selectWidth) {\r\n                menuInner.firstChild.style.minWidth = that.sizeInfo.menuInnerInnerWidth + 'px';\r\n              } else if (menuInnerInnerWidth > that.sizeInfo.menuInnerInnerWidth) {\r\n                // set to 0 to get actual width of menu\r\n                that.$menu[0].style.minWidth = 0;\r\n\r\n                var actualMenuWidth = menuInner.firstChild.offsetWidth;\r\n\r\n                if (actualMenuWidth > that.sizeInfo.menuInnerInnerWidth) {\r\n                  that.sizeInfo.menuInnerInnerWidth = actualMenuWidth;\r\n                  menuInner.firstChild.style.minWidth = that.sizeInfo.menuInnerInnerWidth + 'px';\r\n                }\r\n\r\n                // reset to default CSS styling\r\n                that.$menu[0].style.minWidth = '';\r\n              }\r\n            }\r\n          }\r\n        }\r\n\r\n        that.prevActiveIndex = that.activeIndex;\r\n\r\n        if (!that.options.liveSearch) {\r\n          that.$menuInner.trigger('focus');\r\n        } else if (isSearching && init) {\r\n          var index = 0,\r\n              newActive;\r\n\r\n          if (!that.selectpicker.view.canHighlight[index]) {\r\n            index = 1 + that.selectpicker.view.canHighlight.slice(1).indexOf(true);\r\n          }\r\n\r\n          newActive = that.selectpicker.view.visibleElements[index];\r\n\r\n          that.defocusItem(that.selectpicker.view.currentActive);\r\n\r\n          that.activeIndex = (that.selectpicker.current.data[index] || {}).index;\r\n\r\n          that.focusItem(newActive);\r\n        }\r\n      }\r\n\r\n      $(window)\r\n        .off('resize' + EVENT_KEY + '.' + this.selectId + '.createView')\r\n        .on('resize' + EVENT_KEY + '.' + this.selectId + '.createView', function () {\r\n          var isActive = that.$newElement.hasClass(classNames.SHOW);\r\n\r\n          if (isActive) scroll(that.$menuInner[0].scrollTop);\r\n        });\r\n    },\r\n\r\n    focusItem: function (li, liData, noStyle) {\r\n      if (li) {\r\n        liData = liData || this.selectpicker.main.data[this.activeIndex];\r\n        var a = li.firstChild;\r\n\r\n        if (a) {\r\n          a.setAttribute('aria-setsize', this.selectpicker.view.size);\r\n          a.setAttribute('aria-posinset', liData.posinset);\r\n\r\n          if (noStyle !== true) {\r\n            this.focusedParent.setAttribute('aria-activedescendant', a.id);\r\n            li.classList.add('active');\r\n            a.classList.add('active');\r\n          }\r\n        }\r\n      }\r\n    },\r\n\r\n    defocusItem: function (li) {\r\n      if (li) {\r\n        li.classList.remove('active');\r\n        if (li.firstChild) li.firstChild.classList.remove('active');\r\n      }\r\n    },\r\n\r\n    setPlaceholder: function () {\r\n      var that = this,\r\n          updateIndex = false;\r\n\r\n      if (this.options.title && !this.multiple) {\r\n        if (!this.selectpicker.view.titleOption) this.selectpicker.view.titleOption = document.createElement('option');\r\n\r\n        // this option doesn't create a new <li> element, but does add a new option at the start,\r\n        // so startIndex should increase to prevent having to check every option for the bs-title-option class\r\n        updateIndex = true;\r\n\r\n        var element = this.$element[0],\r\n            selectTitleOption = false,\r\n            titleNotAppended = !this.selectpicker.view.titleOption.parentNode,\r\n            selectedIndex = element.selectedIndex,\r\n            selectedOption = element.options[selectedIndex],\r\n            navigation = window.performance && window.performance.getEntriesByType('navigation');\r\n\r\n        if (titleNotAppended) {\r\n          // Use native JS to prepend option (faster)\r\n          this.selectpicker.view.titleOption.className = 'bs-title-option';\r\n          this.selectpicker.view.titleOption.value = '';\r\n\r\n          // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option.\r\n          // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs,\r\n          // if so, the select will have the data-selected attribute\r\n          selectTitleOption = !selectedOption || (selectedIndex === 0 && selectedOption.defaultSelected === false && this.$element.data('selected') === undefined);\r\n        }\r\n\r\n        if (titleNotAppended || this.selectpicker.view.titleOption.index !== 0) {\r\n          element.insertBefore(this.selectpicker.view.titleOption, element.firstChild);\r\n        }\r\n\r\n        // Set selected *after* appending to select,\r\n        // otherwise the option doesn't get selected in IE\r\n        // set using selectedIndex, as setting the selected attr to true here doesn't work in IE11\r\n        if (selectTitleOption && navigation.length && navigation[0].type !== 'back_forward') {\r\n          element.selectedIndex = 0;\r\n        } else if (document.readyState !== 'complete') {\r\n          // if navigation type is back_forward, there's a chance the select will have its value set by BFCache\r\n          // wait for that value to be set, then run render again\r\n          window.addEventListener('pageshow', function () {\r\n            if (that.selectpicker.view.displayedValue !== element.value) that.render();\r\n          });\r\n        }\r\n      }\r\n\r\n      return updateIndex;\r\n    },\r\n\r\n    buildData: function () {\r\n      var optionSelector = ':not([hidden]):not([data-hidden=\"true\"])',\r\n          mainData = [],\r\n          optID = 0,\r\n          startIndex = this.setPlaceholder() ? 1 : 0; // append the titleOption if necessary and skip the first option in the loop\r\n\r\n      if (this.options.hideDisabled) optionSelector += ':not(:disabled)';\r\n\r\n      var selectOptions = this.$element[0].querySelectorAll('select > *' + optionSelector);\r\n\r\n      function addDivider (config) {\r\n        var previousData = mainData[mainData.length - 1];\r\n\r\n        // ensure optgroup doesn't create back-to-back dividers\r\n        if (\r\n          previousData &&\r\n          previousData.type === 'divider' &&\r\n          (previousData.optID || config.optID)\r\n        ) {\r\n          return;\r\n        }\r\n\r\n        config = config || {};\r\n        config.type = 'divider';\r\n\r\n        mainData.push(config);\r\n      }\r\n\r\n      function addOption (option, config) {\r\n        config = config || {};\r\n\r\n        config.divider = option.getAttribute('data-divider') === 'true';\r\n\r\n        if (config.divider) {\r\n          addDivider({\r\n            optID: config.optID\r\n          });\r\n        } else {\r\n          var liIndex = mainData.length,\r\n              cssText = option.style.cssText,\r\n              inlineStyle = cssText ? htmlEscape(cssText) : '',\r\n              optionClass = (option.className || '') + (config.optgroupClass || '');\r\n\r\n          if (config.optID) optionClass = 'opt ' + optionClass;\r\n\r\n          config.optionClass = optionClass.trim();\r\n          config.inlineStyle = inlineStyle;\r\n          config.text = option.textContent;\r\n\r\n          config.content = option.getAttribute('data-content');\r\n          config.tokens = option.getAttribute('data-tokens');\r\n          config.subtext = option.getAttribute('data-subtext');\r\n          config.icon = option.getAttribute('data-icon');\r\n\r\n          option.liIndex = liIndex;\r\n\r\n          config.display = config.content || config.text;\r\n          config.type = 'option';\r\n          config.index = liIndex;\r\n          config.option = option;\r\n          config.selected = !!option.selected;\r\n          config.disabled = config.disabled || !!option.disabled;\r\n\r\n          mainData.push(config);\r\n        }\r\n      }\r\n\r\n      function addOptgroup (index, selectOptions) {\r\n        var optgroup = selectOptions[index],\r\n            // skip placeholder option\r\n            previous = index - 1 < startIndex ? false : selectOptions[index - 1],\r\n            next = selectOptions[index + 1],\r\n            options = optgroup.querySelectorAll('option' + optionSelector);\r\n\r\n        if (!options.length) return;\r\n\r\n        var config = {\r\n              display: htmlEscape(optgroup.label),\r\n              subtext: optgroup.getAttribute('data-subtext'),\r\n              icon: optgroup.getAttribute('data-icon'),\r\n              type: 'optgroup-label',\r\n              optgroupClass: ' ' + (optgroup.className || '')\r\n            },\r\n            headerIndex,\r\n            lastIndex;\r\n\r\n        optID++;\r\n\r\n        if (previous) {\r\n          addDivider({ optID: optID });\r\n        }\r\n\r\n        config.optID = optID;\r\n\r\n        mainData.push(config);\r\n\r\n        for (var j = 0, len = options.length; j < len; j++) {\r\n          var option = options[j];\r\n\r\n          if (j === 0) {\r\n            headerIndex = mainData.length - 1;\r\n            lastIndex = headerIndex + len;\r\n          }\r\n\r\n          addOption(option, {\r\n            headerIndex: headerIndex,\r\n            lastIndex: lastIndex,\r\n            optID: config.optID,\r\n            optgroupClass: config.optgroupClass,\r\n            disabled: optgroup.disabled\r\n          });\r\n        }\r\n\r\n        if (next) {\r\n          addDivider({ optID: optID });\r\n        }\r\n      }\r\n\r\n      for (var len = selectOptions.length, i = startIndex; i < len; i++) {\r\n        var item = selectOptions[i];\r\n\r\n        if (item.tagName !== 'OPTGROUP') {\r\n          addOption(item, {});\r\n        } else {\r\n          addOptgroup(i, selectOptions);\r\n        }\r\n      }\r\n\r\n      this.selectpicker.main.data = this.selectpicker.current.data = mainData;\r\n    },\r\n\r\n    buildList: function () {\r\n      var that = this,\r\n          selectData = this.selectpicker.main.data,\r\n          mainElements = [],\r\n          widestOptionLength = 0;\r\n\r\n      if ((that.options.showTick || that.multiple) && !elementTemplates.checkMark.parentNode) {\r\n        elementTemplates.checkMark.className = this.options.iconBase + ' ' + that.options.tickIcon + ' check-mark';\r\n        elementTemplates.a.appendChild(elementTemplates.checkMark);\r\n      }\r\n\r\n      function buildElement (item) {\r\n        var liElement,\r\n            combinedLength = 0;\r\n\r\n        switch (item.type) {\r\n          case 'divider':\r\n            liElement = generateOption.li(\r\n              false,\r\n              classNames.DIVIDER,\r\n              (item.optID ? item.optID + 'div' : undefined)\r\n            );\r\n\r\n            break;\r\n\r\n          case 'option':\r\n            liElement = generateOption.li(\r\n              generateOption.a(\r\n                generateOption.text.call(that, item),\r\n                item.optionClass,\r\n                item.inlineStyle\r\n              ),\r\n              '',\r\n              item.optID\r\n            );\r\n\r\n            if (liElement.firstChild) {\r\n              liElement.firstChild.id = that.selectId + '-' + item.index;\r\n            }\r\n\r\n            break;\r\n\r\n          case 'optgroup-label':\r\n            liElement = generateOption.li(\r\n              generateOption.label.call(that, item),\r\n              'dropdown-header' + item.optgroupClass,\r\n              item.optID\r\n            );\r\n\r\n            break;\r\n        }\r\n\r\n        item.element = liElement;\r\n        mainElements.push(liElement);\r\n\r\n        // count the number of characters in the option - not perfect, but should work in most cases\r\n        if (item.display) combinedLength += item.display.length;\r\n        if (item.subtext) combinedLength += item.subtext.length;\r\n        // if there is an icon, ensure this option's width is checked\r\n        if (item.icon) combinedLength += 1;\r\n\r\n        if (combinedLength > widestOptionLength) {\r\n          widestOptionLength = combinedLength;\r\n\r\n          // guess which option is the widest\r\n          // use this when calculating menu width\r\n          // not perfect, but it's fast, and the width will be updating accordingly when scrolling\r\n          that.selectpicker.view.widestOption = mainElements[mainElements.length - 1];\r\n        }\r\n      }\r\n\r\n      for (var len = selectData.length, i = 0; i < len; i++) {\r\n        var item = selectData[i];\r\n\r\n        buildElement(item);\r\n      }\r\n\r\n      this.selectpicker.main.elements = this.selectpicker.current.elements = mainElements;\r\n    },\r\n\r\n    findLis: function () {\r\n      return this.$menuInner.find('.inner > li');\r\n    },\r\n\r\n    render: function () {\r\n      var that = this,\r\n          element = this.$element[0],\r\n          // ensure titleOption is appended and selected (if necessary) before getting selectedOptions\r\n          placeholderSelected = this.setPlaceholder() && element.selectedIndex === 0,\r\n          selectedOptions = getSelectedOptions(element, this.options.hideDisabled),\r\n          selectedCount = selectedOptions.length,\r\n          button = this.$button[0],\r\n          buttonInner = button.querySelector('.filter-option-inner-inner'),\r\n          multipleSeparator = document.createTextNode(this.options.multipleSeparator),\r\n          titleFragment = elementTemplates.fragment.cloneNode(false),\r\n          showCount,\r\n          countMax,\r\n          hasContent = false;\r\n\r\n      button.classList.toggle('bs-placeholder', that.multiple ? !selectedCount : !getSelectValues(element, selectedOptions));\r\n\r\n      if (!that.multiple && selectedOptions.length === 1) {\r\n        that.selectpicker.view.displayedValue = getSelectValues(element, selectedOptions);\r\n      }\r\n\r\n      if (this.options.selectedTextFormat === 'static') {\r\n        titleFragment = generateOption.text.call(this, { text: this.options.title }, true);\r\n      } else {\r\n        showCount = this.multiple && this.options.selectedTextFormat.indexOf('count') !== -1 && selectedCount > 1;\r\n\r\n        // determine if the number of selected options will be shown (showCount === true)\r\n        if (showCount) {\r\n          countMax = this.options.selectedTextFormat.split('>');\r\n          showCount = (countMax.length > 1 && selectedCount > countMax[1]) || (countMax.length === 1 && selectedCount >= 2);\r\n        }\r\n\r\n        // only loop through all selected options if the count won't be shown\r\n        if (showCount === false) {\r\n          if (!placeholderSelected) {\r\n            for (var selectedIndex = 0; selectedIndex < selectedCount; selectedIndex++) {\r\n              if (selectedIndex < 50) {\r\n                var option = selectedOptions[selectedIndex],\r\n                    thisData = this.selectpicker.main.data[option.liIndex],\r\n                    titleOptions = {};\r\n\r\n                if (this.multiple && selectedIndex > 0) {\r\n                  titleFragment.appendChild(multipleSeparator.cloneNode(false));\r\n                }\r\n\r\n                if (option.title) {\r\n                  titleOptions.text = option.title;\r\n                } else if (thisData) {\r\n                  if (thisData.content && that.options.showContent) {\r\n                    titleOptions.content = thisData.content.toString();\r\n                    hasContent = true;\r\n                  } else {\r\n                    if (that.options.showIcon) {\r\n                      titleOptions.icon = thisData.icon;\r\n                    }\r\n                    if (that.options.showSubtext && !that.multiple && thisData.subtext) titleOptions.subtext = ' ' + thisData.subtext;\r\n                    titleOptions.text = option.textContent.trim();\r\n                  }\r\n                }\r\n\r\n                titleFragment.appendChild(generateOption.text.call(this, titleOptions, true));\r\n              } else {\r\n                break;\r\n              }\r\n            }\r\n\r\n            // add ellipsis\r\n            if (selectedCount > 49) {\r\n              titleFragment.appendChild(document.createTextNode('...'));\r\n            }\r\n          }\r\n        } else {\r\n          var optionSelector = ':not([hidden]):not([data-hidden=\"true\"]):not([data-divider=\"true\"])';\r\n          if (this.options.hideDisabled) optionSelector += ':not(:disabled)';\r\n\r\n          // If this is a multiselect, and selectedTextFormat is count, then show 1 of 2 selected, etc.\r\n          var totalCount = this.$element[0].querySelectorAll('select > option' + optionSelector + ', optgroup' + optionSelector + ' option' + optionSelector).length,\r\n              tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedCount, totalCount) : this.options.countSelectedText;\r\n\r\n          titleFragment = generateOption.text.call(this, {\r\n            text: tr8nText.replace('{0}', selectedCount.toString()).replace('{1}', totalCount.toString())\r\n          }, true);\r\n        }\r\n      }\r\n\r\n      if (this.options.title == undefined) {\r\n        // use .attr to ensure undefined is returned if title attribute is not set\r\n        this.options.title = this.$element.attr('title');\r\n      }\r\n\r\n      // If the select doesn't have a title, then use the default, or if nothing is set at all, use noneSelectedText\r\n      if (!titleFragment.childNodes.length) {\r\n        titleFragment = generateOption.text.call(this, {\r\n          text: typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText\r\n        }, true);\r\n      }\r\n\r\n      // strip all HTML tags and trim the result, then unescape any escaped tags\r\n      button.title = titleFragment.textContent.replace(/<[^>]*>?/g, '').trim();\r\n\r\n      if (this.options.sanitize && hasContent) {\r\n        sanitizeHtml([titleFragment], that.options.whiteList, that.options.sanitizeFn);\r\n      }\r\n\r\n      buttonInner.innerHTML = '';\r\n      buttonInner.appendChild(titleFragment);\r\n\r\n      if (version.major < 4 && this.$newElement[0].classList.contains('bs3-has-addon')) {\r\n        var filterExpand = button.querySelector('.filter-expand'),\r\n            clone = buttonInner.cloneNode(true);\r\n\r\n        clone.className = 'filter-expand';\r\n\r\n        if (filterExpand) {\r\n          button.replaceChild(clone, filterExpand);\r\n        } else {\r\n          button.appendChild(clone);\r\n        }\r\n      }\r\n\r\n      this.$element.trigger('rendered' + EVENT_KEY);\r\n    },\r\n\r\n    /**\r\n     * @param [style]\r\n     * @param [status]\r\n     */\r\n    setStyle: function (newStyle, status) {\r\n      var button = this.$button[0],\r\n          newElement = this.$newElement[0],\r\n          style = this.options.style.trim(),\r\n          buttonClass;\r\n\r\n      if (this.$element.attr('class')) {\r\n        this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\\[.*\\]/gi, ''));\r\n      }\r\n\r\n      if (version.major < 4) {\r\n        newElement.classList.add('bs3');\r\n\r\n        if (newElement.parentNode.classList && newElement.parentNode.classList.contains('input-group') &&\r\n            (newElement.previousElementSibling || newElement.nextElementSibling) &&\r\n            (newElement.previousElementSibling || newElement.nextElementSibling).classList.contains('input-group-addon')\r\n        ) {\r\n          newElement.classList.add('bs3-has-addon');\r\n        }\r\n      }\r\n\r\n      if (newStyle) {\r\n        buttonClass = newStyle.trim();\r\n      } else {\r\n        buttonClass = style;\r\n      }\r\n\r\n      if (status == 'add') {\r\n        if (buttonClass) button.classList.add.apply(button.classList, buttonClass.split(' '));\r\n      } else if (status == 'remove') {\r\n        if (buttonClass) button.classList.remove.apply(button.classList, buttonClass.split(' '));\r\n      } else {\r\n        if (style) button.classList.remove.apply(button.classList, style.split(' '));\r\n        if (buttonClass) button.classList.add.apply(button.classList, buttonClass.split(' '));\r\n      }\r\n    },\r\n\r\n    liHeight: function (refresh) {\r\n      if (!refresh && (this.options.size === false || Object.keys(this.sizeInfo).length)) return;\r\n\r\n      var newElement = elementTemplates.div.cloneNode(false),\r\n          menu = elementTemplates.div.cloneNode(false),\r\n          menuInner = elementTemplates.div.cloneNode(false),\r\n          menuInnerInner = document.createElement('ul'),\r\n          divider = elementTemplates.li.cloneNode(false),\r\n          dropdownHeader = elementTemplates.li.cloneNode(false),\r\n          li,\r\n          a = elementTemplates.a.cloneNode(false),\r\n          text = elementTemplates.span.cloneNode(false),\r\n          header = this.options.header && this.$menu.find('.' + classNames.POPOVERHEADER).length > 0 ? this.$menu.find('.' + classNames.POPOVERHEADER)[0].cloneNode(true) : null,\r\n          search = this.options.liveSearch ? elementTemplates.div.cloneNode(false) : null,\r\n          actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,\r\n          doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null,\r\n          firstOption = this.$element.find('option')[0];\r\n\r\n      this.sizeInfo.selectWidth = this.$newElement[0].offsetWidth;\r\n\r\n      text.className = 'text';\r\n      a.className = 'dropdown-item ' + (firstOption ? firstOption.className : '');\r\n      newElement.className = this.$menu[0].parentNode.className + ' ' + classNames.SHOW;\r\n      newElement.style.width = 0; // ensure button width doesn't affect natural width of menu when calculating\r\n      if (this.options.width === 'auto') menu.style.minWidth = 0;\r\n      menu.className = classNames.MENU + ' ' + classNames.SHOW;\r\n      menuInner.className = 'inner ' + classNames.SHOW;\r\n      menuInnerInner.className = classNames.MENU + ' inner ' + (version.major === '4' ? classNames.SHOW : '');\r\n      divider.className = classNames.DIVIDER;\r\n      dropdownHeader.className = 'dropdown-header';\r\n\r\n      text.appendChild(document.createTextNode('\\u200b'));\r\n\r\n      if (this.selectpicker.current.data.length) {\r\n        for (var i = 0; i < this.selectpicker.current.data.length; i++) {\r\n          var data = this.selectpicker.current.data[i];\r\n          if (data.type === 'option') {\r\n            li = data.element;\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        li = elementTemplates.li.cloneNode(false);\r\n        a.appendChild(text);\r\n        li.appendChild(a);\r\n      }\r\n\r\n      dropdownHeader.appendChild(text.cloneNode(true));\r\n\r\n      if (this.selectpicker.view.widestOption) {\r\n        menuInnerInner.appendChild(this.selectpicker.view.widestOption.cloneNode(true));\r\n      }\r\n\r\n      menuInnerInner.appendChild(li);\r\n      menuInnerInner.appendChild(divider);\r\n      menuInnerInner.appendChild(dropdownHeader);\r\n      if (header) menu.appendChild(header);\r\n      if (search) {\r\n        var input = document.createElement('input');\r\n        search.className = 'bs-searchbox';\r\n        input.className = 'form-control';\r\n        search.appendChild(input);\r\n        menu.appendChild(search);\r\n      }\r\n      if (actions) menu.appendChild(actions);\r\n      menuInner.appendChild(menuInnerInner);\r\n      menu.appendChild(menuInner);\r\n      if (doneButton) menu.appendChild(doneButton);\r\n      newElement.appendChild(menu);\r\n\r\n      document.body.appendChild(newElement);\r\n\r\n      var liHeight = li.offsetHeight,\r\n          dropdownHeaderHeight = dropdownHeader ? dropdownHeader.offsetHeight : 0,\r\n          headerHeight = header ? header.offsetHeight : 0,\r\n          searchHeight = search ? search.offsetHeight : 0,\r\n          actionsHeight = actions ? actions.offsetHeight : 0,\r\n          doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,\r\n          dividerHeight = $(divider).outerHeight(true),\r\n          // fall back to jQuery if getComputedStyle is not supported\r\n          menuStyle = window.getComputedStyle ? window.getComputedStyle(menu) : false,\r\n          menuWidth = menu.offsetWidth,\r\n          $menu = menuStyle ? null : $(menu),\r\n          menuPadding = {\r\n            vert: toInteger(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +\r\n                  toInteger(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +\r\n                  toInteger(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +\r\n                  toInteger(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),\r\n            horiz: toInteger(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) +\r\n                  toInteger(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) +\r\n                  toInteger(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) +\r\n                  toInteger(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth'))\r\n          },\r\n          menuExtras = {\r\n            vert: menuPadding.vert +\r\n                  toInteger(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) +\r\n                  toInteger(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2,\r\n            horiz: menuPadding.horiz +\r\n                  toInteger(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) +\r\n                  toInteger(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2\r\n          },\r\n          scrollBarWidth;\r\n\r\n      menuInner.style.overflowY = 'scroll';\r\n\r\n      scrollBarWidth = menu.offsetWidth - menuWidth;\r\n\r\n      document.body.removeChild(newElement);\r\n\r\n      this.sizeInfo.liHeight = liHeight;\r\n      this.sizeInfo.dropdownHeaderHeight = dropdownHeaderHeight;\r\n      this.sizeInfo.headerHeight = headerHeight;\r\n      this.sizeInfo.searchHeight = searchHeight;\r\n      this.sizeInfo.actionsHeight = actionsHeight;\r\n      this.sizeInfo.doneButtonHeight = doneButtonHeight;\r\n      this.sizeInfo.dividerHeight = dividerHeight;\r\n      this.sizeInfo.menuPadding = menuPadding;\r\n      this.sizeInfo.menuExtras = menuExtras;\r\n      this.sizeInfo.menuWidth = menuWidth;\r\n      this.sizeInfo.menuInnerInnerWidth = menuWidth - menuPadding.horiz;\r\n      this.sizeInfo.totalMenuWidth = this.sizeInfo.menuWidth;\r\n      this.sizeInfo.scrollBarWidth = scrollBarWidth;\r\n      this.sizeInfo.selectHeight = this.$newElement[0].offsetHeight;\r\n\r\n      this.setPositionData();\r\n    },\r\n\r\n    getSelectPosition: function () {\r\n      var that = this,\r\n          $window = $(window),\r\n          pos = that.$newElement.offset(),\r\n          $container = $(that.options.container),\r\n          containerPos;\r\n\r\n      if (that.options.container && $container.length && !$container.is('body')) {\r\n        containerPos = $container.offset();\r\n        containerPos.top += parseInt($container.css('borderTopWidth'));\r\n        containerPos.left += parseInt($container.css('borderLeftWidth'));\r\n      } else {\r\n        containerPos = { top: 0, left: 0 };\r\n      }\r\n\r\n      var winPad = that.options.windowPadding;\r\n\r\n      this.sizeInfo.selectOffsetTop = pos.top - containerPos.top - $window.scrollTop();\r\n      this.sizeInfo.selectOffsetBot = $window.height() - this.sizeInfo.selectOffsetTop - this.sizeInfo.selectHeight - containerPos.top - winPad[2];\r\n      this.sizeInfo.selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft();\r\n      this.sizeInfo.selectOffsetRight = $window.width() - this.sizeInfo.selectOffsetLeft - this.sizeInfo.selectWidth - containerPos.left - winPad[1];\r\n      this.sizeInfo.selectOffsetTop -= winPad[0];\r\n      this.sizeInfo.selectOffsetLeft -= winPad[3];\r\n    },\r\n\r\n    setMenuSize: function (isAuto) {\r\n      this.getSelectPosition();\r\n\r\n      var selectWidth = this.sizeInfo.selectWidth,\r\n          liHeight = this.sizeInfo.liHeight,\r\n          headerHeight = this.sizeInfo.headerHeight,\r\n          searchHeight = this.sizeInfo.searchHeight,\r\n          actionsHeight = this.sizeInfo.actionsHeight,\r\n          doneButtonHeight = this.sizeInfo.doneButtonHeight,\r\n          divHeight = this.sizeInfo.dividerHeight,\r\n          menuPadding = this.sizeInfo.menuPadding,\r\n          menuInnerHeight,\r\n          menuHeight,\r\n          divLength = 0,\r\n          minHeight,\r\n          _minHeight,\r\n          maxHeight,\r\n          menuInnerMinHeight,\r\n          estimate,\r\n          isDropup;\r\n\r\n      if (this.options.dropupAuto) {\r\n        // Get the estimated height of the menu without scrollbars.\r\n        // This is useful for smaller menus, where there might be plenty of room\r\n        // below the button without setting dropup, but we can't know\r\n        // the exact height of the menu until createView is called later\r\n        estimate = liHeight * this.selectpicker.current.elements.length + menuPadding.vert;\r\n\r\n        isDropup = this.sizeInfo.selectOffsetTop - this.sizeInfo.selectOffsetBot > this.sizeInfo.menuExtras.vert && estimate + this.sizeInfo.menuExtras.vert + 50 > this.sizeInfo.selectOffsetBot;\r\n\r\n        // ensure dropup doesn't change while searching (so menu doesn't bounce back and forth)\r\n        if (this.selectpicker.isSearching === true) {\r\n          isDropup = this.selectpicker.dropup;\r\n        }\r\n\r\n        this.$newElement.toggleClass(classNames.DROPUP, isDropup);\r\n        this.selectpicker.dropup = isDropup;\r\n      }\r\n\r\n      if (this.options.size === 'auto') {\r\n        _minHeight = this.selectpicker.current.elements.length > 3 ? this.sizeInfo.liHeight * 3 + this.sizeInfo.menuExtras.vert - 2 : 0;\r\n        menuHeight = this.sizeInfo.selectOffsetBot - this.sizeInfo.menuExtras.vert;\r\n        minHeight = _minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight;\r\n        menuInnerMinHeight = Math.max(_minHeight - menuPadding.vert, 0);\r\n\r\n        if (this.$newElement.hasClass(classNames.DROPUP)) {\r\n          menuHeight = this.sizeInfo.selectOffsetTop - this.sizeInfo.menuExtras.vert;\r\n        }\r\n\r\n        maxHeight = menuHeight;\r\n        menuInnerHeight = menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert;\r\n      } else if (this.options.size && this.options.size != 'auto' && this.selectpicker.current.elements.length > this.options.size) {\r\n        for (var i = 0; i < this.options.size; i++) {\r\n          if (this.selectpicker.current.data[i].type === 'divider') divLength++;\r\n        }\r\n\r\n        menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert;\r\n        menuInnerHeight = menuHeight - menuPadding.vert;\r\n        maxHeight = menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight;\r\n        minHeight = menuInnerMinHeight = '';\r\n      }\r\n\r\n      this.$menu.css({\r\n        'max-height': maxHeight + 'px',\r\n        'overflow': 'hidden',\r\n        'min-height': minHeight + 'px'\r\n      });\r\n\r\n      this.$menuInner.css({\r\n        'max-height': menuInnerHeight + 'px',\r\n        'overflow-y': 'auto',\r\n        'min-height': menuInnerMinHeight + 'px'\r\n      });\r\n\r\n      // ensure menuInnerHeight is always a positive number to prevent issues calculating chunkSize in createView\r\n      this.sizeInfo.menuInnerHeight = Math.max(menuInnerHeight, 1);\r\n\r\n      if (this.selectpicker.current.data.length && this.selectpicker.current.data[this.selectpicker.current.data.length - 1].position > this.sizeInfo.menuInnerHeight) {\r\n        this.sizeInfo.hasScrollBar = true;\r\n        this.sizeInfo.totalMenuWidth = this.sizeInfo.menuWidth + this.sizeInfo.scrollBarWidth;\r\n      }\r\n\r\n      if (this.options.dropdownAlignRight === 'auto') {\r\n        this.$menu.toggleClass(classNames.MENURIGHT, this.sizeInfo.selectOffsetLeft > this.sizeInfo.selectOffsetRight && this.sizeInfo.selectOffsetRight < (this.sizeInfo.totalMenuWidth - selectWidth));\r\n      }\r\n\r\n      if (this.dropdown && this.dropdown._popper) this.dropdown._popper.update();\r\n    },\r\n\r\n    setSize: function (refresh) {\r\n      this.liHeight(refresh);\r\n\r\n      if (this.options.header) this.$menu.css('padding-top', 0);\r\n\r\n      if (this.options.size !== false) {\r\n        var that = this,\r\n            $window = $(window);\r\n\r\n        this.setMenuSize();\r\n\r\n        if (this.options.liveSearch) {\r\n          this.$searchbox\r\n            .off('input.setMenuSize propertychange.setMenuSize')\r\n            .on('input.setMenuSize propertychange.setMenuSize', function () {\r\n              return that.setMenuSize();\r\n            });\r\n        }\r\n\r\n        if (this.options.size === 'auto') {\r\n          $window\r\n            .off('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize')\r\n            .on('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize', function () {\r\n              return that.setMenuSize();\r\n            });\r\n        } else if (this.options.size && this.options.size != 'auto' && this.selectpicker.current.elements.length > this.options.size) {\r\n          $window.off('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize');\r\n        }\r\n      }\r\n\r\n      this.createView(false, true, refresh);\r\n    },\r\n\r\n    setWidth: function () {\r\n      var that = this;\r\n\r\n      if (this.options.width === 'auto') {\r\n        requestAnimationFrame(function () {\r\n          that.$menu.css('min-width', '0');\r\n\r\n          that.$element.on('loaded' + EVENT_KEY, function () {\r\n            that.liHeight();\r\n            that.setMenuSize();\r\n\r\n            // Get correct width if element is hidden\r\n            var $selectClone = that.$newElement.clone().appendTo('body'),\r\n                btnWidth = $selectClone.css('width', 'auto').children('button').outerWidth();\r\n\r\n            $selectClone.remove();\r\n\r\n            // Set width to whatever's larger, button title or longest option\r\n            that.sizeInfo.selectWidth = Math.max(that.sizeInfo.totalMenuWidth, btnWidth);\r\n            that.$newElement.css('width', that.sizeInfo.selectWidth + 'px');\r\n          });\r\n        });\r\n      } else if (this.options.width === 'fit') {\r\n        // Remove inline min-width so width can be changed from 'auto'\r\n        this.$menu.css('min-width', '');\r\n        this.$newElement.css('width', '').addClass('fit-width');\r\n      } else if (this.options.width) {\r\n        // Remove inline min-width so width can be changed from 'auto'\r\n        this.$menu.css('min-width', '');\r\n        this.$newElement.css('width', this.options.width);\r\n      } else {\r\n        // Remove inline min-width/width so width can be changed\r\n        this.$menu.css('min-width', '');\r\n        this.$newElement.css('width', '');\r\n      }\r\n      // Remove fit-width class if width is changed programmatically\r\n      if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {\r\n        this.$newElement[0].classList.remove('fit-width');\r\n      }\r\n    },\r\n\r\n    selectPosition: function () {\r\n      this.$bsContainer = $('<div class=\"bs-container\" />');\r\n\r\n      var that = this,\r\n          $container = $(this.options.container),\r\n          pos,\r\n          containerPos,\r\n          actualHeight,\r\n          getPlacement = function ($element) {\r\n            var containerPosition = {},\r\n                // fall back to dropdown's default display setting if display is not manually set\r\n                display = that.options.display || (\r\n                  // Bootstrap 3 doesn't have $.fn.dropdown.Constructor.Default\r\n                  $.fn.dropdown.Constructor.Default ? $.fn.dropdown.Constructor.Default.display\r\n                  : false\r\n                );\r\n\r\n            that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass(classNames.DROPUP, $element.hasClass(classNames.DROPUP));\r\n            pos = $element.offset();\r\n\r\n            if (!$container.is('body')) {\r\n              containerPos = $container.offset();\r\n              containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop();\r\n              containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft();\r\n            } else {\r\n              containerPos = { top: 0, left: 0 };\r\n            }\r\n\r\n            actualHeight = $element.hasClass(classNames.DROPUP) ? 0 : $element[0].offsetHeight;\r\n\r\n            // Bootstrap 4+ uses Popper for menu positioning\r\n            if (version.major < 4 || display === 'static') {\r\n              containerPosition.top = pos.top - containerPos.top + actualHeight;\r\n              containerPosition.left = pos.left - containerPos.left;\r\n            }\r\n\r\n            containerPosition.width = $element[0].offsetWidth;\r\n\r\n            that.$bsContainer.css(containerPosition);\r\n          };\r\n\r\n      this.$button.on('click.bs.dropdown.data-api', function () {\r\n        if (that.isDisabled()) {\r\n          return;\r\n        }\r\n\r\n        getPlacement(that.$newElement);\r\n\r\n        that.$bsContainer\r\n          .appendTo(that.options.container)\r\n          .toggleClass(classNames.SHOW, !that.$button.hasClass(classNames.SHOW))\r\n          .append(that.$menu);\r\n      });\r\n\r\n      $(window)\r\n        .off('resize' + EVENT_KEY + '.' + this.selectId + ' scroll' + EVENT_KEY + '.' + this.selectId)\r\n        .on('resize' + EVENT_KEY + '.' + this.selectId + ' scroll' + EVENT_KEY + '.' + this.selectId, function () {\r\n          var isActive = that.$newElement.hasClass(classNames.SHOW);\r\n\r\n          if (isActive) getPlacement(that.$newElement);\r\n        });\r\n\r\n      this.$element.on('hide' + EVENT_KEY, function () {\r\n        that.$menu.data('height', that.$menu.height());\r\n        that.$bsContainer.detach();\r\n      });\r\n    },\r\n\r\n    setOptionStatus: function (selectedOnly) {\r\n      var that = this;\r\n\r\n      that.noScroll = false;\r\n\r\n      if (that.selectpicker.view.visibleElements && that.selectpicker.view.visibleElements.length) {\r\n        for (var i = 0; i < that.selectpicker.view.visibleElements.length; i++) {\r\n          var liData = that.selectpicker.current.data[i + that.selectpicker.view.position0],\r\n              option = liData.option;\r\n\r\n          if (option) {\r\n            if (selectedOnly !== true) {\r\n              that.setDisabled(\r\n                liData.index,\r\n                liData.disabled\r\n              );\r\n            }\r\n\r\n            that.setSelected(\r\n              liData.index,\r\n              option.selected\r\n            );\r\n          }\r\n        }\r\n      }\r\n    },\r\n\r\n    /**\r\n     * @param {number} index - the index of the option that is being changed\r\n     * @param {boolean} selected - true if the option is being selected, false if being deselected\r\n     */\r\n    setSelected: function (index, selected) {\r\n      var li = this.selectpicker.main.elements[index],\r\n          liData = this.selectpicker.main.data[index],\r\n          activeIndexIsSet = this.activeIndex !== undefined,\r\n          thisIsActive = this.activeIndex === index,\r\n          prevActive,\r\n          a,\r\n          // if current option is already active\r\n          // OR\r\n          // if the current option is being selected, it's NOT multiple, and\r\n          // activeIndex is undefined:\r\n          //  - when the menu is first being opened, OR\r\n          //  - after a search has been performed, OR\r\n          //  - when retainActive is false when selecting a new option (i.e. index of the newly selected option is not the same as the current activeIndex)\r\n          keepActive = thisIsActive || (selected && !this.multiple && !activeIndexIsSet);\r\n\r\n      liData.selected = selected;\r\n\r\n      a = li.firstChild;\r\n\r\n      if (selected) {\r\n        this.selectedIndex = index;\r\n      }\r\n\r\n      li.classList.toggle('selected', selected);\r\n\r\n      if (keepActive) {\r\n        this.focusItem(li, liData);\r\n        this.selectpicker.view.currentActive = li;\r\n        this.activeIndex = index;\r\n      } else {\r\n        this.defocusItem(li);\r\n      }\r\n\r\n      if (a) {\r\n        a.classList.toggle('selected', selected);\r\n\r\n        if (selected) {\r\n          a.setAttribute('aria-selected', true);\r\n        } else {\r\n          if (this.multiple) {\r\n            a.setAttribute('aria-selected', false);\r\n          } else {\r\n            a.removeAttribute('aria-selected');\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!keepActive && !activeIndexIsSet && selected && this.prevActiveIndex !== undefined) {\r\n        prevActive = this.selectpicker.main.elements[this.prevActiveIndex];\r\n\r\n        this.defocusItem(prevActive);\r\n      }\r\n    },\r\n\r\n    /**\r\n     * @param {number} index - the index of the option that is being disabled\r\n     * @param {boolean} disabled - true if the option is being disabled, false if being enabled\r\n     */\r\n    setDisabled: function (index, disabled) {\r\n      var li = this.selectpicker.main.elements[index],\r\n          a;\r\n\r\n      this.selectpicker.main.data[index].disabled = disabled;\r\n\r\n      a = li.firstChild;\r\n\r\n      li.classList.toggle(classNames.DISABLED, disabled);\r\n\r\n      if (a) {\r\n        if (version.major === '4') a.classList.toggle(classNames.DISABLED, disabled);\r\n\r\n        if (disabled) {\r\n          a.setAttribute('aria-disabled', disabled);\r\n          a.setAttribute('tabindex', -1);\r\n        } else {\r\n          a.removeAttribute('aria-disabled');\r\n          a.setAttribute('tabindex', 0);\r\n        }\r\n      }\r\n    },\r\n\r\n    isDisabled: function () {\r\n      return this.$element[0].disabled;\r\n    },\r\n\r\n    checkDisabled: function () {\r\n      if (this.isDisabled()) {\r\n        this.$newElement[0].classList.add(classNames.DISABLED);\r\n        this.$button.addClass(classNames.DISABLED).attr('aria-disabled', true);\r\n      } else {\r\n        if (this.$button[0].classList.contains(classNames.DISABLED)) {\r\n          this.$newElement[0].classList.remove(classNames.DISABLED);\r\n          this.$button.removeClass(classNames.DISABLED).attr('aria-disabled', false);\r\n        }\r\n      }\r\n    },\r\n\r\n    clickListener: function () {\r\n      var that = this,\r\n          $document = $(document);\r\n\r\n      $document.data('spaceSelect', false);\r\n\r\n      this.$button.on('keyup', function (e) {\r\n        if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {\r\n          e.preventDefault();\r\n          $document.data('spaceSelect', false);\r\n        }\r\n      });\r\n\r\n      this.$newElement.on('show.bs.dropdown', function () {\r\n        if (version.major > 3 && !that.dropdown) {\r\n          that.dropdown = that.$button.data('bs.dropdown');\r\n          that.dropdown._menu = that.$menu[0];\r\n        }\r\n      });\r\n\r\n      this.$button.on('click.bs.dropdown.data-api', function () {\r\n        if (!that.$newElement.hasClass(classNames.SHOW)) {\r\n          that.setSize();\r\n        }\r\n      });\r\n\r\n      function setFocus () {\r\n        if (that.options.liveSearch) {\r\n          that.$searchbox.trigger('focus');\r\n        } else {\r\n          that.$menuInner.trigger('focus');\r\n        }\r\n      }\r\n\r\n      function checkPopperExists () {\r\n        if (that.dropdown && that.dropdown._popper && that.dropdown._popper.state.isCreated) {\r\n          setFocus();\r\n        } else {\r\n          requestAnimationFrame(checkPopperExists);\r\n        }\r\n      }\r\n\r\n      this.$element.on('shown' + EVENT_KEY, function () {\r\n        if (that.$menuInner[0].scrollTop !== that.selectpicker.view.scrollTop) {\r\n          that.$menuInner[0].scrollTop = that.selectpicker.view.scrollTop;\r\n        }\r\n\r\n        if (version.major > 3) {\r\n          requestAnimationFrame(checkPopperExists);\r\n        } else {\r\n          setFocus();\r\n        }\r\n      });\r\n\r\n      // ensure posinset and setsize are correct before selecting an option via a click\r\n      this.$menuInner.on('mouseenter', 'li a', function (e) {\r\n        var hoverLi = this.parentElement,\r\n            position0 = that.isVirtual() ? that.selectpicker.view.position0 : 0,\r\n            index = Array.prototype.indexOf.call(hoverLi.parentElement.children, hoverLi),\r\n            hoverData = that.selectpicker.current.data[index + position0];\r\n\r\n        that.focusItem(hoverLi, hoverData, true);\r\n      });\r\n\r\n      this.$menuInner.on('click', 'li a', function (e, retainActive) {\r\n        var $this = $(this),\r\n            element = that.$element[0],\r\n            position0 = that.isVirtual() ? that.selectpicker.view.position0 : 0,\r\n            clickedData = that.selectpicker.current.data[$this.parent().index() + position0],\r\n            clickedIndex = clickedData.index,\r\n            prevValue = getSelectValues(element),\r\n            prevIndex = element.selectedIndex,\r\n            prevOption = element.options[prevIndex],\r\n            triggerChange = true;\r\n\r\n        // Don't close on multi choice menu\r\n        if (that.multiple && that.options.maxOptions !== 1) {\r\n          e.stopPropagation();\r\n        }\r\n\r\n        e.preventDefault();\r\n\r\n        // Don't run if the select is disabled\r\n        if (!that.isDisabled() && !$this.parent().hasClass(classNames.DISABLED)) {\r\n          var option = clickedData.option,\r\n              $option = $(option),\r\n              state = option.selected,\r\n              $optgroup = $option.parent('optgroup'),\r\n              $optgroupOptions = $optgroup.find('option'),\r\n              maxOptions = that.options.maxOptions,\r\n              maxOptionsGrp = $optgroup.data('maxOptions') || false;\r\n\r\n          if (clickedIndex === that.activeIndex) retainActive = true;\r\n\r\n          if (!retainActive) {\r\n            that.prevActiveIndex = that.activeIndex;\r\n            that.activeIndex = undefined;\r\n          }\r\n\r\n          if (!that.multiple) { // Deselect all others if not multi select box\r\n            if (prevOption) prevOption.selected = false;\r\n            option.selected = true;\r\n            that.setSelected(clickedIndex, true);\r\n          } else { // Toggle the one we have chosen if we are multi select.\r\n            option.selected = !state;\r\n\r\n            that.setSelected(clickedIndex, !state);\r\n            $this.trigger('blur');\r\n\r\n            if (maxOptions !== false || maxOptionsGrp !== false) {\r\n              var maxReached = maxOptions < getSelectedOptions(element).length,\r\n                  maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;\r\n\r\n              if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {\r\n                if (maxOptions && maxOptions == 1) {\r\n                  element.selectedIndex = -1;\r\n                  option.selected = true;\r\n                  that.setOptionStatus(true);\r\n                } else if (maxOptionsGrp && maxOptionsGrp == 1) {\r\n                  for (var i = 0; i < $optgroupOptions.length; i++) {\r\n                    var _option = $optgroupOptions[i];\r\n                    _option.selected = false;\r\n                    that.setSelected(_option.liIndex, false);\r\n                  }\r\n\r\n                  option.selected = true;\r\n                  that.setSelected(clickedIndex, true);\r\n                } else {\r\n                  var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText,\r\n                      maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText,\r\n                      maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),\r\n                      maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),\r\n                      $notify = $('<div class=\"notify\"></div>');\r\n                  // If {var} is set in array, replace it\r\n                  /** @deprecated */\r\n                  if (maxOptionsArr[2]) {\r\n                    maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);\r\n                    maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);\r\n                  }\r\n\r\n                  option.selected = false;\r\n\r\n                  that.$menu.append($notify);\r\n\r\n                  if (maxOptions && maxReached) {\r\n                    $notify.append($('<div>' + maxTxt + '</div>'));\r\n                    triggerChange = false;\r\n                    that.$element.trigger('maxReached' + EVENT_KEY);\r\n                  }\r\n\r\n                  if (maxOptionsGrp && maxReachedGrp) {\r\n                    $notify.append($('<div>' + maxTxtGrp + '</div>'));\r\n                    triggerChange = false;\r\n                    that.$element.trigger('maxReachedGrp' + EVENT_KEY);\r\n                  }\r\n\r\n                  setTimeout(function () {\r\n                    that.setSelected(clickedIndex, false);\r\n                  }, 10);\r\n\r\n                  $notify[0].classList.add('fadeOut');\r\n\r\n                  setTimeout(function () {\r\n                    $notify.remove();\r\n                  }, 1050);\r\n                }\r\n              }\r\n            }\r\n          }\r\n\r\n          if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) {\r\n            that.$button.trigger('focus');\r\n          } else if (that.options.liveSearch) {\r\n            that.$searchbox.trigger('focus');\r\n          }\r\n\r\n          // Trigger select 'change'\r\n          if (triggerChange) {\r\n            if (that.multiple || prevIndex !== element.selectedIndex) {\r\n              // $option.prop('selected') is current option state (selected/unselected). prevValue is the value of the select prior to being changed.\r\n              changedArguments = [option.index, $option.prop('selected'), prevValue];\r\n              that.$element\r\n                .triggerNative('change');\r\n            }\r\n          }\r\n        }\r\n      });\r\n\r\n      this.$menu.on('click', 'li.' + classNames.DISABLED + ' a, .' + classNames.POPOVERHEADER + ', .' + classNames.POPOVERHEADER + ' :not(.close)', function (e) {\r\n        if (e.currentTarget == this) {\r\n          e.preventDefault();\r\n          e.stopPropagation();\r\n          if (that.options.liveSearch && !$(e.target).hasClass('close')) {\r\n            that.$searchbox.trigger('focus');\r\n          } else {\r\n            that.$button.trigger('focus');\r\n          }\r\n        }\r\n      });\r\n\r\n      this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        if (that.options.liveSearch) {\r\n          that.$searchbox.trigger('focus');\r\n        } else {\r\n          that.$button.trigger('focus');\r\n        }\r\n      });\r\n\r\n      this.$menu.on('click', '.' + classNames.POPOVERHEADER + ' .close', function () {\r\n        that.$button.trigger('click');\r\n      });\r\n\r\n      this.$searchbox.on('click', function (e) {\r\n        e.stopPropagation();\r\n      });\r\n\r\n      this.$menu.on('click', '.actions-btn', function (e) {\r\n        if (that.options.liveSearch) {\r\n          that.$searchbox.trigger('focus');\r\n        } else {\r\n          that.$button.trigger('focus');\r\n        }\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n\r\n        if ($(this).hasClass('bs-select-all')) {\r\n          that.selectAll();\r\n        } else {\r\n          that.deselectAll();\r\n        }\r\n      });\r\n\r\n      this.$button\r\n        .on('focus' + EVENT_KEY, function (e) {\r\n          var tabindex = that.$element[0].getAttribute('tabindex');\r\n\r\n          // only change when button is actually focused\r\n          if (tabindex !== undefined && e.originalEvent && e.originalEvent.isTrusted) {\r\n            // apply select element's tabindex to ensure correct order is followed when tabbing to the next element\r\n            this.setAttribute('tabindex', tabindex);\r\n            // set element's tabindex to -1 to allow for reverse tabbing\r\n            that.$element[0].setAttribute('tabindex', -1);\r\n            that.selectpicker.view.tabindex = tabindex;\r\n          }\r\n        })\r\n        .on('blur' + EVENT_KEY, function (e) {\r\n          // revert everything to original tabindex\r\n          if (that.selectpicker.view.tabindex !== undefined && e.originalEvent && e.originalEvent.isTrusted) {\r\n            that.$element[0].setAttribute('tabindex', that.selectpicker.view.tabindex);\r\n            this.setAttribute('tabindex', -1);\r\n            that.selectpicker.view.tabindex = undefined;\r\n          }\r\n        });\r\n\r\n      this.$element\r\n        .on('change' + EVENT_KEY, function () {\r\n          that.render();\r\n          that.$element.trigger('changed' + EVENT_KEY, changedArguments);\r\n          changedArguments = null;\r\n        })\r\n        .on('focus' + EVENT_KEY, function () {\r\n          if (!that.options.mobile) that.$button.trigger('focus');\r\n        });\r\n    },\r\n\r\n    liveSearchListener: function () {\r\n      var that = this;\r\n\r\n      this.$button.on('click.bs.dropdown.data-api', function () {\r\n        if (!!that.$searchbox.val()) {\r\n          that.$searchbox.val('');\r\n        }\r\n      });\r\n\r\n      this.$searchbox.on('click.bs.dropdown.data-api focus.bs.dropdown.data-api touchend.bs.dropdown.data-api', function (e) {\r\n        e.stopPropagation();\r\n      });\r\n\r\n      this.$searchbox.on('input propertychange', function () {\r\n        var searchValue = that.$searchbox.val();\r\n\r\n        that.selectpicker.search.elements = [];\r\n        that.selectpicker.search.data = [];\r\n\r\n        if (searchValue) {\r\n          var i,\r\n              searchMatch = [],\r\n              q = searchValue.toUpperCase(),\r\n              cache = {},\r\n              cacheArr = [],\r\n              searchStyle = that._searchStyle(),\r\n              normalizeSearch = that.options.liveSearchNormalize;\r\n\r\n          if (normalizeSearch) q = normalizeToBase(q);\r\n\r\n          for (var i = 0; i < that.selectpicker.main.data.length; i++) {\r\n            var li = that.selectpicker.main.data[i];\r\n\r\n            if (!cache[i]) {\r\n              cache[i] = stringSearch(li, q, searchStyle, normalizeSearch);\r\n            }\r\n\r\n            if (cache[i] && li.headerIndex !== undefined && cacheArr.indexOf(li.headerIndex) === -1) {\r\n              if (li.headerIndex > 0) {\r\n                cache[li.headerIndex - 1] = true;\r\n                cacheArr.push(li.headerIndex - 1);\r\n              }\r\n\r\n              cache[li.headerIndex] = true;\r\n              cacheArr.push(li.headerIndex);\r\n\r\n              cache[li.lastIndex + 1] = true;\r\n            }\r\n\r\n            if (cache[i] && li.type !== 'optgroup-label') cacheArr.push(i);\r\n          }\r\n\r\n          for (var i = 0, cacheLen = cacheArr.length; i < cacheLen; i++) {\r\n            var index = cacheArr[i],\r\n                prevIndex = cacheArr[i - 1],\r\n                li = that.selectpicker.main.data[index],\r\n                liPrev = that.selectpicker.main.data[prevIndex];\r\n\r\n            if (li.type !== 'divider' || (li.type === 'divider' && liPrev && liPrev.type !== 'divider' && cacheLen - 1 !== i)) {\r\n              that.selectpicker.search.data.push(li);\r\n              searchMatch.push(that.selectpicker.main.elements[index]);\r\n            }\r\n          }\r\n\r\n          that.activeIndex = undefined;\r\n          that.noScroll = true;\r\n          that.$menuInner.scrollTop(0);\r\n          that.selectpicker.search.elements = searchMatch;\r\n          that.createView(true);\r\n          showNoResults.call(that, searchMatch, searchValue);\r\n        } else {\r\n          that.$menuInner.scrollTop(0);\r\n          that.createView(false);\r\n        }\r\n      });\r\n    },\r\n\r\n    _searchStyle: function () {\r\n      return this.options.liveSearchStyle || 'contains';\r\n    },\r\n\r\n    val: function (value) {\r\n      var element = this.$element[0];\r\n\r\n      if (typeof value !== 'undefined') {\r\n        var prevValue = getSelectValues(element);\r\n\r\n        changedArguments = [null, null, prevValue];\r\n\r\n        this.$element\r\n          .val(value)\r\n          .trigger('changed' + EVENT_KEY, changedArguments);\r\n\r\n        if (this.$newElement.hasClass(classNames.SHOW)) {\r\n          if (this.multiple) {\r\n            this.setOptionStatus(true);\r\n          } else {\r\n            var liSelectedIndex = (element.options[element.selectedIndex] || {}).liIndex;\r\n\r\n            if (typeof liSelectedIndex === 'number') {\r\n              this.setSelected(this.selectedIndex, false);\r\n              this.setSelected(liSelectedIndex, true);\r\n            }\r\n          }\r\n        }\r\n\r\n        this.render();\r\n\r\n        changedArguments = null;\r\n\r\n        return this.$element;\r\n      } else {\r\n        return this.$element.val();\r\n      }\r\n    },\r\n\r\n    changeAll: function (status) {\r\n      if (!this.multiple) return;\r\n      if (typeof status === 'undefined') status = true;\r\n\r\n      var element = this.$element[0],\r\n          previousSelected = 0,\r\n          currentSelected = 0,\r\n          prevValue = getSelectValues(element);\r\n\r\n      element.classList.add('bs-select-hidden');\r\n\r\n      for (var i = 0, data = this.selectpicker.current.data, len = data.length; i < len; i++) {\r\n        var liData = data[i],\r\n            option = liData.option;\r\n\r\n        if (option && !liData.disabled && liData.type !== 'divider') {\r\n          if (liData.selected) previousSelected++;\r\n          option.selected = status;\r\n          if (status === true) currentSelected++;\r\n        }\r\n      }\r\n\r\n      element.classList.remove('bs-select-hidden');\r\n\r\n      if (previousSelected === currentSelected) return;\r\n\r\n      this.setOptionStatus();\r\n\r\n      changedArguments = [null, null, prevValue];\r\n\r\n      this.$element\r\n        .triggerNative('change');\r\n    },\r\n\r\n    selectAll: function () {\r\n      return this.changeAll(true);\r\n    },\r\n\r\n    deselectAll: function () {\r\n      return this.changeAll(false);\r\n    },\r\n\r\n    toggle: function (e) {\r\n      e = e || window.event;\r\n\r\n      if (e) e.stopPropagation();\r\n\r\n      this.$button.trigger('click.bs.dropdown.data-api');\r\n    },\r\n\r\n    keydown: function (e) {\r\n      var $this = $(this),\r\n          isToggle = $this.hasClass('dropdown-toggle'),\r\n          $parent = isToggle ? $this.closest('.dropdown') : $this.closest(Selector.MENU),\r\n          that = $parent.data('this'),\r\n          $items = that.findLis(),\r\n          index,\r\n          isActive,\r\n          liActive,\r\n          activeLi,\r\n          offset,\r\n          updateScroll = false,\r\n          downOnTab = e.which === keyCodes.TAB && !isToggle && !that.options.selectOnTab,\r\n          isArrowKey = REGEXP_ARROW.test(e.which) || downOnTab,\r\n          scrollTop = that.$menuInner[0].scrollTop,\r\n          isVirtual = that.isVirtual(),\r\n          position0 = isVirtual === true ? that.selectpicker.view.position0 : 0;\r\n\r\n      // do nothing if a function key is pressed\r\n      if (e.which >= 112 && e.which <= 123) return;\r\n\r\n      isActive = that.$newElement.hasClass(classNames.SHOW);\r\n\r\n      if (\r\n        !isActive &&\r\n        (\r\n          isArrowKey ||\r\n          (e.which >= 48 && e.which <= 57) ||\r\n          (e.which >= 96 && e.which <= 105) ||\r\n          (e.which >= 65 && e.which <= 90)\r\n        )\r\n      ) {\r\n        that.$button.trigger('click.bs.dropdown.data-api');\r\n\r\n        if (that.options.liveSearch) {\r\n          that.$searchbox.trigger('focus');\r\n          return;\r\n        }\r\n      }\r\n\r\n      if (e.which === keyCodes.ESCAPE && isActive) {\r\n        e.preventDefault();\r\n        that.$button.trigger('click.bs.dropdown.data-api').trigger('focus');\r\n      }\r\n\r\n      if (isArrowKey) { // if up or down\r\n        if (!$items.length) return;\r\n\r\n        liActive = that.selectpicker.main.elements[that.activeIndex];\r\n        index = liActive ? Array.prototype.indexOf.call(liActive.parentElement.children, liActive) : -1;\r\n\r\n        if (index !== -1) {\r\n          that.defocusItem(liActive);\r\n        }\r\n\r\n        if (e.which === keyCodes.ARROW_UP) { // up\r\n          if (index !== -1) index--;\r\n          if (index + position0 < 0) index += $items.length;\r\n\r\n          if (!that.selectpicker.view.canHighlight[index + position0]) {\r\n            index = that.selectpicker.view.canHighlight.slice(0, index + position0).lastIndexOf(true) - position0;\r\n            if (index === -1) index = $items.length - 1;\r\n          }\r\n        } else if (e.which === keyCodes.ARROW_DOWN || downOnTab) { // down\r\n          index++;\r\n          if (index + position0 >= that.selectpicker.view.canHighlight.length) index = 0;\r\n\r\n          if (!that.selectpicker.view.canHighlight[index + position0]) {\r\n            index = index + 1 + that.selectpicker.view.canHighlight.slice(index + position0 + 1).indexOf(true);\r\n          }\r\n        }\r\n\r\n        e.preventDefault();\r\n\r\n        var liActiveIndex = position0 + index;\r\n\r\n        if (e.which === keyCodes.ARROW_UP) { // up\r\n          // scroll to bottom and highlight last option\r\n          if (position0 === 0 && index === $items.length - 1) {\r\n            that.$menuInner[0].scrollTop = that.$menuInner[0].scrollHeight;\r\n\r\n            liActiveIndex = that.selectpicker.current.elements.length - 1;\r\n          } else {\r\n            activeLi = that.selectpicker.current.data[liActiveIndex];\r\n            offset = activeLi.position - activeLi.height;\r\n\r\n            updateScroll = offset < scrollTop;\r\n          }\r\n        } else if (e.which === keyCodes.ARROW_DOWN || downOnTab) { // down\r\n          // scroll to top and highlight first option\r\n          if (index === 0) {\r\n            that.$menuInner[0].scrollTop = 0;\r\n\r\n            liActiveIndex = 0;\r\n          } else {\r\n            activeLi = that.selectpicker.current.data[liActiveIndex];\r\n            offset = activeLi.position - that.sizeInfo.menuInnerHeight;\r\n\r\n            updateScroll = offset > scrollTop;\r\n          }\r\n        }\r\n\r\n        liActive = that.selectpicker.current.elements[liActiveIndex];\r\n\r\n        that.activeIndex = that.selectpicker.current.data[liActiveIndex].index;\r\n\r\n        that.focusItem(liActive);\r\n\r\n        that.selectpicker.view.currentActive = liActive;\r\n\r\n        if (updateScroll) that.$menuInner[0].scrollTop = offset;\r\n\r\n        if (that.options.liveSearch) {\r\n          that.$searchbox.trigger('focus');\r\n        } else {\r\n          $this.trigger('focus');\r\n        }\r\n      } else if (\r\n        (!$this.is('input') && !REGEXP_TAB_OR_ESCAPE.test(e.which)) ||\r\n        (e.which === keyCodes.SPACE && that.selectpicker.keydown.keyHistory)\r\n      ) {\r\n        var searchMatch,\r\n            matches = [],\r\n            keyHistory;\r\n\r\n        e.preventDefault();\r\n\r\n        that.selectpicker.keydown.keyHistory += keyCodeMap[e.which];\r\n\r\n        if (that.selectpicker.keydown.resetKeyHistory.cancel) clearTimeout(that.selectpicker.keydown.resetKeyHistory.cancel);\r\n        that.selectpicker.keydown.resetKeyHistory.cancel = that.selectpicker.keydown.resetKeyHistory.start();\r\n\r\n        keyHistory = that.selectpicker.keydown.keyHistory;\r\n\r\n        // if all letters are the same, set keyHistory to just the first character when searching\r\n        if (/^(.)\\1+$/.test(keyHistory)) {\r\n          keyHistory = keyHistory.charAt(0);\r\n        }\r\n\r\n        // find matches\r\n        for (var i = 0; i < that.selectpicker.current.data.length; i++) {\r\n          var li = that.selectpicker.current.data[i],\r\n              hasMatch;\r\n\r\n          hasMatch = stringSearch(li, keyHistory, 'startsWith', true);\r\n\r\n          if (hasMatch && that.selectpicker.view.canHighlight[i]) {\r\n            matches.push(li.index);\r\n          }\r\n        }\r\n\r\n        if (matches.length) {\r\n          var matchIndex = 0;\r\n\r\n          $items.removeClass('active').find('a').removeClass('active');\r\n\r\n          // either only one key has been pressed or they are all the same key\r\n          if (keyHistory.length === 1) {\r\n            matchIndex = matches.indexOf(that.activeIndex);\r\n\r\n            if (matchIndex === -1 || matchIndex === matches.length - 1) {\r\n              matchIndex = 0;\r\n            } else {\r\n              matchIndex++;\r\n            }\r\n          }\r\n\r\n          searchMatch = matches[matchIndex];\r\n\r\n          activeLi = that.selectpicker.main.data[searchMatch];\r\n\r\n          if (scrollTop - activeLi.position > 0) {\r\n            offset = activeLi.position - activeLi.height;\r\n            updateScroll = true;\r\n          } else {\r\n            offset = activeLi.position - that.sizeInfo.menuInnerHeight;\r\n            // if the option is already visible at the current scroll position, just keep it the same\r\n            updateScroll = activeLi.position > scrollTop + that.sizeInfo.menuInnerHeight;\r\n          }\r\n\r\n          liActive = that.selectpicker.main.elements[searchMatch];\r\n\r\n          that.activeIndex = matches[matchIndex];\r\n\r\n          that.focusItem(liActive);\r\n\r\n          if (liActive) liActive.firstChild.focus();\r\n\r\n          if (updateScroll) that.$menuInner[0].scrollTop = offset;\r\n\r\n          $this.trigger('focus');\r\n        }\r\n      }\r\n\r\n      // Select focused option if \"Enter\", \"Spacebar\" or \"Tab\" (when selectOnTab is true) are pressed inside the menu.\r\n      if (\r\n        isActive &&\r\n        (\r\n          (e.which === keyCodes.SPACE && !that.selectpicker.keydown.keyHistory) ||\r\n          e.which === keyCodes.ENTER ||\r\n          (e.which === keyCodes.TAB && that.options.selectOnTab)\r\n        )\r\n      ) {\r\n        if (e.which !== keyCodes.SPACE) e.preventDefault();\r\n\r\n        if (!that.options.liveSearch || e.which !== keyCodes.SPACE) {\r\n          that.$menuInner.find('.active a').trigger('click', true); // retain active class\r\n          $this.trigger('focus');\r\n\r\n          if (!that.options.liveSearch) {\r\n            // Prevent screen from scrolling if the user hits the spacebar\r\n            e.preventDefault();\r\n            // Fixes spacebar selection of dropdown items in FF & IE\r\n            $(document).data('spaceSelect', true);\r\n          }\r\n        }\r\n      }\r\n    },\r\n\r\n    mobile: function () {\r\n      // ensure mobile is set to true if mobile function is called after init\r\n      this.options.mobile = true;\r\n      this.$element[0].classList.add('mobile-device');\r\n    },\r\n\r\n    refresh: function () {\r\n      // update options if data attributes have been changed\r\n      var config = $.extend({}, this.options, this.$element.data());\r\n      this.options = config;\r\n\r\n      this.checkDisabled();\r\n      this.buildData();\r\n      this.setStyle();\r\n      this.render();\r\n      this.buildList();\r\n      this.setWidth();\r\n\r\n      this.setSize(true);\r\n\r\n      this.$element.trigger('refreshed' + EVENT_KEY);\r\n    },\r\n\r\n    hide: function () {\r\n      this.$newElement.hide();\r\n    },\r\n\r\n    show: function () {\r\n      this.$newElement.show();\r\n    },\r\n\r\n    remove: function () {\r\n      this.$newElement.remove();\r\n      this.$element.remove();\r\n    },\r\n\r\n    destroy: function () {\r\n      this.$newElement.before(this.$element).remove();\r\n\r\n      if (this.$bsContainer) {\r\n        this.$bsContainer.remove();\r\n      } else {\r\n        this.$menu.remove();\r\n      }\r\n\r\n      this.$element\r\n        .off(EVENT_KEY)\r\n        .removeData('selectpicker')\r\n        .removeClass('bs-select-hidden selectpicker');\r\n\r\n      $(window).off(EVENT_KEY + '.' + this.selectId);\r\n    }\r\n  };\r\n\r\n  // SELECTPICKER PLUGIN DEFINITION\r\n  // ==============================\r\n  function Plugin (option) {\r\n    // get the args of the outer function..\r\n    var args = arguments;\r\n    // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them\r\n    // to get lost/corrupted in android 2.3 and IE9 #715 #775\r\n    var _option = option;\r\n\r\n    [].shift.apply(args);\r\n\r\n    // if the version was not set successfully\r\n    if (!version.success) {\r\n      // try to retreive it again\r\n      try {\r\n        version.full = ($.fn.dropdown.Constructor.VERSION || '').split(' ')[0].split('.');\r\n      } catch (err) {\r\n        // fall back to use BootstrapVersion if set\r\n        if (Selectpicker.BootstrapVersion) {\r\n          version.full = Selectpicker.BootstrapVersion.split(' ')[0].split('.');\r\n        } else {\r\n          version.full = [version.major, '0', '0'];\r\n\r\n          console.warn(\r\n            'There was an issue retrieving Bootstrap\\'s version. ' +\r\n            'Ensure Bootstrap is being loaded before bootstrap-select and there is no namespace collision. ' +\r\n            'If loading Bootstrap asynchronously, the version may need to be manually specified via $.fn.selectpicker.Constructor.BootstrapVersion.',\r\n            err\r\n          );\r\n        }\r\n      }\r\n\r\n      version.major = version.full[0];\r\n      version.success = true;\r\n    }\r\n\r\n    if (version.major === '4') {\r\n      // some defaults need to be changed if using Bootstrap 4\r\n      // check to see if they have already been manually changed before forcing them to update\r\n      var toUpdate = [];\r\n\r\n      if (Selectpicker.DEFAULTS.style === classNames.BUTTONCLASS) toUpdate.push({ name: 'style', className: 'BUTTONCLASS' });\r\n      if (Selectpicker.DEFAULTS.iconBase === classNames.ICONBASE) toUpdate.push({ name: 'iconBase', className: 'ICONBASE' });\r\n      if (Selectpicker.DEFAULTS.tickIcon === classNames.TICKICON) toUpdate.push({ name: 'tickIcon', className: 'TICKICON' });\r\n\r\n      classNames.DIVIDER = 'dropdown-divider';\r\n      classNames.SHOW = 'show';\r\n      classNames.BUTTONCLASS = 'btn-light';\r\n      classNames.POPOVERHEADER = 'popover-header';\r\n      classNames.ICONBASE = '';\r\n      classNames.TICKICON = 'bs-ok-default';\r\n\r\n      for (var i = 0; i < toUpdate.length; i++) {\r\n        var option = toUpdate[i];\r\n        Selectpicker.DEFAULTS[option.name] = classNames[option.className];\r\n      }\r\n    }\r\n\r\n    var value;\r\n    var chain = this.each(function () {\r\n      var $this = $(this);\r\n      if ($this.is('select')) {\r\n        var data = $this.data('selectpicker'),\r\n            options = typeof _option == 'object' && _option;\r\n\r\n        if (!data) {\r\n          var dataAttributes = $this.data();\r\n\r\n          for (var dataAttr in dataAttributes) {\r\n            if (Object.prototype.hasOwnProperty.call(dataAttributes, dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {\r\n              delete dataAttributes[dataAttr];\r\n            }\r\n          }\r\n\r\n          var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, dataAttributes, options);\r\n          config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), dataAttributes.template, options.template);\r\n          $this.data('selectpicker', (data = new Selectpicker(this, config)));\r\n        } else if (options) {\r\n          for (var i in options) {\r\n            if (Object.prototype.hasOwnProperty.call(options, i)) {\r\n              data.options[i] = options[i];\r\n            }\r\n          }\r\n        }\r\n\r\n        if (typeof _option == 'string') {\r\n          if (data[_option] instanceof Function) {\r\n            value = data[_option].apply(data, args);\r\n          } else {\r\n            value = data.options[_option];\r\n          }\r\n        }\r\n      }\r\n    });\r\n\r\n    if (typeof value !== 'undefined') {\r\n      // noinspection JSUnusedAssignment\r\n      return value;\r\n    } else {\r\n      return chain;\r\n    }\r\n  }\r\n\r\n  var old = $.fn.selectpicker;\r\n  $.fn.selectpicker = Plugin;\r\n  $.fn.selectpicker.Constructor = Selectpicker;\r\n\r\n  // SELECTPICKER NO CONFLICT\r\n  // ========================\r\n  $.fn.selectpicker.noConflict = function () {\r\n    $.fn.selectpicker = old;\r\n    return this;\r\n  };\r\n\r\n  // get Bootstrap's keydown event handler for either Bootstrap 4 or Bootstrap 3\r\n  function keydownHandler () {\r\n    if ($.fn.dropdown) {\r\n      // wait to define until function is called in case Bootstrap isn't loaded yet\r\n      var bootstrapKeydown = $.fn.dropdown.Constructor._dataApiKeydownHandler || $.fn.dropdown.Constructor.prototype.keydown;\r\n      return bootstrapKeydown.apply(this, arguments);\r\n    }\r\n  }\r\n\r\n  $(document)\r\n    .off('keydown.bs.dropdown.data-api')\r\n    .on('keydown.bs.dropdown.data-api', ':not(.bootstrap-select) > [data-toggle=\"dropdown\"]', keydownHandler)\r\n    .on('keydown.bs.dropdown.data-api', ':not(.bootstrap-select) > .dropdown-menu', keydownHandler)\r\n    .on('keydown' + EVENT_KEY, '.bootstrap-select [data-toggle=\"dropdown\"], .bootstrap-select [role=\"listbox\"], .bootstrap-select .bs-searchbox input', Selectpicker.prototype.keydown)\r\n    .on('focusin.modal', '.bootstrap-select [data-toggle=\"dropdown\"], .bootstrap-select [role=\"listbox\"], .bootstrap-select .bs-searchbox input', function (e) {\r\n      e.stopPropagation();\r\n    });\r\n\r\n  // SELECTPICKER DATA-API\r\n  // =====================\r\n  $(window).on('load' + EVENT_KEY + '.data-api', function () {\r\n    $('.selectpicker').each(function () {\r\n      var $selectpicker = $(this);\r\n      Plugin.call($selectpicker, $selectpicker.data());\r\n    })\r\n  });\r\n})(jQuery);\r\n\r\n\r\n}));\n//# sourceMappingURL=bootstrap-select.js.map","/*!\n * typeahead.js 1.3.1\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT\n */\n\n\n(function(root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define([ \"jquery\" ], function(a0) {\n            return root[\"Bloodhound\"] = factory(a0);\n        });\n    } else if (typeof module === \"object\" && module.exports) {\n        module.exports = factory(require(\"jquery\"));\n    } else {\n        root[\"Bloodhound\"] = factory(root[\"jQuery\"]);\n    }\n})(this, function($) {\n    var _ = function() {\n        \"use strict\";\n        return {\n            isMsie: function() {\n                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n            },\n            isBlankString: function(str) {\n                return !str || /^\\s*$/.test(str);\n            },\n            escapeRegExChars: function(str) {\n                return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n            },\n            isString: function(obj) {\n                return typeof obj === \"string\";\n            },\n            isNumber: function(obj) {\n                return typeof obj === \"number\";\n            },\n            isArray: $.isArray,\n            isFunction: $.isFunction,\n            isObject: $.isPlainObject,\n            isUndefined: function(obj) {\n                return typeof obj === \"undefined\";\n            },\n            isElement: function(obj) {\n                return !!(obj && obj.nodeType === 1);\n            },\n            isJQuery: function(obj) {\n                return obj instanceof $;\n            },\n            toStr: function toStr(s) {\n                return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n            },\n            bind: $.proxy,\n            each: function(collection, cb) {\n                $.each(collection, reverseArgs);\n                function reverseArgs(index, value) {\n                    return cb(value, index);\n                }\n            },\n            map: $.map,\n            filter: $.grep,\n            every: function(obj, test) {\n                var result = true;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (!(result = test.call(null, val, key, obj))) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            some: function(obj, test) {\n                var result = false;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (result = test.call(null, val, key, obj)) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            mixin: $.extend,\n            identity: function(x) {\n                return x;\n            },\n            clone: function(obj) {\n                return $.extend(true, {}, obj);\n            },\n            getIdGenerator: function() {\n                var counter = 0;\n                return function() {\n                    return counter++;\n                };\n            },\n            templatify: function templatify(obj) {\n                return $.isFunction(obj) ? obj : template;\n                function template() {\n                    return String(obj);\n                }\n            },\n            defer: function(fn) {\n                setTimeout(fn, 0);\n            },\n            debounce: function(func, wait, immediate) {\n                var timeout, result;\n                return function() {\n                    var context = this, args = arguments, later, callNow;\n                    later = function() {\n                        timeout = null;\n                        if (!immediate) {\n                            result = func.apply(context, args);\n                        }\n                    };\n                    callNow = immediate && !timeout;\n                    clearTimeout(timeout);\n                    timeout = setTimeout(later, wait);\n                    if (callNow) {\n                        result = func.apply(context, args);\n                    }\n                    return result;\n                };\n            },\n            throttle: function(func, wait) {\n                var context, args, timeout, result, previous, later;\n                previous = 0;\n                later = function() {\n                    previous = new Date();\n                    timeout = null;\n                    result = func.apply(context, args);\n                };\n                return function() {\n                    var now = new Date(), remaining = wait - (now - previous);\n                    context = this;\n                    args = arguments;\n                    if (remaining <= 0) {\n                        clearTimeout(timeout);\n                        timeout = null;\n                        previous = now;\n                        result = func.apply(context, args);\n                    } else if (!timeout) {\n                        timeout = setTimeout(later, remaining);\n                    }\n                    return result;\n                };\n            },\n            stringify: function(val) {\n                return _.isString(val) ? val : JSON.stringify(val);\n            },\n            guid: function() {\n                function _p8(s) {\n                    var p = (Math.random().toString(16) + \"000000000\").substr(2, 8);\n                    return s ? \"-\" + p.substr(0, 4) + \"-\" + p.substr(4, 4) : p;\n                }\n                return \"tt-\" + _p8() + _p8(true) + _p8(true) + _p8();\n            },\n            noop: function() {}\n        };\n    }();\n    var VERSION = \"1.3.1\";\n    var tokenizers = function() {\n        \"use strict\";\n        return {\n            nonword: nonword,\n            whitespace: whitespace,\n            ngram: ngram,\n            obj: {\n                nonword: getObjTokenizer(nonword),\n                whitespace: getObjTokenizer(whitespace),\n                ngram: getObjTokenizer(ngram)\n            }\n        };\n        function whitespace(str) {\n            str = _.toStr(str);\n            return str ? str.split(/\\s+/) : [];\n        }\n        function nonword(str) {\n            str = _.toStr(str);\n            return str ? str.split(/\\W+/) : [];\n        }\n        function ngram(str) {\n            str = _.toStr(str);\n            var tokens = [], word = \"\";\n            _.each(str.split(\"\"), function(char) {\n                if (char.match(/\\s+/)) {\n                    word = \"\";\n                } else {\n                    tokens.push(word + char);\n                    word += char;\n                }\n            });\n            return tokens;\n        }\n        function getObjTokenizer(tokenizer) {\n            return function setKey(keys) {\n                keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);\n                return function tokenize(o) {\n                    var tokens = [];\n                    _.each(keys, function(k) {\n                        tokens = tokens.concat(tokenizer(_.toStr(o[k])));\n                    });\n                    return tokens;\n                };\n            };\n        }\n    }();\n    var LruCache = function() {\n        \"use strict\";\n        function LruCache(maxSize) {\n            this.maxSize = _.isNumber(maxSize) ? maxSize : 100;\n            this.reset();\n            if (this.maxSize <= 0) {\n                this.set = this.get = $.noop;\n            }\n        }\n        _.mixin(LruCache.prototype, {\n            set: function set(key, val) {\n                var tailItem = this.list.tail, node;\n                if (this.size >= this.maxSize) {\n                    this.list.remove(tailItem);\n                    delete this.hash[tailItem.key];\n                    this.size--;\n                }\n                if (node = this.hash[key]) {\n                    node.val = val;\n                    this.list.moveToFront(node);\n                } else {\n                    node = new Node(key, val);\n                    this.list.add(node);\n                    this.hash[key] = node;\n                    this.size++;\n                }\n            },\n            get: function get(key) {\n                var node = this.hash[key];\n                if (node) {\n                    this.list.moveToFront(node);\n                    return node.val;\n                }\n            },\n            reset: function reset() {\n                this.size = 0;\n                this.hash = {};\n                this.list = new List();\n            }\n        });\n        function List() {\n            this.head = this.tail = null;\n        }\n        _.mixin(List.prototype, {\n            add: function add(node) {\n                if (this.head) {\n                    node.next = this.head;\n                    this.head.prev = node;\n                }\n                this.head = node;\n                this.tail = this.tail || node;\n            },\n            remove: function remove(node) {\n                node.prev ? node.prev.next = node.next : this.head = node.next;\n                node.next ? node.next.prev = node.prev : this.tail = node.prev;\n            },\n            moveToFront: function(node) {\n                this.remove(node);\n                this.add(node);\n            }\n        });\n        function Node(key, val) {\n            this.key = key;\n            this.val = val;\n            this.prev = this.next = null;\n        }\n        return LruCache;\n    }();\n    var PersistentStorage = function() {\n        \"use strict\";\n        var LOCAL_STORAGE;\n        try {\n            LOCAL_STORAGE = window.localStorage;\n            LOCAL_STORAGE.setItem(\"~~~\", \"!\");\n            LOCAL_STORAGE.removeItem(\"~~~\");\n        } catch (err) {\n            LOCAL_STORAGE = null;\n        }\n        function PersistentStorage(namespace, override) {\n            this.prefix = [ \"__\", namespace, \"__\" ].join(\"\");\n            this.ttlKey = \"__ttl__\";\n            this.keyMatcher = new RegExp(\"^\" + _.escapeRegExChars(this.prefix));\n            this.ls = override || LOCAL_STORAGE;\n            !this.ls && this._noop();\n        }\n        _.mixin(PersistentStorage.prototype, {\n            _prefix: function(key) {\n                return this.prefix + key;\n            },\n            _ttlKey: function(key) {\n                return this._prefix(key) + this.ttlKey;\n            },\n            _noop: function() {\n                this.get = this.set = this.remove = this.clear = this.isExpired = _.noop;\n            },\n            _safeSet: function(key, val) {\n                try {\n                    this.ls.setItem(key, val);\n                } catch (err) {\n                    if (err.name === \"QuotaExceededError\") {\n                        this.clear();\n                        this._noop();\n                    }\n                }\n            },\n            get: function(key) {\n                if (this.isExpired(key)) {\n                    this.remove(key);\n                }\n                return decode(this.ls.getItem(this._prefix(key)));\n            },\n            set: function(key, val, ttl) {\n                if (_.isNumber(ttl)) {\n                    this._safeSet(this._ttlKey(key), encode(now() + ttl));\n                } else {\n                    this.ls.removeItem(this._ttlKey(key));\n                }\n                return this._safeSet(this._prefix(key), encode(val));\n            },\n            remove: function(key) {\n                this.ls.removeItem(this._ttlKey(key));\n                this.ls.removeItem(this._prefix(key));\n                return this;\n            },\n            clear: function() {\n                var i, keys = gatherMatchingKeys(this.keyMatcher);\n                for (i = keys.length; i--; ) {\n                    this.remove(keys[i]);\n                }\n                return this;\n            },\n            isExpired: function(key) {\n                var ttl = decode(this.ls.getItem(this._ttlKey(key)));\n                return _.isNumber(ttl) && now() > ttl ? true : false;\n            }\n        });\n        return PersistentStorage;\n        function now() {\n            return new Date().getTime();\n        }\n        function encode(val) {\n            return JSON.stringify(_.isUndefined(val) ? null : val);\n        }\n        function decode(val) {\n            return $.parseJSON(val);\n        }\n        function gatherMatchingKeys(keyMatcher) {\n            var i, key, keys = [], len = LOCAL_STORAGE.length;\n            for (i = 0; i < len; i++) {\n                if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) {\n                    keys.push(key.replace(keyMatcher, \"\"));\n                }\n            }\n            return keys;\n        }\n    }();\n    var Transport = function() {\n        \"use strict\";\n        var pendingRequestsCount = 0, pendingRequests = {}, sharedCache = new LruCache(10);\n        function Transport(o) {\n            o = o || {};\n            this.maxPendingRequests = o.maxPendingRequests || 6;\n            this.cancelled = false;\n            this.lastReq = null;\n            this._send = o.transport;\n            this._get = o.limiter ? o.limiter(this._get) : this._get;\n            this._cache = o.cache === false ? new LruCache(0) : sharedCache;\n        }\n        Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {\n            this.maxPendingRequests = num;\n        };\n        Transport.resetCache = function resetCache() {\n            sharedCache.reset();\n        };\n        _.mixin(Transport.prototype, {\n            _fingerprint: function fingerprint(o) {\n                o = o || {};\n                return o.url + o.type + $.param(o.data || {});\n            },\n            _get: function(o, cb) {\n                var that = this, fingerprint, jqXhr;\n                fingerprint = this._fingerprint(o);\n                if (this.cancelled || fingerprint !== this.lastReq) {\n                    return;\n                }\n                if (jqXhr = pendingRequests[fingerprint]) {\n                    jqXhr.done(done).fail(fail);\n                } else if (pendingRequestsCount < this.maxPendingRequests) {\n                    pendingRequestsCount++;\n                    pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always);\n                } else {\n                    this.onDeckRequestArgs = [].slice.call(arguments, 0);\n                }\n                function done(resp) {\n                    cb(null, resp);\n                    that._cache.set(fingerprint, resp);\n                }\n                function fail() {\n                    cb(true);\n                }\n                function always() {\n                    pendingRequestsCount--;\n                    delete pendingRequests[fingerprint];\n                    if (that.onDeckRequestArgs) {\n                        that._get.apply(that, that.onDeckRequestArgs);\n                        that.onDeckRequestArgs = null;\n                    }\n                }\n            },\n            get: function(o, cb) {\n                var resp, fingerprint;\n                cb = cb || $.noop;\n                o = _.isString(o) ? {\n                    url: o\n                } : o || {};\n                fingerprint = this._fingerprint(o);\n                this.cancelled = false;\n                this.lastReq = fingerprint;\n                if (resp = this._cache.get(fingerprint)) {\n                    cb(null, resp);\n                } else {\n                    this._get(o, cb);\n                }\n            },\n            cancel: function() {\n                this.cancelled = true;\n            }\n        });\n        return Transport;\n    }();\n    var SearchIndex = window.SearchIndex = function() {\n        \"use strict\";\n        var CHILDREN = \"c\", IDS = \"i\";\n        function SearchIndex(o) {\n            o = o || {};\n            if (!o.datumTokenizer || !o.queryTokenizer) {\n                $.error(\"datumTokenizer and queryTokenizer are both required\");\n            }\n            this.identify = o.identify || _.stringify;\n            this.datumTokenizer = o.datumTokenizer;\n            this.queryTokenizer = o.queryTokenizer;\n            this.matchAnyQueryToken = o.matchAnyQueryToken;\n            this.reset();\n        }\n        _.mixin(SearchIndex.prototype, {\n            bootstrap: function bootstrap(o) {\n                this.datums = o.datums;\n                this.trie = o.trie;\n            },\n            add: function(data) {\n                var that = this;\n                data = _.isArray(data) ? data : [ data ];\n                _.each(data, function(datum) {\n                    var id, tokens;\n                    that.datums[id = that.identify(datum)] = datum;\n                    tokens = normalizeTokens(that.datumTokenizer(datum));\n                    _.each(tokens, function(token) {\n                        var node, chars, ch;\n                        node = that.trie;\n                        chars = token.split(\"\");\n                        while (ch = chars.shift()) {\n                            node = node[CHILDREN][ch] || (node[CHILDREN][ch] = newNode());\n                            node[IDS].push(id);\n                        }\n                    });\n                });\n            },\n            get: function get(ids) {\n                var that = this;\n                return _.map(ids, function(id) {\n                    return that.datums[id];\n                });\n            },\n            search: function search(query) {\n                var that = this, tokens, matches;\n                tokens = normalizeTokens(this.queryTokenizer(query));\n                _.each(tokens, function(token) {\n                    var node, chars, ch, ids;\n                    if (matches && matches.length === 0 && !that.matchAnyQueryToken) {\n                        return false;\n                    }\n                    node = that.trie;\n                    chars = token.split(\"\");\n                    while (node && (ch = chars.shift())) {\n                        node = node[CHILDREN][ch];\n                    }\n                    if (node && chars.length === 0) {\n                        ids = node[IDS].slice(0);\n                        matches = matches ? getIntersection(matches, ids) : ids;\n                    } else {\n                        if (!that.matchAnyQueryToken) {\n                            matches = [];\n                            return false;\n                        }\n                    }\n                });\n                return matches ? _.map(unique(matches), function(id) {\n                    return that.datums[id];\n                }) : [];\n            },\n            all: function all() {\n                var values = [];\n                for (var key in this.datums) {\n                    values.push(this.datums[key]);\n                }\n                return values;\n            },\n            reset: function reset() {\n                this.datums = {};\n                this.trie = newNode();\n            },\n            serialize: function serialize() {\n                return {\n                    datums: this.datums,\n                    trie: this.trie\n                };\n            }\n        });\n        return SearchIndex;\n        function normalizeTokens(tokens) {\n            tokens = _.filter(tokens, function(token) {\n                return !!token;\n            });\n            tokens = _.map(tokens, function(token) {\n                return token.toLowerCase();\n            });\n            return tokens;\n        }\n        function newNode() {\n            var node = {};\n            node[IDS] = [];\n            node[CHILDREN] = {};\n            return node;\n        }\n        function unique(array) {\n            var seen = {}, uniques = [];\n            for (var i = 0, len = array.length; i < len; i++) {\n                if (!seen[array[i]]) {\n                    seen[array[i]] = true;\n                    uniques.push(array[i]);\n                }\n            }\n            return uniques;\n        }\n        function getIntersection(arrayA, arrayB) {\n            var ai = 0, bi = 0, intersection = [];\n            arrayA = arrayA.sort();\n            arrayB = arrayB.sort();\n            var lenArrayA = arrayA.length, lenArrayB = arrayB.length;\n            while (ai < lenArrayA && bi < lenArrayB) {\n                if (arrayA[ai] < arrayB[bi]) {\n                    ai++;\n                } else if (arrayA[ai] > arrayB[bi]) {\n                    bi++;\n                } else {\n                    intersection.push(arrayA[ai]);\n                    ai++;\n                    bi++;\n                }\n            }\n            return intersection;\n        }\n    }();\n    var Prefetch = function() {\n        \"use strict\";\n        var keys;\n        keys = {\n            data: \"data\",\n            protocol: \"protocol\",\n            thumbprint: \"thumbprint\"\n        };\n        function Prefetch(o) {\n            this.url = o.url;\n            this.ttl = o.ttl;\n            this.cache = o.cache;\n            this.prepare = o.prepare;\n            this.transform = o.transform;\n            this.transport = o.transport;\n            this.thumbprint = o.thumbprint;\n            this.storage = new PersistentStorage(o.cacheKey);\n        }\n        _.mixin(Prefetch.prototype, {\n            _settings: function settings() {\n                return {\n                    url: this.url,\n                    type: \"GET\",\n                    dataType: \"json\"\n                };\n            },\n            store: function store(data) {\n                if (!this.cache) {\n                    return;\n                }\n                this.storage.set(keys.data, data, this.ttl);\n                this.storage.set(keys.protocol, location.protocol, this.ttl);\n                this.storage.set(keys.thumbprint, this.thumbprint, this.ttl);\n            },\n            fromCache: function fromCache() {\n                var stored = {}, isExpired;\n                if (!this.cache) {\n                    return null;\n                }\n                stored.data = this.storage.get(keys.data);\n                stored.protocol = this.storage.get(keys.protocol);\n                stored.thumbprint = this.storage.get(keys.thumbprint);\n                isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !== location.protocol;\n                return stored.data && !isExpired ? stored.data : null;\n            },\n            fromNetwork: function(cb) {\n                var that = this, settings;\n                if (!cb) {\n                    return;\n                }\n                settings = this.prepare(this._settings());\n                this.transport(settings).fail(onError).done(onResponse);\n                function onError() {\n                    cb(true);\n                }\n                function onResponse(resp) {\n                    cb(null, that.transform(resp));\n                }\n            },\n            clear: function clear() {\n                this.storage.clear();\n                return this;\n            }\n        });\n        return Prefetch;\n    }();\n    var Remote = function() {\n        \"use strict\";\n        function Remote(o) {\n            this.url = o.url;\n            this.prepare = o.prepare;\n            this.transform = o.transform;\n            this.indexResponse = o.indexResponse;\n            this.transport = new Transport({\n                cache: o.cache,\n                limiter: o.limiter,\n                transport: o.transport,\n                maxPendingRequests: o.maxPendingRequests\n            });\n        }\n        _.mixin(Remote.prototype, {\n            _settings: function settings() {\n                return {\n                    url: this.url,\n                    type: \"GET\",\n                    dataType: \"json\"\n                };\n            },\n            get: function get(query, cb) {\n                var that = this, settings;\n                if (!cb) {\n                    return;\n                }\n                query = query || \"\";\n                settings = this.prepare(query, this._settings());\n                return this.transport.get(settings, onResponse);\n                function onResponse(err, resp) {\n                    err ? cb([]) : cb(that.transform(resp));\n                }\n            },\n            cancelLastRequest: function cancelLastRequest() {\n                this.transport.cancel();\n            }\n        });\n        return Remote;\n    }();\n    var oParser = function() {\n        \"use strict\";\n        return function parse(o) {\n            var defaults, sorter;\n            defaults = {\n                initialize: true,\n                identify: _.stringify,\n                datumTokenizer: null,\n                queryTokenizer: null,\n                matchAnyQueryToken: false,\n                sufficient: 5,\n                indexRemote: false,\n                sorter: null,\n                local: [],\n                prefetch: null,\n                remote: null\n            };\n            o = _.mixin(defaults, o || {});\n            !o.datumTokenizer && $.error(\"datumTokenizer is required\");\n            !o.queryTokenizer && $.error(\"queryTokenizer is required\");\n            sorter = o.sorter;\n            o.sorter = sorter ? function(x) {\n                return x.sort(sorter);\n            } : _.identity;\n            o.local = _.isFunction(o.local) ? o.local() : o.local;\n            o.prefetch = parsePrefetch(o.prefetch);\n            o.remote = parseRemote(o.remote);\n            return o;\n        };\n        function parsePrefetch(o) {\n            var defaults;\n            if (!o) {\n                return null;\n            }\n            defaults = {\n                url: null,\n                ttl: 24 * 60 * 60 * 1e3,\n                cache: true,\n                cacheKey: null,\n                thumbprint: \"\",\n                prepare: _.identity,\n                transform: _.identity,\n                transport: null\n            };\n            o = _.isString(o) ? {\n                url: o\n            } : o;\n            o = _.mixin(defaults, o);\n            !o.url && $.error(\"prefetch requires url to be set\");\n            o.transform = o.filter || o.transform;\n            o.cacheKey = o.cacheKey || o.url;\n            o.thumbprint = VERSION + o.thumbprint;\n            o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;\n            return o;\n        }\n        function parseRemote(o) {\n            var defaults;\n            if (!o) {\n                return;\n            }\n            defaults = {\n                url: null,\n                cache: true,\n                prepare: null,\n                replace: null,\n                wildcard: null,\n                limiter: null,\n                rateLimitBy: \"debounce\",\n                rateLimitWait: 300,\n                transform: _.identity,\n                transport: null\n            };\n            o = _.isString(o) ? {\n                url: o\n            } : o;\n            o = _.mixin(defaults, o);\n            !o.url && $.error(\"remote requires url to be set\");\n            o.transform = o.filter || o.transform;\n            o.prepare = toRemotePrepare(o);\n            o.limiter = toLimiter(o);\n            o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;\n            delete o.replace;\n            delete o.wildcard;\n            delete o.rateLimitBy;\n            delete o.rateLimitWait;\n            return o;\n        }\n        function toRemotePrepare(o) {\n            var prepare, replace, wildcard;\n            prepare = o.prepare;\n            replace = o.replace;\n            wildcard = o.wildcard;\n            if (prepare) {\n                return prepare;\n            }\n            if (replace) {\n                prepare = prepareByReplace;\n            } else if (o.wildcard) {\n                prepare = prepareByWildcard;\n            } else {\n                prepare = identityPrepare;\n            }\n            return prepare;\n            function prepareByReplace(query, settings) {\n                settings.url = replace(settings.url, query);\n                return settings;\n            }\n            function prepareByWildcard(query, settings) {\n                settings.url = settings.url.replace(wildcard, encodeURIComponent(query));\n                return settings;\n            }\n            function identityPrepare(query, settings) {\n                return settings;\n            }\n        }\n        function toLimiter(o) {\n            var limiter, method, wait;\n            limiter = o.limiter;\n            method = o.rateLimitBy;\n            wait = o.rateLimitWait;\n            if (!limiter) {\n                limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait);\n            }\n            return limiter;\n            function debounce(wait) {\n                return function debounce(fn) {\n                    return _.debounce(fn, wait);\n                };\n            }\n            function throttle(wait) {\n                return function throttle(fn) {\n                    return _.throttle(fn, wait);\n                };\n            }\n        }\n        function callbackToDeferred(fn) {\n            return function wrapper(o) {\n                var deferred = $.Deferred();\n                fn(o, onSuccess, onError);\n                return deferred;\n                function onSuccess(resp) {\n                    _.defer(function() {\n                        deferred.resolve(resp);\n                    });\n                }\n                function onError(err) {\n                    _.defer(function() {\n                        deferred.reject(err);\n                    });\n                }\n            };\n        }\n    }();\n    var Bloodhound = function() {\n        \"use strict\";\n        var old;\n        old = window && window.Bloodhound;\n        function Bloodhound(o) {\n            o = oParser(o);\n            this.sorter = o.sorter;\n            this.identify = o.identify;\n            this.sufficient = o.sufficient;\n            this.indexRemote = o.indexRemote;\n            this.local = o.local;\n            this.remote = o.remote ? new Remote(o.remote) : null;\n            this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;\n            this.index = new SearchIndex({\n                identify: this.identify,\n                datumTokenizer: o.datumTokenizer,\n                queryTokenizer: o.queryTokenizer\n            });\n            o.initialize !== false && this.initialize();\n        }\n        Bloodhound.noConflict = function noConflict() {\n            window && (window.Bloodhound = old);\n            return Bloodhound;\n        };\n        Bloodhound.tokenizers = tokenizers;\n        _.mixin(Bloodhound.prototype, {\n            __ttAdapter: function ttAdapter() {\n                var that = this;\n                return this.remote ? withAsync : withoutAsync;\n                function withAsync(query, sync, async) {\n                    return that.search(query, sync, async);\n                }\n                function withoutAsync(query, sync) {\n                    return that.search(query, sync);\n                }\n            },\n            _loadPrefetch: function loadPrefetch() {\n                var that = this, deferred, serialized;\n                deferred = $.Deferred();\n                if (!this.prefetch) {\n                    deferred.resolve();\n                } else if (serialized = this.prefetch.fromCache()) {\n                    this.index.bootstrap(serialized);\n                    deferred.resolve();\n                } else {\n                    this.prefetch.fromNetwork(done);\n                }\n                return deferred.promise();\n                function done(err, data) {\n                    if (err) {\n                        return deferred.reject();\n                    }\n                    that.add(data);\n                    that.prefetch.store(that.index.serialize());\n                    deferred.resolve();\n                }\n            },\n            _initialize: function initialize() {\n                var that = this, deferred;\n                this.clear();\n                (this.initPromise = this._loadPrefetch()).done(addLocalToIndex);\n                return this.initPromise;\n                function addLocalToIndex() {\n                    that.add(that.local);\n                }\n            },\n            initialize: function initialize(force) {\n                return !this.initPromise || force ? this._initialize() : this.initPromise;\n            },\n            add: function add(data) {\n                this.index.add(data);\n                return this;\n            },\n            get: function get(ids) {\n                ids = _.isArray(ids) ? ids : [].slice.call(arguments);\n                return this.index.get(ids);\n            },\n            search: function search(query, sync, async) {\n                var that = this, local;\n                sync = sync || _.noop;\n                async = async || _.noop;\n                local = this.sorter(this.index.search(query));\n                sync(this.remote ? local.slice() : local);\n                if (this.remote && local.length < this.sufficient) {\n                    this.remote.get(query, processRemote);\n                } else if (this.remote) {\n                    this.remote.cancelLastRequest();\n                }\n                return this;\n                function processRemote(remote) {\n                    var nonDuplicates = [];\n                    _.each(remote, function(r) {\n                        !_.some(local, function(l) {\n                            return that.identify(r) === that.identify(l);\n                        }) && nonDuplicates.push(r);\n                    });\n                    that.indexRemote && that.add(nonDuplicates);\n                    async(nonDuplicates);\n                }\n            },\n            all: function all() {\n                return this.index.all();\n            },\n            clear: function clear() {\n                this.index.reset();\n                return this;\n            },\n            clearPrefetchCache: function clearPrefetchCache() {\n                this.prefetch && this.prefetch.clear();\n                return this;\n            },\n            clearRemoteCache: function clearRemoteCache() {\n                Transport.resetCache();\n                return this;\n            },\n            ttAdapter: function ttAdapter() {\n                return this.__ttAdapter();\n            }\n        });\n        return Bloodhound;\n    }();\n    return Bloodhound;\n});\n\n(function(root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define([ \"jquery\" ], function(a0) {\n            return factory(a0);\n        });\n    } else if (typeof module === \"object\" && module.exports) {\n        module.exports = factory(require(\"jquery\"));\n    } else {\n        factory(root[\"jQuery\"]);\n    }\n})(this, function($) {\n    var _ = function() {\n        \"use strict\";\n        return {\n            isMsie: function() {\n                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n            },\n            isBlankString: function(str) {\n                return !str || /^\\s*$/.test(str);\n            },\n            escapeRegExChars: function(str) {\n                return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n            },\n            isString: function(obj) {\n                return typeof obj === \"string\";\n            },\n            isNumber: function(obj) {\n                return typeof obj === \"number\";\n            },\n            isArray: $.isArray,\n            isFunction: $.isFunction,\n            isObject: $.isPlainObject,\n            isUndefined: function(obj) {\n                return typeof obj === \"undefined\";\n            },\n            isElement: function(obj) {\n                return !!(obj && obj.nodeType === 1);\n            },\n            isJQuery: function(obj) {\n                return obj instanceof $;\n            },\n            toStr: function toStr(s) {\n                return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n            },\n            bind: $.proxy,\n            each: function(collection, cb) {\n                $.each(collection, reverseArgs);\n                function reverseArgs(index, value) {\n                    return cb(value, index);\n                }\n            },\n            map: $.map,\n            filter: $.grep,\n            every: function(obj, test) {\n                var result = true;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (!(result = test.call(null, val, key, obj))) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            some: function(obj, test) {\n                var result = false;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (result = test.call(null, val, key, obj)) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            mixin: $.extend,\n            identity: function(x) {\n                return x;\n            },\n            clone: function(obj) {\n                return $.extend(true, {}, obj);\n            },\n            getIdGenerator: function() {\n                var counter = 0;\n                return function() {\n                    return counter++;\n                };\n            },\n            templatify: function templatify(obj) {\n                return $.isFunction(obj) ? obj : template;\n                function template() {\n                    return String(obj);\n                }\n            },\n            defer: function(fn) {\n                setTimeout(fn, 0);\n            },\n            debounce: function(func, wait, immediate) {\n                var timeout, result;\n                return function() {\n                    var context = this, args = arguments, later, callNow;\n                    later = function() {\n                        timeout = null;\n                        if (!immediate) {\n                            result = func.apply(context, args);\n                        }\n                    };\n                    callNow = immediate && !timeout;\n                    clearTimeout(timeout);\n                    timeout = setTimeout(later, wait);\n                    if (callNow) {\n                        result = func.apply(context, args);\n                    }\n                    return result;\n                };\n            },\n            throttle: function(func, wait) {\n                var context, args, timeout, result, previous, later;\n                previous = 0;\n                later = function() {\n                    previous = new Date();\n                    timeout = null;\n                    result = func.apply(context, args);\n                };\n                return function() {\n                    var now = new Date(), remaining = wait - (now - previous);\n                    context = this;\n                    args = arguments;\n                    if (remaining <= 0) {\n                        clearTimeout(timeout);\n                        timeout = null;\n                        previous = now;\n                        result = func.apply(context, args);\n                    } else if (!timeout) {\n                        timeout = setTimeout(later, remaining);\n                    }\n                    return result;\n                };\n            },\n            stringify: function(val) {\n                return _.isString(val) ? val : JSON.stringify(val);\n            },\n            guid: function() {\n                function _p8(s) {\n                    var p = (Math.random().toString(16) + \"000000000\").substr(2, 8);\n                    return s ? \"-\" + p.substr(0, 4) + \"-\" + p.substr(4, 4) : p;\n                }\n                return \"tt-\" + _p8() + _p8(true) + _p8(true) + _p8();\n            },\n            noop: function() {}\n        };\n    }();\n    var WWW = function() {\n        \"use strict\";\n        var defaultClassNames = {\n            wrapper: \"twitter-typeahead\",\n            input: \"tt-input\",\n            hint: \"tt-hint\",\n            menu: \"tt-menu\",\n            dataset: \"tt-dataset\",\n            suggestion: \"tt-suggestion\",\n            selectable: \"tt-selectable\",\n            empty: \"tt-empty\",\n            open: \"tt-open\",\n            cursor: \"tt-cursor\",\n            highlight: \"tt-highlight\"\n        };\n        return build;\n        function build(o) {\n            var www, classes;\n            classes = _.mixin({}, defaultClassNames, o);\n            www = {\n                css: buildCss(),\n                classes: classes,\n                html: buildHtml(classes),\n                selectors: buildSelectors(classes)\n            };\n            return {\n                css: www.css,\n                html: www.html,\n                classes: www.classes,\n                selectors: www.selectors,\n                mixin: function(o) {\n                    _.mixin(o, www);\n                }\n            };\n        }\n        function buildHtml(c) {\n            return {\n                wrapper: '<span class=\"' + c.wrapper + '\"></span>',\n                menu: '<div role=\"listbox\" class=\"' + c.menu + '\"></div>'\n            };\n        }\n        function buildSelectors(classes) {\n            var selectors = {};\n            _.each(classes, function(v, k) {\n                selectors[k] = \".\" + v;\n            });\n            return selectors;\n        }\n        function buildCss() {\n            var css = {\n                wrapper: {\n                    position: \"relative\",\n                    display: \"inline-block\"\n                },\n                hint: {\n                    position: \"absolute\",\n                    top: \"0\",\n                    left: \"0\",\n                    borderColor: \"transparent\",\n                    boxShadow: \"none\",\n                    opacity: \"1\"\n                },\n                input: {\n                    position: \"relative\",\n                    verticalAlign: \"top\",\n                    backgroundColor: \"transparent\"\n                },\n                inputWithNoHint: {\n                    position: \"relative\",\n                    verticalAlign: \"top\"\n                },\n                menu: {\n                    position: \"absolute\",\n                    top: \"100%\",\n                    left: \"0\",\n                    zIndex: \"100\",\n                    display: \"none\"\n                },\n                ltr: {\n                    left: \"0\",\n                    right: \"auto\"\n                },\n                rtl: {\n                    left: \"auto\",\n                    right: \" 0\"\n                }\n            };\n            if (_.isMsie()) {\n                _.mixin(css.input, {\n                    backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\n                });\n            }\n            return css;\n        }\n    }();\n    var EventBus = function() {\n        \"use strict\";\n        var namespace, deprecationMap;\n        namespace = \"typeahead:\";\n        deprecationMap = {\n            render: \"rendered\",\n            cursorchange: \"cursorchanged\",\n            select: \"selected\",\n            autocomplete: \"autocompleted\"\n        };\n        function EventBus(o) {\n            if (!o || !o.el) {\n                $.error(\"EventBus initialized without el\");\n            }\n            this.$el = $(o.el);\n        }\n        _.mixin(EventBus.prototype, {\n            _trigger: function(type, args) {\n                var $e = $.Event(namespace + type);\n                this.$el.trigger.call(this.$el, $e, args || []);\n                return $e;\n            },\n            before: function(type) {\n                var args, $e;\n                args = [].slice.call(arguments, 1);\n                $e = this._trigger(\"before\" + type, args);\n                return $e.isDefaultPrevented();\n            },\n            trigger: function(type) {\n                var deprecatedType;\n                this._trigger(type, [].slice.call(arguments, 1));\n                if (deprecatedType = deprecationMap[type]) {\n                    this._trigger(deprecatedType, [].slice.call(arguments, 1));\n                }\n            }\n        });\n        return EventBus;\n    }();\n    var EventEmitter = function() {\n        \"use strict\";\n        var splitter = /\\s+/, nextTick = getNextTick();\n        return {\n            onSync: onSync,\n            onAsync: onAsync,\n            off: off,\n            trigger: trigger\n        };\n        function on(method, types, cb, context) {\n            var type;\n            if (!cb) {\n                return this;\n            }\n            types = types.split(splitter);\n            cb = context ? bindContext(cb, context) : cb;\n            this._callbacks = this._callbacks || {};\n            while (type = types.shift()) {\n                this._callbacks[type] = this._callbacks[type] || {\n                    sync: [],\n                    async: []\n                };\n                this._callbacks[type][method].push(cb);\n            }\n            return this;\n        }\n        function onAsync(types, cb, context) {\n            return on.call(this, \"async\", types, cb, context);\n        }\n        function onSync(types, cb, context) {\n            return on.call(this, \"sync\", types, cb, context);\n        }\n        function off(types) {\n            var type;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            while (type = types.shift()) {\n                delete this._callbacks[type];\n            }\n            return this;\n        }\n        function trigger(types) {\n            var type, callbacks, args, syncFlush, asyncFlush;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            args = [].slice.call(arguments, 1);\n            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\n                syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\n                asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\n                syncFlush() && nextTick(asyncFlush);\n            }\n            return this;\n        }\n        function getFlush(callbacks, context, args) {\n            return flush;\n            function flush() {\n                var cancelled;\n                for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\n                    cancelled = callbacks[i].apply(context, args) === false;\n                }\n                return !cancelled;\n            }\n        }\n        function getNextTick() {\n            var nextTickFn;\n            if (window.setImmediate) {\n                nextTickFn = function nextTickSetImmediate(fn) {\n                    setImmediate(function() {\n                        fn();\n                    });\n                };\n            } else {\n                nextTickFn = function nextTickSetTimeout(fn) {\n                    setTimeout(function() {\n                        fn();\n                    }, 0);\n                };\n            }\n            return nextTickFn;\n        }\n        function bindContext(fn, context) {\n            return fn.bind ? fn.bind(context) : function() {\n                fn.apply(context, [].slice.call(arguments, 0));\n            };\n        }\n    }();\n    var highlight = function(doc) {\n        \"use strict\";\n        var defaults = {\n            node: null,\n            pattern: null,\n            tagName: \"strong\",\n            className: null,\n            wordsOnly: false,\n            caseSensitive: false,\n            diacriticInsensitive: false\n        };\n        var accented = {\n            A: \"[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Ａａ]\",\n            B: \"[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Ｂｂ]\",\n            C: \"[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Ｃｃ]\",\n            D: \"[DdĎďǄ-ǆǱ-ǳᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Ｄｄ]\",\n            E: \"[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ｅｅ]\",\n            F: \"[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ﬀ-ﬄＦｆ]\",\n            G: \"[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Ｇｇ]\",\n            H: \"[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Ｈｈ]\",\n            I: \"[IiÌ-Ïì-ïĨ-İĲĳǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕ﬁﬃＩｉ]\",\n            J: \"[JjĲ-ĵǇ-ǌǰʲᴶⅉ⒥ⒿⓙⱼＪｊ]\",\n            K: \"[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Ｋｋ]\",\n            L: \"[LlĹ-ŀǇ-ǉˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿ﬂﬄＬｌ]\",\n            M: \"[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Ｍｍ]\",\n            N: \"[NnÑñŃ-ŉǊ-ǌǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Ｎｎ]\",\n            O: \"[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Ｏｏ]\",\n            P: \"[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Ｐｐ]\",\n            Q: \"[Qqℚ⒬Ⓠⓠ㏃Ｑｑ]\",\n            R: \"[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Ｒｒ]\",\n            S: \"[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜ﬆＳｓ]\",\n            T: \"[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ﬅﬆＴｔ]\",\n            U: \"[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Ｕｕ]\",\n            V: \"[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Ｖｖ]\",\n            W: \"[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ｗｗ]\",\n            X: \"[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Ｘｘ]\",\n            Y: \"[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Ｙｙ]\",\n            Z: \"[ZzŹ-žǱ-ǳᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Ｚｚ]\"\n        };\n        return function hightlight(o) {\n            var regex;\n            o = _.mixin({}, defaults, o);\n            if (!o.node || !o.pattern) {\n                return;\n            }\n            o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\n            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive);\n            traverse(o.node, hightlightTextNode);\n            function hightlightTextNode(textNode) {\n                var match, patternNode, wrapperNode;\n                if (match = regex.exec(textNode.data)) {\n                    wrapperNode = doc.createElement(o.tagName);\n                    o.className && (wrapperNode.className = o.className);\n                    patternNode = textNode.splitText(match.index);\n                    patternNode.splitText(match[0].length);\n                    wrapperNode.appendChild(patternNode.cloneNode(true));\n                    textNode.parentNode.replaceChild(wrapperNode, patternNode);\n                }\n                return !!match;\n            }\n            function traverse(el, hightlightTextNode) {\n                var childNode, TEXT_NODE_TYPE = 3;\n                for (var i = 0; i < el.childNodes.length; i++) {\n                    childNode = el.childNodes[i];\n                    if (childNode.nodeType === TEXT_NODE_TYPE) {\n                        i += hightlightTextNode(childNode) ? 1 : 0;\n                    } else {\n                        traverse(childNode, hightlightTextNode);\n                    }\n                }\n            }\n        };\n        function accent_replacer(chr) {\n            return accented[chr.toUpperCase()] || chr;\n        }\n        function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) {\n            var escapedPatterns = [], regexStr;\n            for (var i = 0, len = patterns.length; i < len; i++) {\n                var escapedWord = _.escapeRegExChars(patterns[i]);\n                if (diacriticInsensitive) {\n                    escapedWord = escapedWord.replace(/\\S/g, accent_replacer);\n                }\n                escapedPatterns.push(escapedWord);\n            }\n            regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\n            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\n        }\n    }(window.document);\n    var Input = function() {\n        \"use strict\";\n        var specialKeyCodeMap;\n        specialKeyCodeMap = {\n            9: \"tab\",\n            27: \"esc\",\n            37: \"left\",\n            39: \"right\",\n            13: \"enter\",\n            38: \"up\",\n            40: \"down\"\n        };\n        function Input(o, www) {\n            var id;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"input is missing\");\n            }\n            www.mixin(this);\n            this.$hint = $(o.hint);\n            this.$input = $(o.input);\n            this.$menu = $(o.menu);\n            id = this.$input.attr(\"id\") || _.guid();\n            this.$menu.attr(\"id\", id + \"_listbox\");\n            this.$hint.attr({\n                \"aria-hidden\": true\n            });\n            this.$input.attr({\n                \"aria-owns\": id + \"_listbox\",\n                role: \"combobox\",\n                \"aria-autocomplete\": \"list\",\n                \"aria-expanded\": false\n            });\n            this.query = this.$input.val();\n            this.queryWhenFocused = this.hasFocus() ? this.query : null;\n            this.$overflowHelper = buildOverflowHelper(this.$input);\n            this._checkLanguageDirection();\n            if (this.$hint.length === 0) {\n                this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\n            }\n            this.onSync(\"cursorchange\", this._updateDescendent);\n        }\n        Input.normalizeQuery = function(str) {\n            return _.toStr(str).replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\n        };\n        _.mixin(Input.prototype, EventEmitter, {\n            _onBlur: function onBlur() {\n                this.resetInputValue();\n                this.trigger(\"blurred\");\n            },\n            _onFocus: function onFocus() {\n                this.queryWhenFocused = this.query;\n                this.trigger(\"focused\");\n            },\n            _onKeydown: function onKeydown($e) {\n                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\n                this._managePreventDefault(keyName, $e);\n                if (keyName && this._shouldTrigger(keyName, $e)) {\n                    this.trigger(keyName + \"Keyed\", $e);\n                }\n            },\n            _onInput: function onInput() {\n                this._setQuery(this.getInputValue());\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            _managePreventDefault: function managePreventDefault(keyName, $e) {\n                var preventDefault;\n                switch (keyName) {\n                  case \"up\":\n                  case \"down\":\n                    preventDefault = !withModifier($e);\n                    break;\n\n                  default:\n                    preventDefault = false;\n                }\n                preventDefault && $e.preventDefault();\n            },\n            _shouldTrigger: function shouldTrigger(keyName, $e) {\n                var trigger;\n                switch (keyName) {\n                  case \"tab\":\n                    trigger = !withModifier($e);\n                    break;\n\n                  default:\n                    trigger = true;\n                }\n                return trigger;\n            },\n            _checkLanguageDirection: function checkLanguageDirection() {\n                var dir = (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.$hint.attr(\"dir\", dir);\n                    this.trigger(\"langDirChanged\", dir);\n                }\n            },\n            _setQuery: function setQuery(val, silent) {\n                var areEquivalent, hasDifferentWhitespace;\n                areEquivalent = areQueriesEquivalent(val, this.query);\n                hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;\n                this.query = val;\n                if (!silent && !areEquivalent) {\n                    this.trigger(\"queryChanged\", this.query);\n                } else if (!silent && hasDifferentWhitespace) {\n                    this.trigger(\"whitespaceChanged\", this.query);\n                }\n            },\n            _updateDescendent: function updateDescendent(event, id) {\n                this.$input.attr(\"aria-activedescendant\", id);\n            },\n            bind: function() {\n                var that = this, onBlur, onFocus, onKeydown, onInput;\n                onBlur = _.bind(this._onBlur, this);\n                onFocus = _.bind(this._onFocus, this);\n                onKeydown = _.bind(this._onKeydown, this);\n                onInput = _.bind(this._onInput, this);\n                this.$input.on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\n                if (!_.isMsie() || _.isMsie() > 9) {\n                    this.$input.on(\"input.tt\", onInput);\n                } else {\n                    this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\n                        if (specialKeyCodeMap[$e.which || $e.keyCode]) {\n                            return;\n                        }\n                        _.defer(_.bind(that._onInput, that, $e));\n                    });\n                }\n                return this;\n            },\n            focus: function focus() {\n                this.$input.focus();\n            },\n            blur: function blur() {\n                this.$input.blur();\n            },\n            getLangDir: function getLangDir() {\n                return this.dir;\n            },\n            getQuery: function getQuery() {\n                return this.query || \"\";\n            },\n            setQuery: function setQuery(val, silent) {\n                this.setInputValue(val);\n                this._setQuery(val, silent);\n            },\n            hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {\n                return this.query !== this.queryWhenFocused;\n            },\n            getInputValue: function getInputValue() {\n                return this.$input.val();\n            },\n            setInputValue: function setInputValue(value) {\n                this.$input.val(value);\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            resetInputValue: function resetInputValue() {\n                this.setInputValue(this.query);\n            },\n            getHint: function getHint() {\n                return this.$hint.val();\n            },\n            setHint: function setHint(value) {\n                this.$hint.val(value);\n            },\n            clearHint: function clearHint() {\n                this.setHint(\"\");\n            },\n            clearHintIfInvalid: function clearHintIfInvalid() {\n                var val, hint, valIsPrefixOfHint, isValid;\n                val = this.getInputValue();\n                hint = this.getHint();\n                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\n                isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\n                !isValid && this.clearHint();\n            },\n            hasFocus: function hasFocus() {\n                return this.$input.is(\":focus\");\n            },\n            hasOverflow: function hasOverflow() {\n                var constraint = this.$input.width() - 2;\n                this.$overflowHelper.text(this.getInputValue());\n                return this.$overflowHelper.width() >= constraint;\n            },\n            isCursorAtEnd: function() {\n                var valueLength, selectionStart, range;\n                valueLength = this.$input.val().length;\n                selectionStart = this.$input[0].selectionStart;\n                if (_.isNumber(selectionStart)) {\n                    return selectionStart === valueLength;\n                } else if (document.selection) {\n                    range = document.selection.createRange();\n                    range.moveStart(\"character\", -valueLength);\n                    return valueLength === range.text.length;\n                }\n                return true;\n            },\n            destroy: function destroy() {\n                this.$hint.off(\".tt\");\n                this.$input.off(\".tt\");\n                this.$overflowHelper.remove();\n                this.$hint = this.$input = this.$overflowHelper = $(\"<div>\");\n            },\n            setAriaExpanded: function setAriaExpanded(value) {\n                this.$input.attr(\"aria-expanded\", value);\n            }\n        });\n        return Input;\n        function buildOverflowHelper($input) {\n            return $('<pre aria-hidden=\"true\"></pre>').css({\n                position: \"absolute\",\n                visibility: \"hidden\",\n                whiteSpace: \"pre\",\n                fontFamily: $input.css(\"font-family\"),\n                fontSize: $input.css(\"font-size\"),\n                fontStyle: $input.css(\"font-style\"),\n                fontVariant: $input.css(\"font-variant\"),\n                fontWeight: $input.css(\"font-weight\"),\n                wordSpacing: $input.css(\"word-spacing\"),\n                letterSpacing: $input.css(\"letter-spacing\"),\n                textIndent: $input.css(\"text-indent\"),\n                textRendering: $input.css(\"text-rendering\"),\n                textTransform: $input.css(\"text-transform\")\n            }).insertAfter($input);\n        }\n        function areQueriesEquivalent(a, b) {\n            return Input.normalizeQuery(a) === Input.normalizeQuery(b);\n        }\n        function withModifier($e) {\n            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\n        }\n    }();\n    var Dataset = function() {\n        \"use strict\";\n        var keys, nameGenerator;\n        keys = {\n            dataset: \"tt-selectable-dataset\",\n            val: \"tt-selectable-display\",\n            obj: \"tt-selectable-object\"\n        };\n        nameGenerator = _.getIdGenerator();\n        function Dataset(o, www) {\n            o = o || {};\n            o.templates = o.templates || {};\n            o.templates.notFound = o.templates.notFound || o.templates.empty;\n            if (!o.source) {\n                $.error(\"missing source\");\n            }\n            if (!o.node) {\n                $.error(\"missing node\");\n            }\n            if (o.name && !isValidName(o.name)) {\n                $.error(\"invalid dataset name: \" + o.name);\n            }\n            www.mixin(this);\n            this.highlight = !!o.highlight;\n            this.name = _.toStr(o.name || nameGenerator());\n            this.limit = o.limit || 5;\n            this.displayFn = getDisplayFn(o.display || o.displayKey);\n            this.templates = getTemplates(o.templates, this.displayFn);\n            this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;\n            this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;\n            this._resetLastSuggestion();\n            this.$el = $(o.node).attr(\"role\", \"presentation\").addClass(this.classes.dataset).addClass(this.classes.dataset + \"-\" + this.name);\n        }\n        Dataset.extractData = function extractData(el) {\n            var $el = $(el);\n            if ($el.data(keys.obj)) {\n                return {\n                    dataset: $el.data(keys.dataset) || \"\",\n                    val: $el.data(keys.val) || \"\",\n                    obj: $el.data(keys.obj) || null\n                };\n            }\n            return null;\n        };\n        _.mixin(Dataset.prototype, EventEmitter, {\n            _overwrite: function overwrite(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (this.async && this.templates.pending) {\n                    this._renderPending(query);\n                } else if (!this.async && this.templates.notFound) {\n                    this._renderNotFound(query);\n                } else {\n                    this._empty();\n                }\n                this.trigger(\"rendered\", suggestions, false, this.name);\n            },\n            _append: function append(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length && this.$lastSuggestion.length) {\n                    this._appendSuggestions(query, suggestions);\n                } else if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (!this.$lastSuggestion.length && this.templates.notFound) {\n                    this._renderNotFound(query);\n                }\n                this.trigger(\"rendered\", suggestions, true, this.name);\n            },\n            _renderSuggestions: function renderSuggestions(query, suggestions) {\n                var $fragment;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                this.$lastSuggestion = $fragment.children().last();\n                this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));\n            },\n            _appendSuggestions: function appendSuggestions(query, suggestions) {\n                var $fragment, $lastSuggestion;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                $lastSuggestion = $fragment.children().last();\n                this.$lastSuggestion.after($fragment);\n                this.$lastSuggestion = $lastSuggestion;\n            },\n            _renderPending: function renderPending(query) {\n                var template = this.templates.pending;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _renderNotFound: function renderNotFound(query) {\n                var template = this.templates.notFound;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _empty: function empty() {\n                this.$el.empty();\n                this._resetLastSuggestion();\n            },\n            _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {\n                var that = this, fragment;\n                fragment = document.createDocumentFragment();\n                _.each(suggestions, function getSuggestionNode(suggestion) {\n                    var $el, context;\n                    context = that._injectQuery(query, suggestion);\n                    $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + \" \" + that.classes.selectable);\n                    fragment.appendChild($el[0]);\n                });\n                this.highlight && highlight({\n                    className: this.classes.highlight,\n                    node: fragment,\n                    pattern: query\n                });\n                return $(fragment);\n            },\n            _getFooter: function getFooter(query, suggestions) {\n                return this.templates.footer ? this.templates.footer({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _getHeader: function getHeader(query, suggestions) {\n                return this.templates.header ? this.templates.header({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _resetLastSuggestion: function resetLastSuggestion() {\n                this.$lastSuggestion = $();\n            },\n            _injectQuery: function injectQuery(query, obj) {\n                return _.isObject(obj) ? _.mixin({\n                    _query: query\n                }, obj) : obj;\n            },\n            update: function update(query) {\n                var that = this, canceled = false, syncCalled = false, rendered = 0;\n                this.cancel();\n                this.cancel = function cancel() {\n                    canceled = true;\n                    that.cancel = $.noop;\n                    that.async && that.trigger(\"asyncCanceled\", query, that.name);\n                };\n                this.source(query, sync, async);\n                !syncCalled && sync([]);\n                function sync(suggestions) {\n                    if (syncCalled) {\n                        return;\n                    }\n                    syncCalled = true;\n                    suggestions = (suggestions || []).slice(0, that.limit);\n                    rendered = suggestions.length;\n                    that._overwrite(query, suggestions);\n                    if (rendered < that.limit && that.async) {\n                        that.trigger(\"asyncRequested\", query, that.name);\n                    }\n                }\n                function async(suggestions) {\n                    suggestions = suggestions || [];\n                    if (!canceled && rendered < that.limit) {\n                        that.cancel = $.noop;\n                        var idx = Math.abs(rendered - that.limit);\n                        rendered += idx;\n                        that._append(query, suggestions.slice(0, idx));\n                        that.async && that.trigger(\"asyncReceived\", query, that.name);\n                    }\n                }\n            },\n            cancel: $.noop,\n            clear: function clear() {\n                this._empty();\n                this.cancel();\n                this.trigger(\"cleared\");\n            },\n            isEmpty: function isEmpty() {\n                return this.$el.is(\":empty\");\n            },\n            destroy: function destroy() {\n                this.$el = $(\"<div>\");\n            }\n        });\n        return Dataset;\n        function getDisplayFn(display) {\n            display = display || _.stringify;\n            return _.isFunction(display) ? display : displayFn;\n            function displayFn(obj) {\n                return obj[display];\n            }\n        }\n        function getTemplates(templates, displayFn) {\n            return {\n                notFound: templates.notFound && _.templatify(templates.notFound),\n                pending: templates.pending && _.templatify(templates.pending),\n                header: templates.header && _.templatify(templates.header),\n                footer: templates.footer && _.templatify(templates.footer),\n                suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate\n            };\n            function userSuggestionTemplate(context) {\n                var template = templates.suggestion;\n                return $(template(context)).attr(\"id\", _.guid());\n            }\n            function suggestionTemplate(context) {\n                return $('<div role=\"option\">').attr(\"id\", _.guid()).text(displayFn(context));\n            }\n        }\n        function isValidName(str) {\n            return /^[_a-zA-Z0-9-]+$/.test(str);\n        }\n    }();\n    var Menu = function() {\n        \"use strict\";\n        function Menu(o, www) {\n            var that = this;\n            o = o || {};\n            if (!o.node) {\n                $.error(\"node is required\");\n            }\n            www.mixin(this);\n            this.$node = $(o.node);\n            this.query = null;\n            this.datasets = _.map(o.datasets, initializeDataset);\n            function initializeDataset(oDataset) {\n                var node = that.$node.find(oDataset.node).first();\n                oDataset.node = node.length ? node : $(\"<div>\").appendTo(that.$node);\n                return new Dataset(oDataset, www);\n            }\n        }\n        _.mixin(Menu.prototype, EventEmitter, {\n            _onSelectableClick: function onSelectableClick($e) {\n                this.trigger(\"selectableClicked\", $($e.currentTarget));\n            },\n            _onRendered: function onRendered(type, dataset, suggestions, async) {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetRendered\", dataset, suggestions, async);\n            },\n            _onCleared: function onCleared() {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetCleared\");\n            },\n            _propagate: function propagate() {\n                this.trigger.apply(this, arguments);\n            },\n            _allDatasetsEmpty: function allDatasetsEmpty() {\n                return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) {\n                    var isEmpty = dataset.isEmpty();\n                    this.$node.attr(\"aria-expanded\", !isEmpty);\n                    return isEmpty;\n                }, this));\n            },\n            _getSelectables: function getSelectables() {\n                return this.$node.find(this.selectors.selectable);\n            },\n            _removeCursor: function _removeCursor() {\n                var $selectable = this.getActiveSelectable();\n                $selectable && $selectable.removeClass(this.classes.cursor);\n            },\n            _ensureVisible: function ensureVisible($el) {\n                var elTop, elBottom, nodeScrollTop, nodeHeight;\n                elTop = $el.position().top;\n                elBottom = elTop + $el.outerHeight(true);\n                nodeScrollTop = this.$node.scrollTop();\n                nodeHeight = this.$node.height() + parseInt(this.$node.css(\"paddingTop\"), 10) + parseInt(this.$node.css(\"paddingBottom\"), 10);\n                if (elTop < 0) {\n                    this.$node.scrollTop(nodeScrollTop + elTop);\n                } else if (nodeHeight < elBottom) {\n                    this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));\n                }\n            },\n            bind: function() {\n                var that = this, onSelectableClick;\n                onSelectableClick = _.bind(this._onSelectableClick, this);\n                this.$node.on(\"click.tt\", this.selectors.selectable, onSelectableClick);\n                this.$node.on(\"mouseover\", this.selectors.selectable, function() {\n                    that.setCursor($(this));\n                });\n                this.$node.on(\"mouseleave\", function() {\n                    that._removeCursor();\n                });\n                _.each(this.datasets, function(dataset) {\n                    dataset.onSync(\"asyncRequested\", that._propagate, that).onSync(\"asyncCanceled\", that._propagate, that).onSync(\"asyncReceived\", that._propagate, that).onSync(\"rendered\", that._onRendered, that).onSync(\"cleared\", that._onCleared, that);\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                return this.$node.hasClass(this.classes.open);\n            },\n            open: function open() {\n                this.$node.scrollTop(0);\n                this.$node.addClass(this.classes.open);\n            },\n            close: function close() {\n                this.$node.attr(\"aria-expanded\", false);\n                this.$node.removeClass(this.classes.open);\n                this._removeCursor();\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.attr(\"dir\", dir);\n            },\n            selectableRelativeToCursor: function selectableRelativeToCursor(delta) {\n                var $selectables, $oldCursor, oldIndex, newIndex;\n                $oldCursor = this.getActiveSelectable();\n                $selectables = this._getSelectables();\n                oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;\n                newIndex = oldIndex + delta;\n                newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;\n                newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;\n                return newIndex === -1 ? null : $selectables.eq(newIndex);\n            },\n            setCursor: function setCursor($selectable) {\n                this._removeCursor();\n                if ($selectable = $selectable && $selectable.first()) {\n                    $selectable.addClass(this.classes.cursor);\n                    this._ensureVisible($selectable);\n                }\n            },\n            getSelectableData: function getSelectableData($el) {\n                return $el && $el.length ? Dataset.extractData($el) : null;\n            },\n            getActiveSelectable: function getActiveSelectable() {\n                var $selectable = this._getSelectables().filter(this.selectors.cursor).first();\n                return $selectable.length ? $selectable : null;\n            },\n            getTopSelectable: function getTopSelectable() {\n                var $selectable = this._getSelectables().first();\n                return $selectable.length ? $selectable : null;\n            },\n            update: function update(query) {\n                var isValidUpdate = query !== this.query;\n                if (isValidUpdate) {\n                    this.query = query;\n                    _.each(this.datasets, updateDataset);\n                }\n                return isValidUpdate;\n                function updateDataset(dataset) {\n                    dataset.update(query);\n                }\n            },\n            empty: function empty() {\n                _.each(this.datasets, clearDataset);\n                this.query = null;\n                this.$node.addClass(this.classes.empty);\n                function clearDataset(dataset) {\n                    dataset.clear();\n                }\n            },\n            destroy: function destroy() {\n                this.$node.off(\".tt\");\n                this.$node = $(\"<div>\");\n                _.each(this.datasets, destroyDataset);\n                function destroyDataset(dataset) {\n                    dataset.destroy();\n                }\n            }\n        });\n        return Menu;\n    }();\n    var Status = function() {\n        \"use strict\";\n        function Status(options) {\n            this.$el = $(\"<span></span>\", {\n                role: \"status\",\n                \"aria-live\": \"polite\"\n            }).css({\n                position: \"absolute\",\n                padding: \"0\",\n                border: \"0\",\n                height: \"1px\",\n                width: \"1px\",\n                \"margin-bottom\": \"-1px\",\n                \"margin-right\": \"-1px\",\n                overflow: \"hidden\",\n                clip: \"rect(0 0 0 0)\",\n                \"white-space\": \"nowrap\"\n            });\n            options.$input.after(this.$el);\n            _.each(options.menu.datasets, _.bind(function(dataset) {\n                if (dataset.onSync) {\n                    dataset.onSync(\"rendered\", _.bind(this.update, this));\n                    dataset.onSync(\"cleared\", _.bind(this.cleared, this));\n                }\n            }, this));\n        }\n        _.mixin(Status.prototype, {\n            update: function update(event, suggestions) {\n                var length = suggestions.length;\n                var words;\n                if (length === 1) {\n                    words = {\n                        result: \"result\",\n                        is: \"is\"\n                    };\n                } else {\n                    words = {\n                        result: \"results\",\n                        is: \"are\"\n                    };\n                }\n                this.$el.text(length + \" \" + words.result + \" \" + words.is + \" available, use up and down arrow keys to navigate.\");\n            },\n            cleared: function() {\n                this.$el.text(\"\");\n            }\n        });\n        return Status;\n    }();\n    var DefaultMenu = function() {\n        \"use strict\";\n        var s = Menu.prototype;\n        function DefaultMenu() {\n            Menu.apply(this, [].slice.call(arguments, 0));\n        }\n        _.mixin(DefaultMenu.prototype, Menu.prototype, {\n            open: function open() {\n                !this._allDatasetsEmpty() && this._show();\n                return s.open.apply(this, [].slice.call(arguments, 0));\n            },\n            close: function close() {\n                this._hide();\n                return s.close.apply(this, [].slice.call(arguments, 0));\n            },\n            _onRendered: function onRendered() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onRendered.apply(this, [].slice.call(arguments, 0));\n            },\n            _onCleared: function onCleared() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onCleared.apply(this, [].slice.call(arguments, 0));\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.css(dir === \"ltr\" ? this.css.ltr : this.css.rtl);\n                return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));\n            },\n            _hide: function hide() {\n                this.$node.hide();\n            },\n            _show: function show() {\n                this.$node.css(\"display\", \"block\");\n            }\n        });\n        return DefaultMenu;\n    }();\n    var Typeahead = function() {\n        \"use strict\";\n        function Typeahead(o, www) {\n            var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"missing input\");\n            }\n            if (!o.menu) {\n                $.error(\"missing menu\");\n            }\n            if (!o.eventBus) {\n                $.error(\"missing event bus\");\n            }\n            www.mixin(this);\n            this.eventBus = o.eventBus;\n            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\n            this.input = o.input;\n            this.menu = o.menu;\n            this.enabled = true;\n            this.autoselect = !!o.autoselect;\n            this.active = false;\n            this.input.hasFocus() && this.activate();\n            this.dir = this.input.getLangDir();\n            this._hacks();\n            this.menu.bind().onSync(\"selectableClicked\", this._onSelectableClicked, this).onSync(\"asyncRequested\", this._onAsyncRequested, this).onSync(\"asyncCanceled\", this._onAsyncCanceled, this).onSync(\"asyncReceived\", this._onAsyncReceived, this).onSync(\"datasetRendered\", this._onDatasetRendered, this).onSync(\"datasetCleared\", this._onDatasetCleared, this);\n            onFocused = c(this, \"activate\", \"open\", \"_onFocused\");\n            onBlurred = c(this, \"deactivate\", \"_onBlurred\");\n            onEnterKeyed = c(this, \"isActive\", \"isOpen\", \"_onEnterKeyed\");\n            onTabKeyed = c(this, \"isActive\", \"isOpen\", \"_onTabKeyed\");\n            onEscKeyed = c(this, \"isActive\", \"_onEscKeyed\");\n            onUpKeyed = c(this, \"isActive\", \"open\", \"_onUpKeyed\");\n            onDownKeyed = c(this, \"isActive\", \"open\", \"_onDownKeyed\");\n            onLeftKeyed = c(this, \"isActive\", \"isOpen\", \"_onLeftKeyed\");\n            onRightKeyed = c(this, \"isActive\", \"isOpen\", \"_onRightKeyed\");\n            onQueryChanged = c(this, \"_openIfActive\", \"_onQueryChanged\");\n            onWhitespaceChanged = c(this, \"_openIfActive\", \"_onWhitespaceChanged\");\n            this.input.bind().onSync(\"focused\", onFocused, this).onSync(\"blurred\", onBlurred, this).onSync(\"enterKeyed\", onEnterKeyed, this).onSync(\"tabKeyed\", onTabKeyed, this).onSync(\"escKeyed\", onEscKeyed, this).onSync(\"upKeyed\", onUpKeyed, this).onSync(\"downKeyed\", onDownKeyed, this).onSync(\"leftKeyed\", onLeftKeyed, this).onSync(\"rightKeyed\", onRightKeyed, this).onSync(\"queryChanged\", onQueryChanged, this).onSync(\"whitespaceChanged\", onWhitespaceChanged, this).onSync(\"langDirChanged\", this._onLangDirChanged, this);\n        }\n        _.mixin(Typeahead.prototype, {\n            _hacks: function hacks() {\n                var $input, $menu;\n                $input = this.input.$input || $(\"<div>\");\n                $menu = this.menu.$node || $(\"<div>\");\n                $input.on(\"blur.tt\", function($e) {\n                    var active, isActive, hasActive;\n                    active = document.activeElement;\n                    isActive = $menu.is(active);\n                    hasActive = $menu.has(active).length > 0;\n                    if (_.isMsie() && (isActive || hasActive)) {\n                        $e.preventDefault();\n                        $e.stopImmediatePropagation();\n                        _.defer(function() {\n                            $input.focus();\n                        });\n                    }\n                });\n                $menu.on(\"mousedown.tt\", function($e) {\n                    $e.preventDefault();\n                });\n            },\n            _onSelectableClicked: function onSelectableClicked(type, $el) {\n                this.select($el);\n            },\n            _onDatasetCleared: function onDatasetCleared() {\n                this._updateHint();\n            },\n            _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) {\n                this._updateHint();\n                if (this.autoselect) {\n                    var cursorClass = this.selectors.cursor.substr(1);\n                    this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass);\n                }\n                this.eventBus.trigger(\"render\", suggestions, async, dataset);\n            },\n            _onAsyncRequested: function onAsyncRequested(type, dataset, query) {\n                this.eventBus.trigger(\"asyncrequest\", query, dataset);\n            },\n            _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {\n                this.eventBus.trigger(\"asynccancel\", query, dataset);\n            },\n            _onAsyncReceived: function onAsyncReceived(type, dataset, query) {\n                this.eventBus.trigger(\"asyncreceive\", query, dataset);\n            },\n            _onFocused: function onFocused() {\n                this._minLengthMet() && this.menu.update(this.input.getQuery());\n            },\n            _onBlurred: function onBlurred() {\n                if (this.input.hasQueryChangedSinceLastFocus()) {\n                    this.eventBus.trigger(\"change\", this.input.getQuery());\n                }\n            },\n            _onEnterKeyed: function onEnterKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    if (this.select($selectable)) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                } else if (this.autoselect) {\n                    if (this.select(this.menu.getTopSelectable())) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                }\n            },\n            _onTabKeyed: function onTabKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    this.select($selectable) && $e.preventDefault();\n                } else if (this.autoselect) {\n                    if ($selectable = this.menu.getTopSelectable()) {\n                        this.autocomplete($selectable) && $e.preventDefault();\n                    }\n                }\n            },\n            _onEscKeyed: function onEscKeyed() {\n                this.close();\n            },\n            _onUpKeyed: function onUpKeyed() {\n                this.moveCursor(-1);\n            },\n            _onDownKeyed: function onDownKeyed() {\n                this.moveCursor(+1);\n            },\n            _onLeftKeyed: function onLeftKeyed() {\n                if (this.dir === \"rtl\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onRightKeyed: function onRightKeyed() {\n                if (this.dir === \"ltr\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onQueryChanged: function onQueryChanged(e, query) {\n                this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();\n            },\n            _onWhitespaceChanged: function onWhitespaceChanged() {\n                this._updateHint();\n            },\n            _onLangDirChanged: function onLangDirChanged(e, dir) {\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.menu.setLanguageDirection(dir);\n                }\n            },\n            _openIfActive: function openIfActive() {\n                this.isActive() && this.open();\n            },\n            _minLengthMet: function minLengthMet(query) {\n                query = _.isString(query) ? query : this.input.getQuery() || \"\";\n                return query.length >= this.minLength;\n            },\n            _updateHint: function updateHint() {\n                var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;\n                $selectable = this.menu.getTopSelectable();\n                data = this.menu.getSelectableData($selectable);\n                val = this.input.getInputValue();\n                if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {\n                    query = Input.normalizeQuery(val);\n                    escapedQuery = _.escapeRegExChars(query);\n                    frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\n                    match = frontMatchRegEx.exec(data.val);\n                    match && this.input.setHint(val + match[1]);\n                } else {\n                    this.input.clearHint();\n                }\n            },\n            isEnabled: function isEnabled() {\n                return this.enabled;\n            },\n            enable: function enable() {\n                this.enabled = true;\n            },\n            disable: function disable() {\n                this.enabled = false;\n            },\n            isActive: function isActive() {\n                return this.active;\n            },\n            activate: function activate() {\n                if (this.isActive()) {\n                    return true;\n                } else if (!this.isEnabled() || this.eventBus.before(\"active\")) {\n                    return false;\n                } else {\n                    this.active = true;\n                    this.eventBus.trigger(\"active\");\n                    return true;\n                }\n            },\n            deactivate: function deactivate() {\n                if (!this.isActive()) {\n                    return true;\n                } else if (this.eventBus.before(\"idle\")) {\n                    return false;\n                } else {\n                    this.active = false;\n                    this.close();\n                    this.eventBus.trigger(\"idle\");\n                    return true;\n                }\n            },\n            isOpen: function isOpen() {\n                return this.menu.isOpen();\n            },\n            open: function open() {\n                if (!this.isOpen() && !this.eventBus.before(\"open\")) {\n                    this.input.setAriaExpanded(true);\n                    this.menu.open();\n                    this._updateHint();\n                    this.eventBus.trigger(\"open\");\n                }\n                return this.isOpen();\n            },\n            close: function close() {\n                if (this.isOpen() && !this.eventBus.before(\"close\")) {\n                    this.input.setAriaExpanded(false);\n                    this.menu.close();\n                    this.input.clearHint();\n                    this.input.resetInputValue();\n                    this.eventBus.trigger(\"close\");\n                }\n                return !this.isOpen();\n            },\n            setVal: function setVal(val) {\n                this.input.setQuery(_.toStr(val));\n            },\n            getVal: function getVal() {\n                return this.input.getQuery();\n            },\n            select: function select($selectable) {\n                var data = this.menu.getSelectableData($selectable);\n                if (data && !this.eventBus.before(\"select\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val, true);\n                    this.eventBus.trigger(\"select\", data.obj, data.dataset);\n                    this.close();\n                    return true;\n                }\n                return false;\n            },\n            autocomplete: function autocomplete($selectable) {\n                var query, data, isValid;\n                query = this.input.getQuery();\n                data = this.menu.getSelectableData($selectable);\n                isValid = data && query !== data.val;\n                if (isValid && !this.eventBus.before(\"autocomplete\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val);\n                    this.eventBus.trigger(\"autocomplete\", data.obj, data.dataset);\n                    return true;\n                }\n                return false;\n            },\n            moveCursor: function moveCursor(delta) {\n                var query, $candidate, data, suggestion, datasetName, cancelMove, id;\n                query = this.input.getQuery();\n                $candidate = this.menu.selectableRelativeToCursor(delta);\n                data = this.menu.getSelectableData($candidate);\n                suggestion = data ? data.obj : null;\n                datasetName = data ? data.dataset : null;\n                id = $candidate ? $candidate.attr(\"id\") : null;\n                this.input.trigger(\"cursorchange\", id);\n                cancelMove = this._minLengthMet() && this.menu.update(query);\n                if (!cancelMove && !this.eventBus.before(\"cursorchange\", suggestion, datasetName)) {\n                    this.menu.setCursor($candidate);\n                    if (data) {\n                        if (typeof data.val === \"string\") {\n                            this.input.setInputValue(data.val);\n                        }\n                    } else {\n                        this.input.resetInputValue();\n                        this._updateHint();\n                    }\n                    this.eventBus.trigger(\"cursorchange\", suggestion, datasetName);\n                    return true;\n                }\n                return false;\n            },\n            destroy: function destroy() {\n                this.input.destroy();\n                this.menu.destroy();\n            }\n        });\n        return Typeahead;\n        function c(ctx) {\n            var methods = [].slice.call(arguments, 1);\n            return function() {\n                var args = [].slice.call(arguments);\n                _.each(methods, function(method) {\n                    return ctx[method].apply(ctx, args);\n                });\n            };\n        }\n    }();\n    (function() {\n        \"use strict\";\n        var old, keys, methods;\n        old = $.fn.typeahead;\n        keys = {\n            www: \"tt-www\",\n            attrs: \"tt-attrs\",\n            typeahead: \"tt-typeahead\"\n        };\n        methods = {\n            initialize: function initialize(o, datasets) {\n                var www;\n                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\n                o = o || {};\n                www = WWW(o.classNames);\n                return this.each(attach);\n                function attach() {\n                    var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor;\n                    _.each(datasets, function(d) {\n                        d.highlight = !!o.highlight;\n                    });\n                    $input = $(this);\n                    $wrapper = $(www.html.wrapper);\n                    $hint = $elOrNull(o.hint);\n                    $menu = $elOrNull(o.menu);\n                    defaultHint = o.hint !== false && !$hint;\n                    defaultMenu = o.menu !== false && !$menu;\n                    defaultHint && ($hint = buildHintFromInput($input, www));\n                    defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));\n                    $hint && $hint.val(\"\");\n                    $input = prepInput($input, www);\n                    if (defaultHint || defaultMenu) {\n                        $wrapper.css(www.css.wrapper);\n                        $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);\n                        $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);\n                    }\n                    MenuConstructor = defaultMenu ? DefaultMenu : Menu;\n                    eventBus = new EventBus({\n                        el: $input\n                    });\n                    input = new Input({\n                        hint: $hint,\n                        input: $input,\n                        menu: $menu\n                    }, www);\n                    menu = new MenuConstructor({\n                        node: $menu,\n                        datasets: datasets\n                    }, www);\n                    status = new Status({\n                        $input: $input,\n                        menu: menu\n                    });\n                    typeahead = new Typeahead({\n                        input: input,\n                        menu: menu,\n                        eventBus: eventBus,\n                        minLength: o.minLength,\n                        autoselect: o.autoselect\n                    }, www);\n                    $input.data(keys.www, www);\n                    $input.data(keys.typeahead, typeahead);\n                }\n            },\n            isEnabled: function isEnabled() {\n                var enabled;\n                ttEach(this.first(), function(t) {\n                    enabled = t.isEnabled();\n                });\n                return enabled;\n            },\n            enable: function enable() {\n                ttEach(this, function(t) {\n                    t.enable();\n                });\n                return this;\n            },\n            disable: function disable() {\n                ttEach(this, function(t) {\n                    t.disable();\n                });\n                return this;\n            },\n            isActive: function isActive() {\n                var active;\n                ttEach(this.first(), function(t) {\n                    active = t.isActive();\n                });\n                return active;\n            },\n            activate: function activate() {\n                ttEach(this, function(t) {\n                    t.activate();\n                });\n                return this;\n            },\n            deactivate: function deactivate() {\n                ttEach(this, function(t) {\n                    t.deactivate();\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                var open;\n                ttEach(this.first(), function(t) {\n                    open = t.isOpen();\n                });\n                return open;\n            },\n            open: function open() {\n                ttEach(this, function(t) {\n                    t.open();\n                });\n                return this;\n            },\n            close: function close() {\n                ttEach(this, function(t) {\n                    t.close();\n                });\n                return this;\n            },\n            select: function select(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.select($el);\n                });\n                return success;\n            },\n            autocomplete: function autocomplete(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.autocomplete($el);\n                });\n                return success;\n            },\n            moveCursor: function moveCursoe(delta) {\n                var success = false;\n                ttEach(this.first(), function(t) {\n                    success = t.moveCursor(delta);\n                });\n                return success;\n            },\n            val: function val(newVal) {\n                var query;\n                if (!arguments.length) {\n                    ttEach(this.first(), function(t) {\n                        query = t.getVal();\n                    });\n                    return query;\n                } else {\n                    ttEach(this, function(t) {\n                        t.setVal(_.toStr(newVal));\n                    });\n                    return this;\n                }\n            },\n            destroy: function destroy() {\n                ttEach(this, function(typeahead, $input) {\n                    revert($input);\n                    typeahead.destroy();\n                });\n                return this;\n            }\n        };\n        $.fn.typeahead = function(method) {\n            if (methods[method]) {\n                return methods[method].apply(this, [].slice.call(arguments, 1));\n            } else {\n                return methods.initialize.apply(this, arguments);\n            }\n        };\n        $.fn.typeahead.noConflict = function noConflict() {\n            $.fn.typeahead = old;\n            return this;\n        };\n        function ttEach($els, fn) {\n            $els.each(function() {\n                var $input = $(this), typeahead;\n                (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);\n            });\n        }\n        function buildHintFromInput($input, www) {\n            return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({\n                readonly: true,\n                required: false\n            }).removeAttr(\"id name placeholder\").removeClass(\"required\").attr({\n                spellcheck: \"false\",\n                tabindex: -1\n            });\n        }\n        function prepInput($input, www) {\n            $input.data(keys.attrs, {\n                dir: $input.attr(\"dir\"),\n                autocomplete: $input.attr(\"autocomplete\"),\n                spellcheck: $input.attr(\"spellcheck\"),\n                style: $input.attr(\"style\")\n            });\n            $input.addClass(www.classes.input).attr({\n                spellcheck: false\n            });\n            try {\n                !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\n            } catch (e) {}\n            return $input;\n        }\n        function getBackgroundStyles($el) {\n            return {\n                backgroundAttachment: $el.css(\"background-attachment\"),\n                backgroundClip: $el.css(\"background-clip\"),\n                backgroundColor: $el.css(\"background-color\"),\n                backgroundImage: $el.css(\"background-image\"),\n                backgroundOrigin: $el.css(\"background-origin\"),\n                backgroundPosition: $el.css(\"background-position\"),\n                backgroundRepeat: $el.css(\"background-repeat\"),\n                backgroundSize: $el.css(\"background-size\")\n            };\n        }\n        function revert($input) {\n            var www, $wrapper;\n            www = $input.data(keys.www);\n            $wrapper = $input.parent().filter(www.selectors.wrapper);\n            _.each($input.data(keys.attrs), function(val, key) {\n                _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\n            });\n            $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);\n            if ($wrapper.length) {\n                $input.detach().insertAfter($wrapper);\n                $wrapper.remove();\n            }\n        }\n        function $elOrNull(obj) {\n            var isValid, $el;\n            isValid = _.isJQuery(obj) || _.isElement(obj);\n            $el = isValid ? $(obj).first() : [];\n            return $el.length ? $el : null;\n        }\n    })();\n});","/*\n * Chained - jQuery / Zepto chained selects plugin\n *\n * Copyright (c) 2010-2017 Mika Tuupola\n *\n * Licensed under the MIT license:\n *   http://www.opensource.org/licenses/mit-license.php\n *\n * Project home:\n *   http://www.appelsiini.net/projects/chained\n *\n * Version: 1.0.1\n *\n */\n\n;(function($, window, document, undefined) {\n    \"use strict\";\n\n    $.fn.remoteChained = function(options) {\n\n        var settings = $.extend({}, $.fn.remoteChained.defaults, options);\n\n        /* Loading text always clears the select. */\n        if (settings.loading) {\n            settings.clear = true;\n        }\n\n        return this.each(function() {\n\n            /* Save this to self because this changes when scope changes. */\n            var self = this;\n            var request = false; /* Track xhr requests. */\n\n            $(settings.parents).each(function() {\n                $(this).bind(\"change\", function() {\n\n                    /* Build data array from parents values. */\n                    var data = {};\n                    $(settings.parents).each(function() {\n                        var id = $(this).attr(settings.attribute);\n                        var value = ($(this).is(\"select\") ? $(\":selected\", this) : $(this)).val();\n                        data[id] = value;\n\n                        /* Optionally also depend on values from these inputs. */\n                        if (settings.depends) {\n                            $(settings.depends).each(function() {\n                                /* Do not include own value. */\n                                if (self !== this) {\n                                    var id = $(this).attr(settings.attribute);\n                                    var value = $(this).val();\n                                    data[id] = value;\n                                }\n                            });\n                        }\n                    });\n\n                    /* If previous request running, abort it. */\n                    /* TODO: Probably should use Sinon to test this. */\n                    if (request && $.isFunction(request.abort)) {\n                        request.abort();\n                        request = false;\n                    }\n\n                    if (settings.clear) {\n                        if (settings.loading) {\n                            /* Clear the select and show loading text. */\n                            build.call(self, {\"\" : settings.loading});\n                        } else {\n                            /* Clear the select. */\n                            $(\"option\", self).remove();\n                        }\n\n                        /* Force updating the children to clear too. */\n                        $(self).trigger(\"change\");\n                    }\n\n                    request = $.getJSON(settings.url, data, function(json) {\n                        build.call(self, json);\n                        /* Force updating the children. */\n                        $(self).trigger(\"change\");\n                    });\n                });\n\n                /* If we have bootstrapped data given in options. */\n                if (settings.bootstrap) {\n                     build.call(self, settings.bootstrap);\n                     settings.bootstrap = null;\n                 }\n            });\n\n            /* Build the select from given data. */\n            function build(json) {\n                /* If select already had something selected, preserve it. */\n                var selected_key = $(\":selected\", self).val();\n\n                /* Clear the select. */\n                $(\"option\", self).remove();\n\n                var option_list = [];\n                if ($.isArray(json)) {\n                    if ($.isArray(json[0])) {\n                        /* JSON is already an array of arrays. */\n                        /* [[\"\",\"--\"],[\"series-1\",\"1 series\"],[\"series-3\",\"3 series\"]] */\n                        option_list = json;\n                    } else {\n                        /* JSON is an array of objects. */\n                        /* [{\"\":\"--\"},{\"series-1\":\"1 series\"},{\"series-3\":\"3 series\"}] */\n                        option_list = $.map(json, function(value) {\n                            return $.map(value, function(value, index) {\n                                return [[index, value]];\n                            });\n                        });\n                    }\n                } else {\n                    /* JSON is an JavaScript object. Rebuild it as an array. */\n                    /* {\"\":\"--\",\"series-1\":\"1 series\",\"series-3\":\"3 series\"} */\n                    for (var index in json) {\n                        if (json.hasOwnProperty(index)) {\n                            option_list.push([index, json[index]]);\n                        }\n                    }\n                }\n\n                /* Add new options from json. */\n                for (var i=0; i!==option_list.length; i++) {\n                    var key = option_list[i][0];\n                    var value = option_list[i][1];\n\n                    /* Set the selected option from JSON. */\n                    if (\"selected\" === key) {\n                        selected_key = value;\n                        continue;\n                    }\n                    var option = $(\"<option />\").val(key).append(value);\n                    $(self).append(option);\n                }\n\n                /* Loop option again to set selected. IE needed this... */\n                $(self).children().each(function() {\n                    if ($(this).val() === selected_key + \"\") {\n                        $(this).attr(\"selected\", \"selected\");\n                    }\n                });\n\n                /* If we have only the default value disable select. */\n                if (1 === $(\"option\", self).length && $(self).val() === \"\") {\n                    $(self).prop(\"disabled\", true);\n                } else {\n                    $(self).prop(\"disabled\", false);\n                }\n            }\n        });\n    };\n\n    /* Alias for those who like to use more English like syntax. */\n    $.fn.remoteChainedTo = $.fn.remoteChained;\n\n    /* Default settings for plugin. */\n    $.fn.remoteChained.defaults = {\n        attribute: \"name\",\n        depends : null,\n        bootstrap : null,\n        loading : null,\n        clear : false\n    };\n\n})(window.jQuery || window.Zepto, window, document);","/*!\n * jQuery UI :data 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :data Selector\n//>>group: Core\n//>>description: Selects elements which have data stored under the specified key.\n//>>docs: http://api.jqueryui.com/data-selector/\n\n( function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} ( function( $ ) {\nreturn $.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo( function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t} ) :\n\n\t\t// Support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t}\n} );\n} ) );\n","( function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} ( function( $ ) {\n\n// This file is deprecated\nreturn $.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n} ) );\n","/*!\n * jQuery UI Scroll Parent 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: http://api.jqueryui.com/scrollParent/\n\n( function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} ( function( $ ) {\n\nreturn $.fn.scrollParent = function( includeHidden ) {\n\tvar position = this.css( \"position\" ),\n\t\texcludeStaticParent = position === \"absolute\",\n\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\tscrollParent = this.parents().filter( function() {\n\t\t\tvar parent = $( this );\n\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) +\n\t\t\t\tparent.css( \"overflow-x\" ) );\n\t\t} ).eq( 0 );\n\n\treturn position === \"fixed\" || !scrollParent.length ?\n\t\t$( this[ 0 ].ownerDocument || document ) :\n\t\tscrollParent;\n};\n\n} ) );\n","( function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} ( function( $ ) {\n\n$.ui = $.ui || {};\n\nreturn $.ui.version = \"1.12.1\";\n\n} ) );\n","/*!\n * jQuery UI Widget 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n\n( function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}( function( $ ) {\n\nvar widgetUuid = 0;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// Http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( $.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._on( options.element, {\n\t\t\t\"remove\": \"_untrackClassesElement\"\n\t\t} );\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName ).off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nreturn $.widget;\n\n} ) );\n","/*!\n * jQuery UI Mouse 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Mouse\n//>>group: Widgets\n//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.\n//>>docs: http://api.jqueryui.com/mouse/\n\n( function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"../ie\",\n\t\t\t\"../version\",\n\t\t\t\"../widget\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}( function( $ ) {\n\nvar mouseHandled = false;\n$( document ).on( \"mouseup\", function() {\n\tmouseHandled = false;\n} );\n\nreturn $.widget( \"ui.mouse\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tcancel: \"input, textarea, button, select, option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.on( \"mousedown.\" + this.widgetName, function( event ) {\n\t\t\t\treturn that._mouseDown( event );\n\t\t\t} )\n\t\t\t.on( \"click.\" + this.widgetName, function( event ) {\n\t\t\t\tif ( true === $.data( event.target, that.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t\t\t$.removeData( event.target, that.widgetName + \".preventClickEvent\" );\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.off( \".\" + this.widgetName );\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\t\t}\n\t},\n\n\t_mouseDown: function( event ) {\n\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// We may have missed mouseup (out of window)\n\t\t( this._mouseStarted && this._mouseUp( event ) );\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = ( event.which === 1 ),\n\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = ( typeof this.options.cancel === \"string\" && event.target.nodeName ?\n\t\t\t\t$( event.target ).closest( this.options.cancel ).length : false );\n\t\tif ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif ( !this.mouseDelayMet ) {\n\t\t\tthis._mouseDelayTimer = setTimeout( function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay );\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted = ( this._mouseStart( event ) !== false );\n\t\t\tif ( !this._mouseStarted ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif ( true === $.data( event.target, this.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t$.removeData( event.target, this.widgetName + \".preventClickEvent\" );\n\t\t}\n\n\t\t// These delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function( event ) {\n\t\t\treturn that._mouseMove( event );\n\t\t};\n\t\tthis._mouseUpDelegate = function( event ) {\n\t\t\treturn that._mouseUp( event );\n\t\t};\n\n\t\tthis.document\n\t\t\t.on( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.on( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function( event ) {\n\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\n\t\t// Support: IE <9\n\t\tif ( this._mouseMoved ) {\n\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\t\tif ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&\n\t\t\t\t\t!event.button ) {\n\t\t\t\treturn this._mouseUp( event );\n\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\n\t\t\t} else if ( !event.which ) {\n\n\t\t\t\t// Support: Safari <=8 - 9\n\t\t\t\t// Safari sets which to 0 if you press any of the following keys\n\t\t\t\t// during a drag (#14461)\n\t\t\t\tif ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||\n\t\t\t\t\t\tevent.originalEvent.metaKey || event.originalEvent.shiftKey ) {\n\t\t\t\t\tthis.ignoreMissingWhich = true;\n\t\t\t\t} else if ( !this.ignoreMissingWhich ) {\n\t\t\t\t\treturn this._mouseUp( event );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseDrag( event );\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t( this._mouseStart( this._mouseDownEvent, event ) !== false );\n\t\t\t( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis.document\n\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif ( event.target === this._mouseDownEvent.target ) {\n\t\t\t\t$.data( event.target, this.widgetName + \".preventClickEvent\", true );\n\t\t\t}\n\n\t\t\tthis._mouseStop( event );\n\t\t}\n\n\t\tif ( this._mouseDelayTimer ) {\n\t\t\tclearTimeout( this._mouseDelayTimer );\n\t\t\tdelete this._mouseDelayTimer;\n\t\t}\n\n\t\tthis.ignoreMissingWhich = false;\n\t\tmouseHandled = false;\n\t\tevent.preventDefault();\n\t},\n\n\t_mouseDistanceMet: function( event ) {\n\t\treturn ( Math.max(\n\t\t\t\tMath.abs( this._mouseDownEvent.pageX - event.pageX ),\n\t\t\t\tMath.abs( this._mouseDownEvent.pageY - event.pageY )\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function( /* event */ ) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function( /* event */ ) {},\n\t_mouseDrag: function( /* event */ ) {},\n\t_mouseStop: function( /* event */ ) {},\n\t_mouseCapture: function( /* event */ ) { return true; }\n} );\n\n} ) );\n","/*!\n * jQuery UI Sortable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Sortable\n//>>group: Interactions\n//>>description: Enables items in a list to be sorted using the mouse.\n//>>docs: http://api.jqueryui.com/sortable/\n//>>demos: http://jqueryui.com/sortable/\n//>>css.structure: ../../themes/base/sortable.css\n\n( function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"../data\",\n\t\t\t\"../ie\",\n\t\t\t\"../scroll-parent\",\n\t\t\t\"../version\",\n\t\t\t\"../widget\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}( function( $ ) {\n\nreturn $.widget( \"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn ( /left|right/ ).test( item.css( \"float\" ) ) ||\n\t\t\t( /inline|table-cell/ ).test( item.css( \"display\" ) );\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis._addClass( \"ui-sortable\" );\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tvar that = this;\n\t\tthis._removeClass( this.element.find( \".ui-sortable-handle\" ), \"ui-sortable-handle\" );\n\t\t$.each( this.items, function() {\n\t\t\tthat._addClass(\n\t\t\t\tthis.instance.options.handle ?\n\t\t\t\t\tthis.item.find( this.instance.options.handle ) :\n\t\t\t\t\tthis.item,\n\t\t\t\t\"ui-sortable-handle\"\n\t\t\t);\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[ i ].item.removeData( this.widgetName + \"-item\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function( event, overrideHandle ) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif ( this.reverting ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.options.disabled || this.options.type === \"static\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems( event );\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$( event.target ).parents().each( function() {\n\t\t\tif ( $.data( this, that.widgetName + \"-item\" ) === that ) {\n\t\t\t\tcurrentItem = $( this );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\tif ( $.data( event.target, that.widgetName + \"-item\" ) === that ) {\n\t\t\tcurrentItem = $( event.target );\n\t\t}\n\n\t\tif ( !currentItem ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( this.options.handle && !overrideHandle ) {\n\t\t\t$( this.options.handle, currentItem ).find( \"*\" ).addBack().each( function() {\n\t\t\t\tif ( this === event.target ) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !validHandle ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function( event, overrideHandle, noActivation ) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to\n\t\t// mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend( this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\n\t\t\t// This is a relative to absolute position minus the actual position calculation -\n\t\t\t// only used for relative positioned helper\n\t\t\trelative: this._getRelativeOffset()\n\t\t} );\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css( \"position\", \"absolute\" );\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition( event );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = {\n\t\t\tprev: this.currentItem.prev()[ 0 ],\n\t\t\tparent: this.currentItem.parent()[ 0 ]\n\t\t};\n\n\t\t// If the helper is not the original, hide the original so it's not playing any role during\n\t\t// the drag, won't cause anything bad this way\n\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif ( o.containment ) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif ( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// Support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet =\n\t\t\t\t$( \"<style>*{ cursor: \" + o.cursor + \" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click off