{"version":3,"sources":["webpack:///./node_modules/@clr/angular/fesm5/clr-angular.js","webpack:///./src/app/search/search-advanced/search-advanced-table/search-advanced-table.component.html","webpack:///./src/app/search/search-advanced/search-advanced-table/search-advanced-table.component.scss","webpack:///./src/app/search/search-advanced/search-advanced-table/search-advanced-table.component.ts","webpack:///./src/app/search/search-advanced/search-advanced.component.html","webpack:///./src/app/search/search-advanced/search-advanced.component.scss","webpack:///./src/app/search/search-advanced/search-advanced.component.ts","webpack:///./src/app/search/search-detail-table/search-detail-table.component.html","webpack:///./src/app/search/search-detail-table/search-detail-table.component.scss","webpack:///./src/app/search/search-detail-table/search-detail-table.component.ts","webpack:///./src/app/search/search-election/search-election.component.html","webpack:///./src/app/search/search-election/search-election.component.scss","webpack:///./src/app/search/search-election/search-election.component.ts","webpack:///./src/app/search/search-group-yearly/search-group-yearly.component.html","webpack:///./src/app/search/search-group-yearly/search-group-yearly.component.scss","webpack:///./src/app/search/search-group-yearly/search-group-yearly.component.ts","webpack:///./src/app/search/search-group/search-group.component.html","webpack:///./src/app/search/search-group/search-group.component.scss","webpack:///./src/app/search/search-group/search-group.component.ts","webpack:///./src/app/search/search-individual/search-individual.component.html","webpack:///./src/app/search/search-individual/search-individual.component.scss","webpack:///./src/app/search/search-individual/search-individual.component.ts","webpack:///./src/app/search/search-routing.module.ts","webpack:///./src/app/search/search.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAsa;AACjN;AAC7I;AACK;AACe;AACmB;AAC3D;;AAEpD;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,uBAAuB;AAC1D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,WAAW,4DAAY,wEAAwE;AACjI;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,OAAO;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,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,2BAA2B,4CAAO;AAClC,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,0BAA0B,sDAAQ,0CAA0C,UAAU;AACtF;AACA;AACA;AACA;AACA,uBAAuB,QAAQ,gBAAgB;AAC/C;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,0DAAY;AACnD;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,0CAA0C,EAAE;AAC5C;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,SAAS;AACT,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,8BAA8B;AACjE;AACA;AACA,sDAAsD;AACtD,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS,OAAO,8DAAgB;AAChC,MAAM;AACN;AACA,sBAAsB,OAAO,mDAAK,kCAAkC;AACpE,uBAAuB,OAAO,mDAAK,uCAAuC;AAC1E,wBAAwB,OAAO,mDAAK,wCAAwC;AAC5E,0BAA0B,OAAO,mDAAK,mCAAmC;AACzE,+BAA+B,OAAO,oDAAM,kCAAkC;AAC9E,yBAAyB,OAAO,mDAAK,EAAE;AACvC;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,WAAW,4DAAY,sEAAsE;AAC/H;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,2BAA2B;AAC9D;AACA;AACA,6CAA6C;AAC7C,SAAS,sCAAsC,OAAO,sDAAQ,EAAE;AAChE,MAAM;AACN;AACA,wBAAwB,OAAO,mDAAK,yBAAyB;AAC7D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,4BAA4B,4CAAO;AACnC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0DAAY;AACtC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iCAAiC,mDAAmD;AACpF,iBAAiB;AACjB;AACA;AACA,4CAA4C;AAC5C,SAAS,2CAA2C,OAAO,sDAAQ,EAAE,GAAG,OAAO,sDAAQ,EAAE;AACzF,MAAM;AACN;AACA,uBAAuB,OAAO,uDAAS,iCAAiC;AACxE,kBAAkB,OAAO,mDAAK,wBAAwB;AACtD,sBAAsB,OAAO,mDAAK,oBAAoB;AACtD,gBAAgB,OAAO,mDAAK,mBAAmB;AAC/C,gBAAgB,OAAO,mDAAK,mBAAmB;AAC/C,oBAAoB,OAAO,mDAAK,uBAAuB;AACvD,kBAAkB,OAAO,oDAAM,oBAAoB;AACnD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;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,CAAC;AACD;AACA,WAAW,GAAG;AACd,YAAY;AACZ;AACA;AACA,eAAe,EAAE;AACjB;AACA;AACA,eAAe,sDAAQ,GAAG;AAC1B;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA,gBAAgB,sDAAQ,QAAQ,sDAAQ,IAAI,gEAAU,cAAc,yBAAyB,EAAE;AAC/F;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU,SAAS,sDAAQ,EAAE,qBAAqB;AAClE;AACA,0DAA0D,sEAAgB,EAAE,+CAA+C,+BAA+B,EAAE,+CAA+C;AAC3M;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,wEAAwE,sCAAsC,EAAE;AAChH;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB,6DAA6D,8CAA8C,EAAE;AAC7G;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,+2BAA+2B,gBAAgB,0BAA0B,4BAA4B;AACr7B;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,iDAAiD;AACjD,SAAS,6BAA6B;AACtC,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS;AACT,MAAM;AACN;AACA,mBAAmB,OAAO,6DAAe,sBAAsB;AAC/D,wBAAwB,OAAO,mDAAK,8BAA8B;AAClE,wBAAwB,OAAO,0DAAY,gDAAgD;AAC3F;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,0DAAY;AAChD;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iCAAiC,0DAA0D;AAC3F;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,sEAAU,YAAY,iEAAK,EAAE,aAAa,GAAG,mEAAO,wBAAwB,iEAAK,EAAE,aAAa;AAC5H;AACA,4BAA4B,sEAAU,YAAY,iEAAK,EAAE,aAAa;AACtE;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,sEAAU,YAAY,iEAAK,EAAE,aAAa,GAAG,mEAAO,wBAAwB,iEAAK,EAAE,aAAa;AAC5H,4BAA4B,sEAAU,YAAY,iEAAK,EAAE,aAAa,GAAG,mEAAO,mBAAmB,iEAAK,EAAE,aAAa;AACvH;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,sEAAU;AACtC,gCAAgC,mEAAO,UAAU,qEAAS;AAC1D,oCAAoC,iEAAK,EAAE,qCAAqC;AAChF,oCAAoC,iEAAK,EAAE,0BAA0B;AACrE,oCAAoC,iEAAK,EAAE,2CAA2C;AACtF,oCAAoC,iEAAK,EAAE,yCAAyC;AACpF,oCAAoC,iEAAK,EAAE,qCAAqC;AAChF;AACA;AACA,4BAA4B,sEAAU,YAAY,iEAAK,EAAE,aAAa,GAAG,mEAAO,mBAAmB,iEAAK,EAAE,aAAa;AACvH;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,mDAAmD;AACnD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS;AACzB,MAAM;AACN;AACA,oBAAoB,OAAO,mDAAK,uBAAuB;AACvD,4BAA4B,OAAO,oDAAM,+BAA+B;AACxE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,sFAAsF;AACxH;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA,mCAAmC,4CAAO;AAC1C;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,iDAAiD;AACjD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;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,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,2BAA2B;AAC9D;AACA;AACA,6CAA6C;AAC7C,SAAS,qCAAqC,OAAO,sDAAQ,EAAE,GAAG;AAClE,SAAS,uCAAuC,OAAO,sDAAQ,EAAE,GAAG;AACpE,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS,OAAO,8DAAgB;AAChC,MAAM;AACN;AACA,iBAAiB,OAAO,mDAAK,yBAAyB;AACtD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA,6BAA6B,oDAAe;AAC5C;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,qBAAqB,EAAE;AAC5F;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F,6BAA6B,EAAE;AAC3H;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,oBAAoB;AACvD;AACA;AACA,2CAA2C;AAC3C,SAAS,uCAAuC,OAAO,sDAAQ,EAAE,GAAG;AACpE,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,uCAAuC,OAAO,sDAAQ,EAAE,GAAG;AACpE,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,mBAAmB,OAAO,yDAAW,uBAAuB,GAAG,OAAO,mDAAK,kBAAkB;AAC7F;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb,8BAA8B,4DAAc;AAC5C,WAAW,EAAE;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,0BAA0B,4CAAO;AACjC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,0CAA0C;AAC1C,SAAS,sBAAsB;AAC/B,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,iBAAiB;AACjB;AACA;AACA,4CAA4C;AAC5C,SAAS;AACT,MAAM;AACN;AACA,kBAAkB,OAAO,mDAAK,wBAAwB;AACtD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,WAAW;AAC1C;AACA;AACA;AACA,uBAAuB,EAAE;AACzB,wCAAwC,sEAAwB;AAChE,uBAAuB,EAAE;AACzB,uCAAuC,wDAAU;AACjD;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,iCAAiC,iBAAiB;AAClD,8BAA8B,cAAc;AAC5C,oCAAoC,iBAAiB;AACrD,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,cAAc,OAAO,yDAAW,EAAE,GAAG,OAAO,mDAAK,EAAE;AACnD,6BAA6B,OAAO,0DAAY,mBAAmB;AACnE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,4BAA4B;AAC/D;AACA;AACA,8CAA8C;AAC9C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAS,gBAAgB,OAAO,kDAAI,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AAC7E,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;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,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,cAAc;AACd;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,+CAA+C,0BAA0B,EAAE;AAC3E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,uDAAuD;AACvD,SAAS,uBAAuB;AAChC,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,4BAA4B;AACrC,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD,qBAAqB,OAAO,mDAAK,EAAE;AACnC;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb,uBAAuB,4DAAc;AACrC;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4CAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0DAAY;AAC5C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,4BAA4B;AAC/D;AACA;AACA,8CAA8C;AAC9C,SAAS,wBAAwB;AACjC,SAAS,6BAA6B,OAAO,oDAAM,yBAAyB,GAAG;AAC/E,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS,OAAO,8DAAgB;AAChC,MAAM;AACN;AACA,kBAAkB,OAAO,mDAAK,0BAA0B;AACxD,wBAAwB,OAAO,oDAAM,gCAAgC;AACrE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,4CAAO;AACtC;AACA;AACA;AACA;AACA,yCAAyC,4CAAO;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0DAAY;AAC1C;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,0BAA0B;AAC7D;AACA;AACA,4CAA4C;AAC5C,SAAS,sBAAsB;AAC/B,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS,OAAO,8DAAgB;AAChC,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,wBAAwB;AACpD,sBAAsB,OAAO,oDAAM,8BAA8B;AACjE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,WAAW,4DAAY,8EAA8E;AACvI;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU,UAAU,qBAAqB;AACzD;AACA,0DAA0D,sEAAgB,EAAE,+CAA+C,+BAA+B,EAAE,+CAA+C;AAC3M;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,wDAAQ;AAClD;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yEAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,YAAY,yEAAiB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,YAAY,yEAAiB;AAC7B,qDAAqD,EAAE;AACvD;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,6BAA6B;AAChE;AACA;AACA,qDAAqD;AACrD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,yBAAyB;AAClC,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,6BAA6B,OAAO,oDAAM,SAAS,yDAAW,IAAI;AAC3E,MAAM;AACN;AACA,qBAAqB,OAAO,0DAAY,2CAA2C;AACnF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb,WAAW,EAAE;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB;AACA,eAAe,EAAE;AACjB;AACA,eAAe,EAAE;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,sBAAsB;AAC5D,oCAAoC,oBAAoB;AACxD,oCAAoC,oBAAoB;AACxD,qCAAqC,qBAAqB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB,6BAA6B,sDAAQ;AACrC,mBAAmB,EAAE;AACrB;AACA,uBAAuB,iCAAiC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,4CAAO;AAC7C,4CAA4C,4CAAO;AACnD,0CAA0C,4CAAO;AACjD,qCAAqC,4CAAO;AAC5C;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4DAAK;AAC3B;AACA,oBAAoB,yEAAiB;AACrC,+BAA+B,EAAE;AACjC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,yDAAyD;AACzD,SAAS,OAAO,oDAAM,EAAE;AACxB,SAAS,6BAA6B,OAAO,oDAAM,SAAS,yDAAW,IAAI;AAC3E,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,sBAAsB,yEAAiB,cAAc,yDAAS,aAAa,gEAAgB;AAC3F;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA,wCAAwC,sDAAQ;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,wCAAwC,2EAAmB,cAAc,yDAAS,aAAa,gEAAgB;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,iCAAiC,2EAAmB,cAAc,yDAAS,aAAa,gEAAgB;AACxG;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,+BAA+B,+EAAuB;AACtD;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,iCAAiC,2EAAmB,cAAc,2DAAW;AAC7E;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,sDAAsD;AACtD,SAAS,6BAA6B,OAAO,oDAAM,SAAS,uDAAS,IAAI;AACzE,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;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,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,2CAA2C,0BAA0B,EAAE;AACvE;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,qNAAqN,KAAK,uVAAuV;AACplB;AACA;AACA,8CAA8C;AAC9C,SAAS,4BAA4B;AACrC,SAAS,8BAA8B;AACvC,SAAS,+BAA+B;AACxC,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,qBAAqB,OAAO,0DAAY,kCAAkC;AAC1E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,4BAA4B,oDAAe;AAC3C;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,kCAAkC,4CAAO;AACzC,gCAAgC,4CAAO;AACvC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA,uBAAuB,EAAE;AACzB;AACA,uBAAuB,EAAE;AACzB;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,iBAAiB,oDAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,gDAAgD;AAChD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,2DAA2D;AAC3D,SAAS,gCAAgC,OAAO,oDAAM,SAAS,wDAAQ,IAAI;AAC3E,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,+CAA+C,0BAA0B,EAAE;AAC3E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,y1DAAy1D;AACz1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,mDAAmD;AACnD,SAAS,sBAAsB;AAC/B,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAC1C,SAAS,+BAA+B;AACxC,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,4BAA4B;AACrC,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,8BAA8B,OAAO,sDAAQ,EAAE,GAAG,OAAO,oDAAM,gCAAgC,GAAG;AAC3G,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;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,iCAAiC,0DAAY;AAC7C;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,mBAAmB,yEAAiB;AACpC,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,+BAA+B,EAAE;AACjC;AACA;AACA,mCAAmC,EAAE;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,+CAA+C;AAC/C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAS,gBAAgB,OAAO,kDAAI,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AAC7E,SAAS,uCAAuC,OAAO,sDAAQ,EAAE,GAAG;AACpE,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,4CAA4C,OAAO,sDAAQ,EAAE,GAAG;AACzE,SAAS,+CAA+C,OAAO,sDAAQ,EAAE,GAAG;AAC5E,SAAS,6CAA6C,OAAO,sDAAQ,EAAE,GAAG;AAC1E,SAAS,6BAA6B,OAAO,oDAAM,SAAS,yDAAW,IAAI,GAAG;AAC9E,SAAS,mCAAmC,OAAO,sDAAQ,EAAE,GAAG;AAChE,SAAS,8BAA8B,OAAO,sDAAQ,EAAE,GAAG,OAAO,oDAAM,gCAAgC;AACxG,MAAM;AACN;AACA,wBAAwB,OAAO,mDAAK,EAAE;AACtC,gBAAgB,OAAO,mDAAK,sBAAsB;AAClD,uBAAuB,OAAO,mDAAK,EAAE;AACrC,2BAA2B,OAAO,yDAAW,+BAA+B;AAC5E,qBAAqB,OAAO,yDAAW,wBAAwB;AAC/D,wBAAwB,OAAO,oDAAM,4BAA4B;AACjE,0BAA0B,OAAO,0DAAY,oBAAoB;AACjE,6BAA6B,OAAO,0DAAY,mBAAmB;AACnE,yBAAyB,OAAO,0DAAY,wCAAwC;AACpF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,wDAAU;AACzC;AACA,qCAAqC,uDAAS;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,4GAA4G,+BAA+B,EAAE;AAC7I;AACA,wHAAwH,+BAA+B,EAAE;AACzJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,kDAAkD;AAClD,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAU,gBAAgB,OAAO,sDAAQ,EAAE;AAC3D,MAAM;AACN;AACA,uBAAuB,OAAO,yDAAW,kCAAkC;AAC3E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,2DAA2D;AAC3D,SAAS,OAAO,wDAAU,gBAAgB,OAAO,sDAAQ,EAAE,GAAG;AAC9D,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,qaAAqa,uBAAuB;AAC5b,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,yCAAyC;AACzC,SAAS,8BAA8B;AACvC,SAAS,sBAAsB;AAC/B,SAAS;AACT,MAAM;AACN;AACA,mBAAmB,OAAO,mDAAK,yBAAyB;AACxD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,yOAAyO,eAAe,8IAA8I,cAAc,2vBAA2vB,8BAA8B,EAAE;AACltC;AACA;AACA,+CAA+C;AAC/C,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AACrC,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;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,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,sKAAsK,2NAA2N,OAAO;AACxY;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iDAAiD;AACjD,SAAS,2BAA2B;AACpC,SAAS,4BAA4B;AACrC,SAAS,8BAA8B;AACvC,SAAS,+BAA+B;AACxC,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,qBAAqB,OAAO,0DAAY,kCAAkC;AAC1E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,2BAA2B,uBAAuB,mBAAmB,kBAAkB,EAAE;AACzF;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;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,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,+mCAA+mC,MAAM;AACrnC;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gDAAgD;AAChD,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC,SAAS,+BAA+B;AACxC,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS;AACT,MAAM;AACN;AACA,qBAAqB,OAAO,0DAAY,kCAAkC;AAC1E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB;AACA,wBAAwB,4DAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,uBAAuB;AAChC,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,4BAA4B;AACrC,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,gCAAgC,8BAA8B,EAAE;AACnG;AACA;AACA,2CAA2C;AAC3C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAS,gBAAgB,OAAO,kDAAI,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AAC7E,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY,EAAE,0DAAW;AACvD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,WAAW,EAAE;AACb,wBAAwB,4DAAc;AACtC;AACA;AACA,YAAY;AACZ;AACA;AACA,eAAe,oDAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,4DAA4D;AACrF;AACA,iBAAiB;AACjB;AACA;AACA,uDAAuD;AACvD,SAAS,uBAAuB;AAChC,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,4BAA4B;AACrC,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,OAAO,oDAAe,gBAAgB,OAAO,oDAAM,0BAA0B,GAAG;AACzF,SAAS;AACT,MAAM;AACN;AACA,qBAAqB,OAAO,mDAAK,wBAAwB;AACzD,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,mCAAmC,8BAA8B,EAAE;AACtG;AACA;AACA,8CAA8C;AAC9C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAS,gBAAgB,OAAO,kDAAI,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AAC7E,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,mCAAmC,OAAO,sDAAQ,EAAE,GAAG;AAChE,SAAS,OAAO,oDAAe,gBAAgB,OAAO,sDAAQ,EAAE,GAAG,OAAO,oDAAM,0BAA0B;AAC1G,MAAM;AACN;AACA,wBAAwB,OAAO,0DAAY,oBAAoB;AAC/D,6BAA6B,OAAO,0DAAY,mBAAmB;AACnE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY,EAAE,0DAAW;AACvD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,yBAAyB;AAC5D;AACA;AACA,2CAA2C;AAC3C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAS,gBAAgB,OAAO,kDAAI,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AAC7E,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,+CAA+C,0BAA0B,EAAE;AAC3E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,uBAAuB;AAChC,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,4BAA4B;AACrC,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD,qBAAqB,OAAO,mDAAK,EAAE;AACnC;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,2DAA2D,iFAAkC;AAC7F;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,qDAAqD;AACrD,SAAS,uBAAuB;AAChC,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,4BAA4B;AACrC,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD,oBAAoB,OAAO,0DAAY,SAAS,iFAAkC,IAAI;AACtF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,iCAAiC,+BAA+B,EAAE;AACrG;AACA;AACA,4CAA4C;AAC5C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAS,gBAAgB,OAAO,kDAAI,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AAC7E,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY,EAAE,0DAAW;AACvD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA,uDAAuD;AACvD,SAAS,uBAAuB;AAChC,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG;AACjE,SAAS,4BAA4B;AACrC,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,0DAAY,qBAAqB;AACzD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,mCAAmC,iCAAiC,EAAE;AACzG;AACA;AACA,8CAA8C;AAC9C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAS,gBAAgB,OAAO,kDAAI,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AAC7E,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY,EAAE,0DAAW;AACvD;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,4BAA4B,oDAAe;AAC3C;AACA;AACA;AACA;AACA;AACA,4BAA4B,4CAAO;AACnC,iCAAiC,4CAAO;AACxC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,oDAAoD,0BAA0B,EAAE;AAChF;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,8BAA8B;AACjE;AACA;AACA,gDAAgD;AAChD,SAAS,OAAO,yDAAW,gBAAgB,OAAO,sDAAQ,EAAE,GAAG;AAC/D,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS;AACT,MAAM;AACN;AACA,oBAAoB,OAAO,mDAAK,4BAA4B;AAC5D,0BAA0B,OAAO,oDAAM,kCAAkC;AACzE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,WAAW,4DAAY,oEAAoE;AAC7H;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,WAAW,4DAAY,8EAA8E;AACvI;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,gCAAgC,0DAAY;AAC5C;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,gCAAgC;AACnE;AACA;AACA,+CAA+C;AAC/C,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,kBAAkB,OAAO,mDAAK,wBAAwB;AACtD,wBAAwB,OAAO,oDAAM,8BAA8B;AACnE,yBAAyB,OAAO,0DAAY,yCAAyC;AACrF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,WAAW,4DAAY,kFAAkF;AAC3I;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,oBAAoB,EAAE;AAClE;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,sDAAsD,2EAA2E,GAAG,gBAAgB;AACpJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,yBAAyB;AAC5D;AACA;AACA,6DAA6D;AAC7D,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4CAAO;AAClC,+BAA+B,4CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,uCAAuC;AACvC,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,sDAAQ,4BAA4B,UAAU;AACxE;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ,gBAAgB;AAC/C;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,0BAA0B,sDAAQ,4BAA4B,UAAU;AACxE;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ,gBAAgB;AAC/C;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB,oEAAoE,wDAAwD,EAAE;AAC9H,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,0BAA0B,sDAAQ,4BAA4B,UAAU;AACxE;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ,gBAAgB;AAC/C;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,kDAAkD;AAClD,SAAS,aAAa;AACtB,SAAS;AACT,MAAM;AACN;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA,gCAAgC,0DAAY;AAC5C;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iCAAiC,wDAAwD;AACzF;AACA,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,wBAAwB;AACjC,SAAS;AACT,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,8BAA8B;AAC1D,uBAAuB,OAAO,oDAAM,oCAAoC;AACxE,wBAAwB,OAAO,mDAAK,0BAA0B;AAC9D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4CAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,0DAAY;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,iCAAiC,2DAA2D;AAC5F;AACA,iBAAiB;AACjB;AACA;AACA,uDAAuD;AACvD,SAAS,wBAAwB;AACjC,SAAS;AACT,MAAM;AACN;AACA,8BAA8B,OAAO,mDAAK,gCAAgC;AAC1E,iBAAiB,OAAO,uDAAS,oBAAoB;AACrD,2BAA2B,OAAO,uDAAS,8BAA8B;AACzE,iBAAiB,OAAO,mDAAK,6BAA6B;AAC1D,6BAA6B,OAAO,oDAAM,mCAAmC;AAC7E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4CAAO;AACrC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,2BAA2B;AAC9D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS,UAAU,uCAAuC;AAC1E;AACA;AACA,wDAAwD;AACxD,SAAS,OAAO,+DAAiB,EAAE;AACnC,SAAS,yCAAyC,OAAO,sDAAQ,EAAE,GAAG;AACtE,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS,UAAU,uCAAuC;AAC1E;AACA;AACA,wDAAwD;AACxD,SAAS,OAAO,+DAAiB,EAAE;AACnC,SAAS,yCAAyC,OAAO,sDAAQ,EAAE,GAAG;AACtE,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA,8BAA8B,sDAAQ,iCAAiC,UAAU;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,QAAQ,gBAAgB;AACnD;AACA;AACA;AACA;AACA,yBAAyB,0BAA0B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;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,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,eAAe;AAC9C;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,gCAAgC,4CAAO;AACvC,+BAA+B,4CAAO;AACtC,8BAA8B,4CAAO;AACrC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,kDAAkD,gBAAgB,EAAE;AACpE;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,iDAAiD;AACjD,SAAS,OAAO,oDAAM,EAAE;AACxB,SAAS,OAAO,uDAAS;AACzB,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4CAAO;AAClC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,uCAAuC;AACvC,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,uBAAuB,OAAO,uDAAS,2BAA2B;AAClE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,0DAAY;AAC7C;AACA;AACA;AACA;AACA;AACA,oCAAoC,0DAAY;AAChD;AACA;AACA;AACA;AACA,sCAAsC,0DAAY;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;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,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,aAAa;AACtB,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,OAAO,8DAAgB;AAChC,MAAM;AACN;AACA,uBAAuB,OAAO,uDAAS,2BAA2B;AAClE,8BAA8B,OAAO,uDAAS,kCAAkC;AAChF,iBAAiB,OAAO,mDAAK,yBAAyB;AACtD,kBAAkB,OAAO,mDAAK,0BAA0B;AACxD,kBAAkB,OAAO,mDAAK,0BAA0B;AACxD,wBAAwB,OAAO,oDAAM,gCAAgC;AACrE,qBAAqB,OAAO,mDAAK,6BAA6B;AAC9D,2BAA2B,OAAO,oDAAM,mCAAmC;AAC3E,eAAe,OAAO,yDAAW,wBAAwB;AACzD,gBAAgB,OAAO,yDAAW,yBAAyB;AAC3D,2BAA2B,OAAO,0DAAY,yBAAyB;AACvE,6BAA6B,OAAO,mDAAK,6BAA6B;AACtE,6BAA6B,OAAO,oDAAM,mCAAmC;AAC7E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4CAAO;AAClC,+BAA+B,4CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,6BAA6B,EAAE;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,iEAAiE,4BAA4B,EAAE;AAC/F;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,qCAAqC,EAAE;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,kCAAkC,EAAE;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,wCAAwC;AACxC,SAAS,wBAAwB;AACjC,SAAS,aAAa;AACtB,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,uDAAO;AACxC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,gDAAgD;AAChD,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,iBAAiB;AACjB;AACA;AACA,mDAAmD;AACnD,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS,OAAO,6DAAe,EAAE;AACjC,SAAS,cAAc;AACvB,SAAS,OAAO,8DAAgB;AAChC,MAAM;AACN;AACA,oBAAoB,OAAO,mDAAK,2BAA2B;AAC3D,mBAAmB,OAAO,mDAAK,gCAAgC;AAC/D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,yDAAyD;AACzD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb,8BAA8B,4DAAc;;AAE5C;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,0CAA0C,4BAA4B,EAAE;AAC3G;AACA;AACA,qDAAqD;AACrD,SAAS,sBAAsB;AAC/B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,kCAAkC,OAAO,0DAAY,gCAAgC;AACrF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B,6BAA6B;AACxD,gDAAgD,4CAA4C,wDAAU,EAAE;AACxG,iBAAiB;AACjB;AACA;AACA,8CAA8C;AAC9C,SAAS;AACT,MAAM;AACN;AACA,yBAAyB,OAAO,0DAAY,+BAA+B;AAC3E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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;AACA,qCAAqC,oDAAe;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB,2EAA2E,6BAA6B,EAAE,4BAA4B,sBAAsB,EAAE;AAC9J;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,6DAA6D,gCAAgC,EAAE;AAC/F,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mCAAmC;AACnC,0CAA0C;AAC1C,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,4DAA4D,mCAAmC,EAAE;AACjG;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,uBAAuB,OAAO,uDAAS,yBAAyB;AAChE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,kDAAkD;AAClD,SAAS,8BAA8B;AACvC,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,8DAAgB;AAChC,MAAM;AACN;AACA,oBAAoB,OAAO,6DAAe,wBAAwB;AAClE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,+BAA+B,4CAAO;AACtC;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,oCAAoC,6DAAM,sBAAsB,0BAA0B,EAAE;AAC5F;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,yBAAyB,oDAAe;AACxC;AACA;AACA,oCAAoC,wDAAwD,EAAE;AAC9F;AACA;AACA,oCAAoC,sDAAsD,EAAE;AAC5F;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,qDAAqD;AACrD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4CAAO;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,EAAE;AACjC;AACA,+BAA+B,EAAE;AACjC;AACA,+BAA+B,EAAE;AACjC;AACA;AACA;AACA;AACA,uCAAuC,EAAE;AACzC,sFAAsF,sCAAsC,EAAE;AAC9H;AACA;AACA;AACA;AACA,mCAAmC,EAAE;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,+BAA+B,EAAE;AACjC;AACA,+BAA+B,EAAE;AACjC;AACA,+BAA+B,EAAE;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,EAAE;AAC7C,0FAA0F,uBAAuB,EAAE;AACnH;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE;AACzC;AACA;AACA,uCAAuC,EAAE;AACzC;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA,gFAAgF,4CAA4C,EAAE;AAC9H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,EAAE;AAC7B,yEAAyE,wBAAwB,EAAE;AACnG;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iCAAiC,EAAE;AACvE,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,iCAAiC,EAAE;AACvE;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB,qEAAqE,uBAAuB,EAAE;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,0DAA0D,yCAAyC,EAAE;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,4CAA4C;AAC5C,SAAS,cAAc;AACvB,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,uBAAuB,OAAO,uDAAS,wBAAwB;AAC/D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0DAAY;AAC/C,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0DAAa;AAC7C,qBAAqB,oDAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,kCAAkC,2BAA2B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,4mCAA4mC,oCAAoC;AAChpC;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,yCAAyC,gDAAgD;AACzF,iBAAiB;AACjB;AACA;AACA,iDAAiD;AACjD,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC,SAAS,eAAe;AACxB,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS;AACT,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,wBAAwB;AACpD,oBAAoB,OAAO,mDAAK,4BAA4B;AAC5D,2BAA2B,OAAO,oDAAM,kCAAkC;AAC1E,oBAAoB,OAAO,mDAAK,4BAA4B;AAC5D,0BAA0B,OAAO,oDAAM,kCAAkC;AACzE,mBAAmB,OAAO,6DAAe,4BAA4B;AACrE,wBAAwB,OAAO,uDAAS,yBAAyB,OAAO,8DAAgB,EAAE,IAAI;AAC9F,4BAA4B,OAAO,uDAAS,6BAA6B,OAAO,8DAAgB,EAAE,IAAI;AACtG,4BAA4B,OAAO,uDAAS,6BAA6B,OAAO,8DAAgB,EAAE,IAAI;AACtG;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,2CAA2C,4CAAO;AAClD;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,0DAAG,cAAc,oBAAoB,EAAE;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kBAAkB,EAAE;AACzD;AACA;AACA,qCAAqC;AACrC;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,+CAA+C,sDAAQ,4DAA4D,yBAAyB;AAC5I;AACA;AACA,uCAAuC,EAAE;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ,gBAAgB;AACvD;AACA;AACA;AACA;AACA,6BAA6B,0BAA0B;AACvD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,gDAAgD;AAChD,SAAS,wBAAwB;AACjC,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,gBAAgB,yEAAiB;AACjC;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,mDAAmD;AACnD,SAAS,6BAA6B,OAAO,oDAAM,SAAS,yDAAW,IAAI;AAC3E,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0DAAY;AACvC,mCAAmC,0DAAY;AAC/C,yCAAyC,0DAAY;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,2DAA2D,iBAAiB,EAAE;AAC9E;AACA;AACA;AACA,iEAAiE,iBAAiB,EAAE;AACpF;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA,mFAAmF,qBAAqB,EAAE;AAC1G,SAAS;AACT;AACA,6EAA6E,qBAAqB,EAAE;AACpG;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,0FAA0F,qCAAqC,EAAE;AACjI;AACA;AACA,6DAA6D,EAAE;AAC/D;AACA;AACA,uDAAuD,EAAE;AACzD;AACA,SAAS;AACT;AACA;AACA;AACA,+DAA+D,OAAO;AACtE;AACA;AACA;AACA,mEAAmE,OAAO;AAC1E;AACA;AACA;AACA,uDAAuD,OAAO;AAC9D;AACA;AACA;AACA,qDAAqD,OAAO;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,oDAAoD,0BAA0B,EAAE;AAChF;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,q0DAAq0D,gYAAgY;AACrsE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,8CAA8C;AAC9C,SAAS,8BAA8B;AACvC,SAAS,gCAAgC;AACzC,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AACpC,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS;AACT,MAAM;AACN;AACA,mBAAmB,OAAO,mDAAK,2BAA2B;AAC1D,mBAAmB,OAAO,oDAAM,2BAA2B;AAC3D,oBAAoB,OAAO,0DAAY,6BAA6B;AACpE,oBAAoB,OAAO,mDAAK,4BAA4B;AAC5D,2BAA2B,OAAO,oDAAM,kCAAkC;AAC1E,0BAA0B,OAAO,mDAAK,kCAAkC;AACxE,iCAAiC,OAAO,oDAAM,wCAAwC;AACtF,4BAA4B,OAAO,mDAAK,gCAAgC;AACxE,uBAAuB,OAAO,0DAAY,mCAAmC;AAC7E,mBAAmB,OAAO,6DAAe,8BAA8B;AACvE,gBAAgB,OAAO,6DAAe,2BAA2B;AACjE,6BAA6B,OAAO,uDAAS,+BAA+B,OAAO,8DAAgB,EAAE,IAAI;AACzG,oCAAoC,OAAO,uDAAS,qCAAqC,OAAO,8DAAgB,EAAE,IAAI;AACtH,wCAAwC,OAAO,uDAAS,yCAAyC,OAAO,8DAAgB,EAAE,IAAI;AAC9H,0BAA0B,OAAO,uDAAS,2BAA2B,OAAO,8DAAgB,EAAE,IAAI;AAClG,4BAA4B,OAAO,uDAAS,6BAA6B,OAAO,8DAAgB,EAAE,IAAI;AACtG;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,0DAAY;AAC3C;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,4DAA4D;AAC5D,SAAS,yBAAyB;AAClC,SAAS;AACT,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,sCAAsC;AAClE,uBAAuB,OAAO,oDAAM,4CAA4C;AAChF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gEAAgE;AAChE,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,2ZAA2Z,gBAAgB,0BAA0B;AACrc,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,0DAA0D;AAC1D,SAAS,8BAA8B;AACvC,SAAS,mCAAmC;AAC5C,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,0DAAY,yCAAyC;AAC7E,mBAAmB,OAAO,6DAAe,0CAA0C;AACnF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,8BAA8B;AACjE;AACA;AACA,2DAA2D;AAC3D,SAAS,0CAA0C,OAAO,sDAAQ,EAAE;AACpE,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB,mEAAmE,YAAY,EAAE;AACjF;AACA;AACA;AACA,SAAS;AACT,mBAAmB,EAAE;AACrB,2FAA2F,YAAY,EAAE;AACzG;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,8YAA8Y,0BAA0B;AACxa;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,kBAAkB;AAC3B,SAAS,8BAA8B;AACvC,SAAS,OAAO,+DAAiB;AACjC,MAAM;AACN;AACA,kBAAkB,OAAO,0DAAY,oCAAoC;AACzE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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,iCAAiC,iBAAiB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,4CAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0DAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,0CAA0C,EAAE;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E;AAC9E;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,iCAAiC;AACjC;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS,UAAU,oCAAoC;AACvE;AACA;AACA,4DAA4D;AAC5D,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS;AACT,MAAM;AACN;AACA,+BAA+B,OAAO,mDAAK,kCAAkC;AAC7E,uBAAuB,OAAO,mDAAK,0BAA0B;AAC7D,wBAAwB,OAAO,oDAAM,gCAAgC;AACrE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,iBAAiB;AACjB;AACA;AACA,0DAA0D;AAC1D,SAAS,4BAA4B,OAAO,sDAAQ,EAAE;AACtD,MAAM;AACN;AACA,mBAAmB,OAAO,mDAAK,2BAA2B;AAC1D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,wQAAwQ,QAAQ;AAChR,iBAAiB;AACjB;AACA;AACA,sDAAsD;AACtD,SAAS;AACT,MAAM;AACN;AACA,2BAA2B,OAAO,mDAAK,iCAAiC;AACxE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAgF,2CAA2C,EAAE;AAC7H;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,26BAA26B,OAAO,QAAQ,WAAW;AACr8B,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,wDAAwD;AACxD,SAAS;AACT,MAAM;AACN;AACA,8BAA8B,OAAO,0DAAY,gCAAgC;AACjF,+BAA+B,OAAO,uDAAS,+BAA+B;AAC9E,oBAAoB,OAAO,mDAAK,4BAA4B;AAC5D,sBAAsB,OAAO,mDAAK,8BAA8B;AAChE,oBAAoB,OAAO,mDAAK,4BAA4B;AAC5D,uBAAuB,OAAO,mDAAK,wBAAwB;AAC3D,0BAA0B,OAAO,oDAAM,8BAA8B;AACrE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,4kBAA4kB,oSAAoS;AACh3B;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,uDAAuD;AACvD,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAClC,SAAS,eAAe;AACxB,SAAS,8BAA8B;AACvC,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,6DAAe,4BAA4B;AACnE,mBAAmB,OAAO,mDAAK,2BAA2B;AAC1D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oHAAoH,2BAA2B,EAAE;AACjJ;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,0BAA0B;AAC7D;AACA;AACA,uDAAuD;AACvD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,0DAAY;AAC7C;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,uFAAuF,iCAAiC,EAAE;AAC1H,4FAA4F,sCAAsC,EAAE;AACpI,qFAAqF,+BAA+B,EAAE;AACtH;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,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,SAAS,OAAO,uDAAS,UAAU,yDAAyD;AAC5F;AACA;AACA,wDAAwD;AACxD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,gCAAgC;AACzC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS;AACT,MAAM;AACN;AACA,yBAAyB,OAAO,oDAAM,gCAAgC;AACtE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yHAAyH,2BAA2B,EAAE;AACtJ;AACA;AACA,oCAAoC,kCAAkC,EAAE;AACxE;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,4BAA4B;AAC/D;AACA;AACA,yDAAyD;AACzD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,gCAAgC;AACzC,SAAS,mBAAmB;AAC5B,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA,wBAAwB;AACxB;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA,QAAQ,yEAAiB;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,oCAAoC,oCAAoC,EAAE;AAC1E;AACA;AACA;AACA;AACA,SAAS;AACT,yEAAyE,8CAA8C,EAAE;AACzH;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C,SAAS;AACT,uDAAuD,0DAA0D,EAAE;AACnH;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,iCAAiC,4DAA4D,yDAAW,GAAG;AAC3G,iBAAiB;AACjB;AACA;AACA,uDAAuD;AACvD,SAAS,gCAAgC;AACzC,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAC5B,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS;AACT,MAAM;AACN;AACA,mBAAmB,OAAO,6DAAe,mCAAmC;AAC5E,mBAAmB,OAAO,6DAAe,8BAA8B;AACvE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,qHAAqH,0BAA0B,EAAE;AACjJ;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,4CAA4C;AAC/E;AACA;AACA,sDAAsD;AACtD,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,6DAAe,iCAAiC;AACxE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;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,SAAS,OAAO,sDAAQ;AACxB;AACA,wBAAwB,4DAAY;AACpC;AACA;AACA,wBAAwB,0DAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,2BAA2B,gCAAgC;AAC3D;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,iEAAK,SAAS,iEAAK,EAAE,6BAA6B;AAC9E,4BAA4B,sEAAU,mBAAmB,mEAAO,qBAAqB,iEAAK,EAAE,4BAA4B;AACxH,4BAA4B,sEAAU,mBAAmB,iEAAK,EAAE,4BAA4B,GAAG,mEAAO;AACtG;AACA;AACA,+CAA+C,gBAAgB,EAAE;AACjE,iBAAiB;AACjB;AACA;AACA,gDAAgD;AAChD,SAAS,oCAAoC,OAAO,sDAAQ,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AACrF,SAAS;AACT,MAAM;AACN;AACA,oBAAoB,OAAO,yDAAW,yCAAyC,GAAG,OAAO,mDAAK,4BAA4B;AAC1H,0BAA0B,OAAO,oDAAM,kCAAkC;AACzE,sBAAsB,OAAO,yDAAW,2CAA2C,GAAG,OAAO,mDAAK,8BAA8B;AAChI,2BAA2B,OAAO,yDAAW,wCAAwC;AACrF,2BAA2B,OAAO,mDAAK,gCAAgC;AACvE,6BAA6B,OAAO,yDAAW,6BAA6B;AAC5E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0DAAY;AACpC;AACA,iCAAiC,0DAAY;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,+CAA+C,gBAAgB,EAAE;AACjE,iBAAiB;AACjB;AACA;AACA,gBAAgB,OAAO,oDAAM,2BAA2B;AACxD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,+CAA+C,gBAAgB,EAAE;AACjE,iBAAiB;AACjB;AACA;AACA,iDAAiD;AACjD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,+BAA+B,0DAAY;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,8EAA8E,OAAO;AACrF,iBAAiB;AACjB;AACA;AACA,gDAAgD;AAChD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,8EAA8E,OAAO;AACrF,iBAAiB;AACjB;AACA;AACA,iDAAiD;AACjD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,iDAAiD;AACpF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY,EAAE,0DAAW;AACvD;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb,oBAAoB,4DAAc;AAClC;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oDAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,iDAAiD,EAAE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA,0BAA0B,sDAAQ,gCAAgC,UAAU;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ,gBAAgB;AAC/C;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;AACD;AACA;AACA,WAAW,EAAE;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,gBAAgB,sDAAQ,QAAQ,sDAAQ;AACxC;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA,uCAAuC,EAAE;AACzC;AACA;AACA;AACA,4EAA4E,EAAE;AAC9E;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,iFAAiF,yCAAyC,EAAE;AAC5H,4FAA4F,yCAAyC,EAAE;AACvI;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,slCAAslC,QAAQ,iTAAiT,QAAQ;AACv5C,qFAAqF,gDAAgD;AACrI;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,iEAAK,aAAa,iEAAK,EAAE,sCAAsC;AAC3F,4BAA4B,iEAAK,cAAc,iEAAK,EAAE,oCAAoC;AAC1F,4BAA4B,sEAAU,2BAA2B,mEAAO;AACxE;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,8CAA8C;AAC9C,SAAS,6BAA6B,OAAO,oDAAM,sBAAsB,GAAG;AAC5E,SAAS,kCAAkC,OAAO,sDAAQ,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AACnF,SAAS,4BAA4B;AACrC,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,OAAO,sDAAQ;AACxB,MAAM;AACN;AACA,oBAAoB,OAAO,mDAAK,0BAA0B;AAC1D,0BAA0B,OAAO,oDAAM,gCAAgC;AACvE,wBAAwB,OAAO,yDAAW,wBAAwB;AAClE,mCAAmC,OAAO,yDAAW,wCAAwC;AAC7F,wBAAwB,OAAO,yDAAW,iCAAiC;AAC3E,sBAAsB,OAAO,mDAAK,4BAA4B;AAC9D,oBAAoB,OAAO,mDAAK,0BAA0B;AAC1D,0BAA0B,OAAO,oDAAM,gCAAgC;AACvE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,0CAA0C;AAC1C,SAAS;AACT,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,sBAAsB;AAClD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,YAAY;AACZ;AACA;AACA;AACA,oCAAoC,EAAE;AACtC;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,iBAAiB,yDAAY;AAC7B;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA,2CAA2C,gEAAgE,EAAE;AAC7G;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,sDAAsD,kEAAkE,EAAE;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,mDAAmD;AACtF;AACA;AACA,oDAAoD;AACpD,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS;AACT,MAAM;AACN;AACA,iBAAiB,OAAO,mDAAK,gCAAgC;AAC7D,uBAAuB,OAAO,mDAAK,yCAAyC;AAC5E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,EAAE;AACnC;AACA,aAAa;AACb;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,sOAAsO;AACtO,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,4BAA4B;AACrC,SAAS,6BAA6B,OAAO,sDAAQ,EAAE;AACvD,MAAM;AACN;AACA,kBAAkB,OAAO,mDAAK,qBAAqB;AACnD,oBAAoB,OAAO,mDAAK,uBAAuB;AACvD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,sEAAsE;AACxG;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,4CAAO;AACpC,4BAA4B,4CAAO;AACnC,2BAA2B,4CAAO;AAClC,wBAAwB,4CAAO;AAC/B;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU,UAAU,qBAAqB;AACzD;AACA,oEAAoE,sEAAgB,EAAE,yDAAyD,yCAAyC,EAAE,yDAAyD;AACnP;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,4CAAO;AACpC,4BAA4B,4CAAO;AACnC,2BAA2B,4CAAO;AAClC;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,iDAAiD,gBAAgB,EAAE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,gBAAgB,EAAE;AACzE;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,yBAAyB,EAAE;AAC3B,gCAAgC,EAAE;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;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;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,gBAAgB,EAAE;AAClF;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,2DAA2D;AAC3D,SAAS,OAAO,oDAAM,EAAE;AACxB,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,2DAA2D;AAC3D,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,oBAAoB,0BAA0B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,qCAAqC,oBAAoB,uBAAuB;AAChF,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,sEAAU;AACtC,gCAAgC,iEAAK,EAAE,sBAAsB;AAC7D,gCAAgC,mEAAO,qBAAqB,iEAAK,EAAE,SAAS,KAAK,YAAY,MAAM,GAAG;AACtG;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,+CAA+C,OAAO,sDAAQ,EAAE,GAAG;AAC5E,SAAS,+CAA+C,OAAO,sDAAQ,EAAE,GAAG;AAC5E,SAAS,OAAO,uDAAS,EAAE;AAC3B,SAAS,OAAO,oDAAM;AACtB,MAAM;AACN;AACA,2BAA2B,OAAO,yDAAW,8BAA8B;AAC3E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,6BAA6B;AAChE;AACA;AACA,+CAA+C;AAC/C,SAAS,OAAO,yDAAW,EAAE;AAC7B,SAAS,OAAO,8DAAgB,gBAAgB,OAAO,sDAAQ,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AACxF,SAAS,+CAA+C,OAAO,sDAAQ,EAAE;AACzE,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,6DAA6D;AAC7D,SAAS,iCAAiC;AAC1C,SAAS,OAAO,uDAAS;AACzB,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,wDAAwD;AACxD,SAAS,OAAO,uDAAS;AACzB,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,0DAAY;AAChD,mCAAmC,0DAAY;AAC/C,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iEAAiE;AAC5F,iBAAiB;AACjB;AACA;AACA,+CAA+C;AAC/C,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,iCAAiC;AAC1C,SAAS,mCAAmC;AAC5C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,OAAO,sEAAwB,EAAE;AAC1C,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,iCAAiC;AAC1C,SAAS;AACT,MAAM;AACN;AACA,uBAAuB,OAAO,0DAAY,yBAAyB;AACnE,wBAAwB,OAAO,mDAAK,2BAA2B;AAC/D,iBAAiB,OAAO,mDAAK,uBAAuB;AACpD,4BAA4B,OAAO,oDAAM,2BAA2B;AACpE,2BAA2B,OAAO,oDAAM,0BAA0B;AAClE,0BAA0B,OAAO,oDAAM,yBAAyB;AAChE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,oCAAoC,0DAAY;AAChD,mCAAmC,0DAAY;AAC/C,kCAAkC,0DAAY;AAC9C,oCAAoC,0DAAY;AAChD,oCAAoC,0DAAY;AAChD,+BAA+B,0DAAY;AAC3C;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,6BAA6B,SAAS;AACtC,+BAA+B,aAAa;AAC5C,gCAAgC,cAAc;AAC9C,8BAA8B,cAAc;AAC5C,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA,+CAA+C,gCAAgC,EAAE;AACjF,8EAA8E,sDAAQ;AACtF;AACA;AACA,oDAAoD;AACpD;AACA;AACA,sCAAsC,sDAAQ,GAAG;AACjD;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,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,oCAAoC,EAAE,8CAA8C,8CAA8C,EAAE;AACpI;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB,iCAAiC,sDAAQ,GAAG,kBAAkB,iCAAiC;AAC/F;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB,iCAAiC,sDAAQ,GAAG,kBAAkB,iCAAiC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB,4BAA4B,sDAAQ,GAAG,iBAAiB,2BAA2B;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B,6EAA6E;AACxG,iBAAiB;AACjB;AACA;AACA,+CAA+C;AAC/C,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,mCAAmC;AAC5C,SAAS,mBAAmB;AAC5B,SAAS,OAAO,uDAAS;AACzB,MAAM;AACN;AACA,iBAAiB,OAAO,mDAAK,uBAAuB;AACpD,yBAAyB,OAAO,mDAAK,+BAA+B;AACpE,4BAA4B,OAAO,oDAAM,2BAA2B;AACpE,2BAA2B,OAAO,oDAAM,0BAA0B;AAClE,0BAA0B,OAAO,oDAAM,yBAAyB;AAChE,4BAA4B,OAAO,oDAAM,2BAA2B;AACpE,4BAA4B,OAAO,oDAAM,2BAA2B;AACpE,uBAAuB,OAAO,oDAAM,sBAAsB;AAC1D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,qCAAqC,gCAAgC,EAAE;AAC1G;AACA;AACA,gDAAgD;AAChD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,iDAAiD,OAAO,sDAAQ,EAAE;AAC3E,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,4BAA4B,4CAAO;AACnC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;AACD;AACA,WAAW,EAAE;AACb,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA,gBAAgB,sDAAQ,QAAQ,sDAAQ;AACxC;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF,2CAA2C,EAAE;AACjI,qFAAqF,iCAAiC,EAAE;AACxH;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mDAAmD,0BAA0B,EAAE;AAC/E;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,wEAAwE,4CAA4C,wDAAU,EAAE;AAChI,iBAAiB;AACjB;AACA;AACA,8CAA8C;AAC9C,SAAS,kCAAkC,OAAO,sDAAQ,EAAE,GAAG,OAAO,sDAAQ,EAAE,GAAG;AACnF,SAAS,sBAAsB;AAC/B,SAAS,OAAO,+DAAiB,EAAE;AACnC,SAAS;AACT,MAAM;AACN;AACA,0BAA0B,OAAO,mDAAK,sCAAsC;AAC5E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,0EAA0E,oCAAoC,EAAE;AAChH;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,uCAAuC,kCAAkC,EAAE;AAC9G;AACA;AACA,kDAAkD;AAClD,SAAS,oBAAoB;AAC7B,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,4BAA4B;AACrC,SAAS,OAAO,uDAAS;AACzB,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,kDAAkD;AAClD,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAU,gBAAgB,OAAO,sDAAQ,EAAE,GAAG,OAAO,oDAAM,gCAAgC,GAAG;AAC9G,SAAS,sCAAsC,OAAO,sDAAQ,EAAE,GAAG,OAAO,sDAAQ,EAAE;AACpF,MAAM;AACN;AACA,oBAAoB,OAAO,mDAAK,0BAA0B;AAC1D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,qDAAqD;AACrD,SAAS,oBAAoB;AAC7B,SAAS;AACT,MAAM;AACN;AACA,kCAAkC,OAAO,0DAAY,gCAAgC;AACrF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB,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,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,2DAA2D;AAC3D,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,6BAA6B,uDAAS;AACtC;AACA;AACA;AACA;AACA,2BAA2B,4CAAO;AAClC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA,2DAA2D,uBAAuB,EAAE;AACpF,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,qCAAqC,gBAAgB,EAAE;AACvD,iBAAiB;AACjB;AACA;AACA,2CAA2C;AAC3C,SAAS,iCAAiC;AAC1C,SAAS,OAAO,+DAAiB,EAAE;AACnC,SAAS,wCAAwC,OAAO,sDAAQ,EAAE,GAAG;AACrE,SAAS;AACT,MAAM;AACN;AACA,mBAAmB,OAAO,mDAAK,gCAAgC;AAC/D,oBAAoB,OAAO,mDAAK,+BAA+B;AAC/D,sBAAsB,OAAO,mDAAK,+BAA+B;AACjE,mBAAmB,OAAO,mDAAK,6BAA6B;AAC5D,0BAA0B,OAAO,oDAAM,mCAAmC;AAC1E,qBAAqB,OAAO,mDAAK,2BAA2B;AAC5D,0BAA0B,OAAO,mDAAK,2BAA2B;AACjE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,+CAA+C;AAC/C,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA,2CAA2C,0DAAY;AACvD,sCAAsC,0DAAY;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,qCAAqC,iBAAiB;AACtD,iBAAiB;AACjB;AACA;AACA,4CAA4C;AAC5C,SAAS;AACT,MAAM;AACN;AACA,qBAAqB,OAAO,6DAAe,qBAAqB;AAChE,8BAA8B,OAAO,mDAAK,mCAAmC;AAC7E,mCAAmC,OAAO,oDAAM,yCAAyC;AACzF,wBAAwB,OAAO,mDAAK,8BAA8B;AAClE,8BAA8B,OAAO,oDAAM,oCAAoC;AAC/E;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,sCAAsC,0DAAY;AAClD,2CAA2C,0DAAY;AACvD;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,mkBAAmkB,kCAAkC,KAAK,8BAA8B;AACxoB,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,iDAAiD;AACjD,SAAS,0BAA0B;AACnC,SAAS;AACT,MAAM;AACN;AACA,wBAAwB,OAAO,mDAAK,8BAA8B;AAClE,8BAA8B,OAAO,oDAAM,oCAAoC;AAC/E,6BAA6B,OAAO,mDAAK,mCAAmC;AAC5E,mCAAmC,OAAO,oDAAM,yCAAyC;AACzF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,4BAA4B;AAC9D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA,sCAAsC,4CAAO;AAC7C,qCAAqC,4CAAO;AAC5C,4BAA4B;AAC5B;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU,UAAU,qBAAqB;AACzD;AACA;AACA,8DAA8D,WAAW;AACzE,qEAAqE,sEAAgB,EAAE,0DAA0D,0CAA0C,EAAE,0DAA0D;AACvP;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,wCAAwC,mCAAmC,EAAE;AAChH;AACA;AACA,mDAAmD;AACnD,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,iCAAiC;AACpE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,gGAAgG,uBAAuB,EAAE;AACzH,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS,UAAU,yBAAyB;AAC5D;AACA;AACA,0DAA0D;AAC1D,SAAS,OAAO,+DAAiB,EAAE;AACnC,SAAS,8CAA8C,OAAO,sDAAQ,EAAE,GAAG;AAC3E,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,4CAA4C;AAC5C,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,8BAA8B;AACjE;AACA;AACA,8CAA8C;AAC9C,SAAS,oCAAoC;AAC7C,SAAS,OAAO,wDAAU;AAC1B,MAAM;AACN;AACA,kBAAkB,OAAO,mDAAK,4BAA4B;AAC1D,wBAAwB,OAAO,0DAAY,uCAAuC;AAClF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA,iBAAiB;AACjB;AACA;AACA,oBAAoB,OAAO,uDAAS,SAAS,yDAAW,IAAI;AAC5D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,uBAAuB;AAC1D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS,UAAU,4CAA4C;AAC/E;AACA;AACA,oDAAoD;AACpD,SAAS,OAAO,+DAAiB,EAAE;AACnC,SAAS,qCAAqC,OAAO,sDAAQ,EAAE,GAAG;AAClE,SAAS,6BAA6B,OAAO,oDAAM,yBAAyB,GAAG;AAC/E,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gDAAgD;AAChD,SAAS,wBAAwB;AACjC,SAAS,6BAA6B,OAAO,oDAAM,yBAAyB,GAAG;AAC/E,SAAS;AACT,MAAM;AACN;AACA,uBAAuB,OAAO,uDAAS,qCAAqC;AAC5E,wBAAwB,OAAO,mDAAK,iBAAiB;AACrD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb,kBAAkB,4DAAc;AAChC;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA,6CAA6C;AAC7C,SAAS,wBAAwB;AACjC,SAAS,6BAA6B,OAAO,oDAAM,yBAAyB,GAAG;AAC/E,SAAS,oBAAoB;AAC7B,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,sEAAwB,EAAE;AAC1C,SAAS,OAAO,8DAAgB,EAAE;AAClC,SAAS,6BAA6B,OAAO,oDAAM,oBAAoB;AACvE,MAAM;AACN;AACA,sBAAsB,OAAO,mDAAK,mCAAmC;AACrE,qBAAqB,OAAO,mDAAK,iBAAiB;AAClD,oBAAoB,OAAO,0DAAY,oBAAoB;AAC3D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,yCAAyC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B,OAAO,oDAAM,yBAAyB,GAAG;AAC/E,SAAS;AACT,MAAM;AACN;AACA,mBAAmB,OAAO,0DAAY,uBAAuB;AAC7D,sBAAsB,OAAO,0DAAY,0BAA0B;AACnE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,wDAAwD;AACxD,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAU,gBAAgB,OAAO,sDAAQ,EAAE;AAC3D,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA,iEAAiE,8BAA8B,EAAE;AACjG,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,0CAA0C;AAC1C,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B,OAAO,oDAAM,oBAAoB,GAAG;AAC1E,SAAS;AACT,MAAM;AACN;AACA,6BAA6B,OAAO,6DAAe,sBAAsB,oBAAoB,IAAI;AACjG;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,uCAAuC,4CAAO;AAC9C,qCAAqC,4CAAO;AAC5C;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0DAAY;AACjD;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iDAAiD;AACjD,SAAS,2BAA2B;AACpC,SAAS,+BAA+B;AACxC,SAAS,4CAA4C;AACrD,SAAS;AACT,MAAM;AACN;AACA,uBAAuB,OAAO,mDAAK,wCAAwC;AAC3E,qBAAqB,OAAO,mDAAK,sCAAsC;AACvE,6BAA6B,OAAO,oDAAM,4CAA4C;AACtF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA,iCAAiC,4CAAO;AACxC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C;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,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,oDAAoD,0BAA0B,EAAE;AAChF;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,iEAAK,iBAAiB,iEAAK,EAAE,cAAc;AACvE,4BAA4B,iEAAK,kBAAkB,iEAAK,EAAE,0DAA0D;AACpH,4BAA4B,sEAAU,6CAA6C,mEAAO;AAC1F;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,sDAAsD;AACtD,SAAS,eAAe;AACxB,SAAS,4CAA4C;AACrD,SAAS,gCAAgC;AACzC,SAAS,2BAA2B;AACpC,SAAS;AACT,MAAM;AACN;AACA,oBAAoB,OAAO,yDAAW,gCAAgC;AACtE,6BAA6B,OAAO,mDAAK,0CAA0C;AACnF,0BAA0B,OAAO,oDAAM,gDAAgD;AACvF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,0CAA0C,oBAAoB,EAAE;AACnG;AACA;AACA,qDAAqD;AACrD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,qDAAqD;AACrD,SAAS,8CAA8C,OAAO,sDAAQ,EAAE;AACxE,MAAM;AACN;AACA,gCAAgC,OAAO,0DAAY,oBAAoB;AACvE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,8FAA8F;AAChI;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,mDAAmD;AACnD,SAAS,gCAAgC,OAAO,oDAAM,SAAS,wDAAQ,IAAI;AAC3E,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0DAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0DAAY;AACxC;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,+rCAA+rC,SAAS;AACxsC;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,sEAAU,gBAAgB,iEAAK,EAAE,8CAA8C,GAAG,mEAAO;AACrH,4BAA4B,sEAAU,gBAAgB,mEAAO,qBAAqB,iEAAK,EAAE,8CAA8C;AACvI;AACA,wBAAwB,mEAAO;AAC/B,4BAA4B,sEAAU,eAAe,iEAAK,EAAE,aAAa,GAAG,mEAAO,qBAAqB,iEAAK,EAAE,gBAAgB;AAC/H,4BAA4B,sEAAU,eAAe,mEAAO,qBAAqB,iEAAK,EAAE,aAAa;AACrG;AACA;AACA;AACA,+CAA+C,eAAe,EAAE,sBAAsB,iBAAiB,EAAE;AACzG,iBAAiB;AACjB;AACA;AACA,2CAA2C;AAC3C,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAClC,SAAS,6BAA6B,OAAO,oDAAM,sBAAsB;AACzE,MAAM;AACN;AACA,qBAAqB,OAAO,uDAAS,+BAA+B;AACpE,iBAAiB,OAAO,yDAAW,yBAAyB,GAAG,OAAO,mDAAK,2BAA2B;AACtG,wBAAwB,OAAO,oDAAM,iCAAiC;AACtE,oBAAoB,OAAO,mDAAK,+BAA+B;AAC/D,gBAAgB,OAAO,mDAAK,2BAA2B;AACvD,0BAA0B,OAAO,mDAAK,qCAAqC;AAC3E,yBAAyB,OAAO,mDAAK,oCAAoC;AACzE,+BAA+B,OAAO,mDAAK,4CAA4C;AACvF,qBAAqB,OAAO,mDAAK,mCAAmC;AACpE,oBAAoB,OAAO,oDAAM,qCAAqC;AACtE,iBAAiB,OAAO,0DAAY,gCAAgC;AACpE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,iBAAiB,4FAA4F;AAC7G,mBAAmB,6FAA6F;AAChH,kBAAkB,2FAA2F;AAC7G,kBAAkB,4FAA4F;AAC9G,qBAAqB,4FAA4F;AACjH,qBAAqB,0FAA0F;AAC/G,qBAAqB,0FAA0F;AAC/G,sBAAsB,4FAA4F;AAClH,oBAAoB,0FAA0F;AAC9G,oBAAoB,0FAA0F;AAC9G,oBAAoB,6FAA6F;AACjH,iBAAiB,6FAA6F;AAC9G,cAAc,4FAA4F;AAC1G;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uDAAS;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,qDAAqD;AACrD,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAU,gBAAgB,OAAO,sDAAQ,EAAE,GAAG,OAAO,oDAAM,gCAAgC,GAAG;AAC9G,SAAS;AACT,MAAM;AACN;AACA,oBAAoB,OAAO,mDAAK,0BAA0B;AAC1D;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA,qBAAqB;AACrB,gDAAgD,4CAA4C,wDAAU,EAAE;AACxG,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA,WAAW,EAAE;AACb;AACA;AACA,IAAI,uDAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,oDAAoD;AACpD,SAAS,OAAO,sDAAQ,EAAE;AAC1B,SAAS,OAAO,wDAAU,gBAAgB,OAAO,sDAAQ,EAAE,GAAG,OAAO,oDAAM,gCAAgC;AAC3G,MAAM;AACN;AACA,oBAAoB,OAAO,mDAAK,0BAA0B;AAC1D,gBAAgB,OAAO,mDAAK,sBAAsB;AAClD;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,yCAAyC,4DAA4D,EAAE;AAC1I;AACA;AACA,oDAAoD;AACpD,SAAS;AACT,MAAM;AACN;AACA,uBAAuB,OAAO,0DAAY,yBAAyB,GAAG,OAAO,0DAAY,oBAAoB;AAC7G,uBAAuB,OAAO,0DAAY,yBAAyB,GAAG,OAAO,0DAAY,mBAAmB;AAC5G;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ,UAAU,oEAAoE;AACtG;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA,uCAAuC,4CAAO;AAC9C,mCAAmC,4CAAO;AAC1C,qCAAqC,4CAAO;AAC5C,qCAAqC,4CAAO;AAC5C,qCAAqC,4CAAO;AAC5C,qCAAqC,4CAAO;AAC5C;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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,+BAA+B,4CAAO;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB,4DAA4D,uBAAuB,EAAE;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;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;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;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,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;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,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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;AACA;AACA;AACA;AACA,mCAAmC,4CAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,4CAAO;AAC3C;AACA;AACA;AACA,mCAAmC,4CAAO;AAC1C;AACA;AACA;AACA,wCAAwC,4CAAO;AAC/C;AACA;AACA;AACA,iCAAiC,4CAAO;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,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;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,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;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,gBAAgB;AAChB;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;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;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,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;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,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;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,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,sCAAsC,sBAAsB;AAC5D,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,0DAA0D;AAC1D,SAAS,8BAA8B;AACvC,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,wDAAU;AAC1B;AACA;AACA,sDAAsD;AACtD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,0DAAY;AACnD;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,iBAAiB,OAAO,mDAAK,oBAAoB;AACjD,eAAe,OAAO,mDAAK,iBAAiB;AAC5C,oBAAoB,OAAO,mDAAK,4CAA4C;AAC5E,+BAA+B,OAAO,oDAAM,4BAA4B;AACxE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,+BAA+B;AAClE;AACA;AACA,uDAAuD;AACvD,SAAS,OAAO,yDAAW;AAC3B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,qCAAqC;AACxE;AACA;AACA,6DAA6D;AAC7D,SAAS,OAAO,yDAAW;AAC3B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,gCAAgC;AACnE;AACA;AACA,wDAAwD;AACxD,SAAS,OAAO,yDAAW;AAC3B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,6BAA6B;AAChE;AACA;AACA,qDAAqD;AACrD,SAAS,OAAO,yDAAW;AAC3B,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;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,0CAA0C,0DAAY;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,0DAAY;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,0DAAY;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0DAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0DAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,0DAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,0DAAY;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,0DAAY;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,0DAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,0DAAY;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,0DAAY;AACpD,uCAAuC,0DAAY;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;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,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;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,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;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,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA,SAAS;AACT;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,oBAAoB;AACpB;AACA;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;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,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;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,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,uBAAuB,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;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,gBAAgB;AAChB;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,gDAAgD;AAChD,SAAS,gCAAgC;AACzC,SAAS,8BAA8B;AACvC,SAAS;AACT,MAAM;AACN;AACA,qBAAqB,OAAO,0DAAY,+BAA+B;AACvE,wBAAwB,OAAO,0DAAY,kCAAkC;AAC7E,oBAAoB,OAAO,0DAAY,iCAAiC;AACxE,0BAA0B,OAAO,0DAAY,uCAAuC;AACpF,4BAA4B,OAAO,mDAAK,wCAAwC;AAChF,kCAAkC,OAAO,oDAAM,8CAA8C;AAC7F,gCAAgC,OAAO,mDAAK,4CAA4C;AACxF,sCAAsC,OAAO,oDAAM,kDAAkD;AACrG,0BAA0B,OAAO,mDAAK,0CAA0C;AAChF,sBAAsB,OAAO,mDAAK,gDAAgD;AAClF,4BAA4B,OAAO,oDAAM,sDAAsD;AAC/F,oBAAoB,OAAO,mDAAK,8CAA8C;AAC9E,oBAAoB,OAAO,oDAAM,oCAAoC;AACrE,kBAAkB,OAAO,oDAAM,kCAAkC;AACjE,wBAAwB,OAAO,oDAAM,oCAAoC;AACzE,+BAA+B,OAAO,oDAAM,kCAAkC;AAC9E,iCAAiC,OAAO,oDAAM,oCAAoC;AAClF,6BAA6B,OAAO,oDAAM,gCAAgC;AAC1E,+BAA+B,OAAO,oDAAM,kCAAkC;AAC9E,gCAAgC,OAAO,oDAAM,mCAAmC;AAChF,+BAA+B,OAAO,oDAAM,wCAAwC;AACpF,eAAe,OAAO,mDAAK,iBAAiB;AAC5C;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;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;AACA;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,0DAAY;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0DAAY;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0DAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,0DAAY;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0DAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,0DAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;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,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;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,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;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,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,gBAAgB;AAChB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,mBAAmB,EAAE;AACrB;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,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;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,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,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,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;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,GAAG;AAClB,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,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,4CAA4C,2BAA2B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,4CAA4C,2BAA2B;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;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,gBAAgB;AAChB;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,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,EAAE;AACrB;AACA,mBAAmB,EAAE;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,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;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,4CAA4C;AAC5C,SAAS,gCAAgC;AACzC,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC,SAAS,OAAO,wDAAU,EAAE;AAC5B,SAAS,OAAO,6DAAe;AAC/B,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,4BAA4B;AACxD,wBAAwB,OAAO,mDAAK,8CAA8C;AAClF,oBAAoB,OAAO,mDAAK,gCAAgC;AAChE,yBAAyB,OAAO,mDAAK,4BAA4B;AACjE,wBAAwB,OAAO,oDAAM,kCAAkC;AACvE,oBAAoB,OAAO,oDAAM,gCAAgC;AACjE,0BAA0B,OAAO,oDAAM,gCAAgC;AACvE,mBAAmB,OAAO,oDAAM,+BAA+B;AAC/D,iBAAiB,OAAO,6DAAe,0BAA0B;AACjE,yBAAyB,OAAO,6DAAe,kCAAkC;AACjF,8BAA8B,OAAO,oDAAM,0CAA0C;AACrF,sBAAsB,OAAO,oDAAM,8BAA8B;AACjE,0BAA0B,OAAO,oDAAM,kCAAkC;AACzE,oBAAoB,OAAO,mDAAK,0CAA0C;AAC1E,sBAAsB,OAAO,mDAAK,4CAA4C;AAC9E,0BAA0B,OAAO,mDAAK,yCAAyC;AAC/E,0BAA0B,OAAO,mDAAK,sCAAsC;AAC5E,gCAAgC,OAAO,mDAAK,6CAA6C;AACzF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,0DAAY;AAC1C;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,eAAe,GAAG;AAClB,eAAe,GAAG;AAClB,gBAAgB;AAChB;AACA;AACA,sCAAsC,mBAAmB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA,uBAAuB,EAAE;AACzB;AACA,uBAAuB,EAAE;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,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,uBAAuB,EAAE;AACzB;AACA,uBAAuB,EAAE;AACzB;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,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B,oEAAoE;AAC/F,oDAAoD,eAAe,EAAE;AACrE,iBAAiB;AACjB;AACA;AACA,kDAAkD;AAClD,SAAS,gCAAgC;AACzC,SAAS;AACT,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,mBAAmB;AAC/C,oBAAoB,OAAO,mDAAK,sCAAsC;AACtE,kBAAkB,OAAO,mDAAK,oCAAoC;AAClE,sBAAsB,OAAO,oDAAM,qCAAqC;AACxE;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS,UAAU,qDAAqD;AACxF;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA,2BAA2B;AAC3B,iBAAiB;AACjB;AACA;AACA,mDAAmD;AACnD,SAAS;AACT,MAAM;AACN;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,uDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,uDAAuD;AACvD,SAAS,gCAAgC;AACzC,SAAS;AACT,MAAM;AACN;AACA,gBAAgB,OAAO,mDAAK,mBAAmB;AAC/C;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB,8BAA8B,4DAAY;AAC1C;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,sDAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,CAAC;;AAED;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;;AAEA;AACA;AACA,cAAc,oCAAoC;AAClD;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,uCAAuC,0DAAY;AACnD,0BAA0B,0DAAY;AACtC;AACA;AACA;AACA;AACA,8CAA8C;AAC9C,8CAA8C;AAC9C;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,SAAS;AACT;AACA,mBAAmB,EAAE;AACrB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AAC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","file":"search-search-module.js","sourcesContent":["import { Directive, NgModule, EventEmitter, Input, Output, TemplateRef, ViewContainerRef, Optional, Injectable, Component, SkipSelf, ViewChild, forwardRef, ElementRef, Renderer2, NgZone, ContentChildren, QueryList, HostBinding, HostListener, InjectionToken, Injector, ComponentFactoryResolver, Inject, IterableDiffers, ContentChild, ChangeDetectorRef, PLATFORM_ID, LOCALE_ID, defineInjectable, Self } from '@angular/core';\nimport { CommonModule, DOCUMENT, isPlatformBrowser, FormatWidth, FormStyle, getLocaleDateFormat, getLocaleDayNames, getLocaleFirstDayOfWeek, getLocaleMonthNames, TranslationWidth, NgForOf } from '@angular/common';\nimport { __extends, __values, __read, __spread, __assign } from 'tslib';\nimport { Subject, BehaviorSubject, combineLatest, isObservable } from 'rxjs';\nimport { animate, keyframes, style, transition, trigger, state } from '@angular/animations';\nimport { NgControl, FormsModule, SelectMultipleControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { first, filter, map } from 'rxjs/operators';\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrIconCustomTag = /** @class */ (function () {\n    function ClrIconCustomTag() {\n    }\n    ClrIconCustomTag.decorators = [\n        { type: Directive, args: [{ selector: 'clr-icon' },] }\n    ];\n    return ClrIconCustomTag;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_ICON_DIRECTIVES = [ClrIconCustomTag];\nvar ClrIconModule = /** @class */ (function () {\n    function ClrIconModule() {\n    }\n    ClrIconModule.decorators = [\n        { type: NgModule, args: [{ imports: [CommonModule], declarations: [CLR_ICON_DIRECTIVES], exports: [CLR_ICON_DIRECTIVES] },] }\n    ];\n    return ClrIconModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @enum {number} */\nvar Point = {\n    RIGHT_CENTER: 0,\n    RIGHT_TOP: 1,\n    RIGHT_BOTTOM: 2,\n    TOP_CENTER: 3,\n    TOP_RIGHT: 4,\n    TOP_LEFT: 5,\n    BOTTOM_CENTER: 6,\n    BOTTOM_RIGHT: 7,\n    BOTTOM_LEFT: 8,\n    LEFT_CENTER: 9,\n    LEFT_TOP: 10,\n    LEFT_BOTTOM: 11,\n};\nPoint[Point.RIGHT_CENTER] = 'RIGHT_CENTER';\nPoint[Point.RIGHT_TOP] = 'RIGHT_TOP';\nPoint[Point.RIGHT_BOTTOM] = 'RIGHT_BOTTOM';\nPoint[Point.TOP_CENTER] = 'TOP_CENTER';\nPoint[Point.TOP_RIGHT] = 'TOP_RIGHT';\nPoint[Point.TOP_LEFT] = 'TOP_LEFT';\nPoint[Point.BOTTOM_CENTER] = 'BOTTOM_CENTER';\nPoint[Point.BOTTOM_RIGHT] = 'BOTTOM_RIGHT';\nPoint[Point.BOTTOM_LEFT] = 'BOTTOM_LEFT';\nPoint[Point.LEFT_CENTER] = 'LEFT_CENTER';\nPoint[Point.LEFT_TOP] = 'LEFT_TOP';\nPoint[Point.LEFT_BOTTOM] = 'LEFT_BOTTOM';\n/** @type {?} */\nvar POSITION_RELATIVE = 'relative';\n/** @type {?} */\nvar POSITION_ABSOLUTE = 'absolute';\n/** @type {?} */\nvar POSITION_FIXED = 'fixed';\n/** @type {?} */\nvar OVERFLOW_SCROLL = 'scroll';\n/** @type {?} */\nvar OVERFLOW_AUTO = 'auto';\nvar Popover = /** @class */ (function () {\n    function Popover(element) {\n        this.element = element;\n        /*\n             * Containers up to the first positioned one will have an event on scroll\n             */\n        this.scrollableElements = [];\n        this.boundOnScrollListener = this.emitScrollEvent.bind(this);\n        // Browsers don't agree with what to do if some of these are not specified, so we set them all to be safe.\n        element.style.position = POSITION_ABSOLUTE;\n        element.style.top = 0;\n        element.style.bottom = 'auto';\n        element.style.left = 0;\n        element.style.right = 'auto';\n    }\n    // TODO: need a way to account for parameters that change dynamically (positioning).\n    // TODO: need a way to account for parameters that change dynamically (positioning).\n    /**\n     * @param {?} anchor\n     * @param {?} anchorAlign\n     * @param {?} popoverAlign\n     * @param {?=} __3\n     * @return {?}\n     */\n    Popover.prototype.anchor = \n    // TODO: need a way to account for parameters that change dynamically (positioning).\n    /**\n     * @param {?} anchor\n     * @param {?} anchorAlign\n     * @param {?} popoverAlign\n     * @param {?=} __3\n     * @return {?}\n     */\n    function (anchor, anchorAlign, popoverAlign, _a) {\n        // TODO: we are assuming here that the popover is inside or next to the anchor.\n        // We'd need to go up the popover tree too otherwise\n        var _b = _a === void 0 ? {} : _a, _c = _b.offsetX, offsetX = _c === void 0 ? 0 : _c, _d = _b.offsetY, offsetY = _d === void 0 ? 0 : _d, _e = _b.useAnchorParent, useAnchorParent = _e === void 0 ? false : _e;\n        this.addScrollEventListeners(anchor);\n        if (useAnchorParent) {\n            anchor = anchor.parentNode;\n        }\n        // explicitly override anchor's style to static\n        anchor.style.position = 'static';\n        /** @type {?} */\n        var anchorRect = anchor.getBoundingClientRect();\n        /** @type {?} */\n        var popoverRect = this.element.getBoundingClientRect();\n        // position of left top corner of anchor + the offset\n        /** @type {?} */\n        var leftDiff = anchorRect.left - popoverRect.left + offsetX;\n        /** @type {?} */\n        var topDiff = anchorRect.top - popoverRect.top + offsetY;\n        // first, adjust positioning based on anchor's align point\n        switch (anchorAlign) {\n            case Point.LEFT_TOP:\n            case Point.TOP_LEFT:\n                break;\n            case Point.TOP_CENTER:\n                leftDiff += anchorRect.width / 2;\n                break;\n            case Point.TOP_RIGHT:\n                leftDiff += anchorRect.width;\n                break;\n            case Point.RIGHT_TOP:\n                leftDiff += anchorRect.width;\n                break;\n            case Point.LEFT_BOTTOM:\n                topDiff += anchorRect.height;\n                break;\n            case Point.BOTTOM_LEFT:\n                topDiff += anchorRect.height;\n                break;\n            case Point.BOTTOM_CENTER:\n                topDiff += anchorRect.height;\n                leftDiff += anchorRect.width / 2;\n                break;\n            case Point.BOTTOM_RIGHT:\n                topDiff += anchorRect.height;\n                leftDiff += anchorRect.width;\n                break;\n            case Point.RIGHT_BOTTOM:\n                topDiff += anchorRect.height;\n                leftDiff += anchorRect.width;\n                break;\n            case Point.LEFT_CENTER:\n                topDiff += anchorRect.height / 2;\n                break;\n            case Point.RIGHT_CENTER:\n                topDiff += anchorRect.height / 2;\n                leftDiff += anchorRect.width;\n                break;\n            default:\n        }\n        // second, adjust positioning based on popover's align point\n        switch (popoverAlign) {\n            case Point.LEFT_TOP:\n            case Point.TOP_LEFT:\n                break;\n            case Point.TOP_CENTER:\n                leftDiff -= popoverRect.width / 2;\n                break;\n            case Point.TOP_RIGHT:\n                leftDiff -= popoverRect.width;\n                break;\n            case Point.RIGHT_TOP:\n                leftDiff -= popoverRect.width;\n                break;\n            case Point.LEFT_BOTTOM:\n                topDiff -= popoverRect.height;\n                break;\n            case Point.BOTTOM_LEFT:\n                topDiff -= popoverRect.height;\n                break;\n            case Point.BOTTOM_CENTER:\n                topDiff -= popoverRect.height;\n                leftDiff -= popoverRect.width / 2;\n                break;\n            case Point.BOTTOM_RIGHT:\n                topDiff -= popoverRect.height;\n                leftDiff -= popoverRect.width;\n                break;\n            case Point.RIGHT_BOTTOM:\n                topDiff -= popoverRect.height;\n                leftDiff -= popoverRect.width;\n                break;\n            case Point.LEFT_CENTER:\n                topDiff -= popoverRect.height / 2;\n                break;\n            case Point.RIGHT_CENTER:\n                topDiff -= popoverRect.height / 2;\n                leftDiff -= popoverRect.width;\n                break;\n            default:\n        }\n        // Third, adjust with popover's margins based on the two align points.\n        // Here, we make an assumption that popover is primarily positioned outside the\n        // anchor with minor offset. Without this assumption, it's impossible to apply\n        // the popover's margins in a predictable way. For example, assume that a popover\n        // and its anchor are exactly the same size. if a popover is positioned inside the\n        // anchor (which is technically possible), then it becomes impossible to know what to do\n        // if the popover has a non-zero margin value all around (because applying the margin in\n        // all four directions will result in no margin visually, which isn't what we want).\n        // Therefore, our logic makes assumptions about margins of interest given the points,\n        // and only covers the cases where popover is outside the anchor.\n        /** @type {?} */\n        var popoverComputedStyle = getComputedStyle(this.element);\n        /** @type {?} */\n        var marginLeft = parseInt(popoverComputedStyle.marginLeft, 10);\n        /** @type {?} */\n        var marginRight = parseInt(popoverComputedStyle.marginRight, 10);\n        /** @type {?} */\n        var marginTop = parseInt(popoverComputedStyle.marginTop, 10);\n        /** @type {?} */\n        var marginBottom = parseInt(popoverComputedStyle.marginBottom, 10);\n        switch (anchorAlign) {\n            case Point.LEFT_TOP:\n            case Point.TOP_LEFT:\n            case Point.TOP_RIGHT:\n            case Point.RIGHT_TOP:\n                if (popoverAlign === Point.BOTTOM_RIGHT || popoverAlign === Point.RIGHT_BOTTOM) {\n                    topDiff -= marginBottom;\n                    leftDiff -= marginRight;\n                }\n                if (popoverAlign === Point.BOTTOM_LEFT || popoverAlign === Point.LEFT_BOTTOM) {\n                    topDiff -= marginTop;\n                    leftDiff += marginLeft;\n                }\n                if (popoverAlign === Point.TOP_LEFT || popoverAlign === Point.LEFT_TOP) {\n                    topDiff += marginTop;\n                    leftDiff += marginLeft;\n                }\n                if (popoverAlign === Point.TOP_RIGHT || popoverAlign === Point.RIGHT_TOP) {\n                    topDiff += marginTop;\n                    leftDiff -= marginRight;\n                }\n                break;\n            case Point.LEFT_BOTTOM:\n            case Point.BOTTOM_LEFT:\n            case Point.BOTTOM_RIGHT:\n            case Point.RIGHT_BOTTOM:\n                if (popoverAlign === Point.BOTTOM_LEFT || popoverAlign === Point.LEFT_BOTTOM) {\n                    topDiff -= marginBottom;\n                    leftDiff += marginLeft;\n                }\n                if (popoverAlign === Point.BOTTOM_RIGHT || popoverAlign === Point.RIGHT_BOTTOM) {\n                    topDiff -= marginBottom;\n                    leftDiff -= marginRight;\n                }\n                if (popoverAlign === Point.TOP_LEFT || popoverAlign === Point.LEFT_TOP) {\n                    topDiff += marginTop;\n                    leftDiff += marginLeft;\n                }\n                if (popoverAlign === Point.TOP_RIGHT || popoverAlign === Point.RIGHT_TOP) {\n                    topDiff += marginTop;\n                    leftDiff -= marginRight;\n                }\n                break;\n            case Point.TOP_CENTER:\n                topDiff -= marginBottom;\n                leftDiff += marginLeft;\n                leftDiff -= marginRight;\n                break;\n            case Point.BOTTOM_CENTER:\n                topDiff += marginTop;\n                leftDiff += marginLeft;\n                leftDiff -= marginRight;\n                break;\n            case Point.LEFT_CENTER:\n                topDiff += marginTop;\n                topDiff -= marginBottom;\n                leftDiff -= marginRight;\n                break;\n            case Point.RIGHT_CENTER:\n                topDiff += marginTop;\n                topDiff -= marginBottom;\n                leftDiff += marginLeft;\n                break;\n            default:\n        }\n        this.element.style.transform = \"translateX(\" + Math.round(leftDiff) + \"px) translateY(\" + Math.round(topDiff) + \"px)\";\n        return this._scroll.asObservable();\n    };\n    /**\n     * @return {?}\n     */\n    Popover.prototype.release = /**\n     * @return {?}\n     */\n    function () {\n        this.element.style.transform = '';\n        this.removeScrollEventListeners();\n    };\n    /**\n     * @param {?} container\n     * @return {?}\n     */\n    Popover.prototype.isPositioned = /**\n     * @param {?} container\n     * @return {?}\n     */\n    function (container) {\n        /** @type {?} */\n        var position = getComputedStyle(container).position;\n        return position === POSITION_RELATIVE || position === POSITION_ABSOLUTE || position === POSITION_FIXED;\n    };\n    /**\n     * @return {?}\n     */\n    Popover.prototype.emitScrollEvent = /**\n     * @return {?}\n     */\n    function () {\n        this._scroll.next();\n    };\n    /**\n     * @param {?} e\n     * @return {?}\n     */\n    Popover.prototype.addScrollEventListeners = /**\n     * @param {?} e\n     * @return {?}\n     */\n    function (e) {\n        this._scroll = new Subject();\n        /** @type {?} */\n        var anchor = e;\n        /** @type {?} */\n        var current = e;\n        while (current && current !== document) {\n            if (this.scrolls(current)) {\n                current.addEventListener('scroll', this.boundOnScrollListener);\n                this.scrollableElements.push(current);\n            }\n            if (current !== anchor && this.isPositioned(current)) {\n                break;\n            }\n            current = current.parentNode;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    Popover.prototype.removeScrollEventListeners = /**\n     * @return {?}\n     */\n    function () {\n        var e_1, _a;\n        try {\n            for (var _b = __values(this.scrollableElements), _c = _b.next(); !_c.done; _c = _b.next()) {\n                var elem = _c.value;\n                elem.removeEventListener('scroll', this.boundOnScrollListener);\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        this.scrollableElements.length = 0;\n        if (this._scroll) {\n            this._scroll.complete();\n            delete this._scroll;\n        }\n    };\n    /**\n     * @param {?} container\n     * @return {?}\n     */\n    Popover.prototype.scrolls = /**\n     * @param {?} container\n     * @return {?}\n     */\n    function (container) {\n        /** @type {?} */\n        var computedStyles = getComputedStyle(container);\n        return (computedStyles.overflowX === OVERFLOW_SCROLL ||\n            computedStyles.overflowX === OVERFLOW_AUTO ||\n            computedStyles.overflowY === OVERFLOW_SCROLL ||\n            computedStyles.overflowY === OVERFLOW_AUTO);\n    };\n    return Popover;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar openCount = 0;\n/** @type {?} */\nvar waiting = [];\n// pending create functions\nvar PopoverDirectiveOld = /** @class */ (function () {\n    function PopoverDirectiveOld(templateRef, viewContainer) {\n        this.templateRef = templateRef;\n        this.viewContainer = viewContainer;\n        this.popoverOptions = {};\n        this.clrPopoverOldChange = new EventEmitter(false);\n    }\n    Object.defineProperty(PopoverDirectiveOld.prototype, \"clrPopoverOld\", {\n        set: /**\n         * @param {?} open\n         * @return {?}\n         */\n        function (open) {\n            var _this = this;\n            if (open) {\n                if (this.popoverOptions.allowMultipleOpen) {\n                    this.createPopover();\n                }\n                else {\n                    if (openCount === 0) {\n                        this.createPopover();\n                    }\n                    else {\n                        waiting.push(function () {\n                            _this.createPopover();\n                        });\n                    }\n                }\n            }\n            else {\n                this.viewContainer.clear();\n                this.destroyPopover();\n                if (!this.popoverOptions.allowMultipleOpen) {\n                    if (waiting.length > 0) {\n                        /** @type {?} */\n                        var createPopoverFn = waiting.shift();\n                        createPopoverFn();\n                    }\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    PopoverDirectiveOld.prototype.createPopover = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        /** @type {?} */\n        var embeddedViewRef = (/** @type {?} */ (this.viewContainer.createEmbeddedView(this.templateRef)));\n        // TODO: Not sure of the risks associated with using this. Find an alternative.\n        // Needed for find the correct height and width of dynamically created views\n        // inside of the popover. For Eg: Button Groups\n        embeddedViewRef.detectChanges();\n        // filter out other nodes in the view ref so we are only left with element nodes\n        /** @type {?} */\n        var elementNodes = embeddedViewRef.rootNodes.filter(function (node) {\n            return node.nodeType === 1;\n        });\n        // we take the first element node in the embedded view; usually there should only be one anyways\n        this._popoverInstance = new Popover(elementNodes[0]);\n        this._subscription = this._popoverInstance\n            .anchor(this.anchorElem, this.anchorPoint, this.popoverPoint, this.popoverOptions)\n            .subscribe(function () {\n            _this.clrPopoverOldChange.emit(false);\n        });\n        openCount++;\n    };\n    /**\n     * @return {?}\n     */\n    PopoverDirectiveOld.prototype.destroyPopover = /**\n     * @return {?}\n     */\n    function () {\n        if (this._popoverInstance) {\n            this._subscription.unsubscribe();\n            this._popoverInstance.release();\n            delete this._popoverInstance;\n            openCount--;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    PopoverDirectiveOld.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.destroyPopover();\n    };\n    PopoverDirectiveOld.decorators = [\n        { type: Directive, args: [{ selector: '[clrPopoverOld]' },] }\n    ];\n    /** @nocollapse */\n    PopoverDirectiveOld.ctorParameters = function () { return [\n        { type: TemplateRef },\n        { type: ViewContainerRef }\n    ]; };\n    PopoverDirectiveOld.propDecorators = {\n        anchorElem: [{ type: Input, args: ['clrPopoverOldAnchor',] }],\n        anchorPoint: [{ type: Input, args: ['clrPopoverOldAnchorPoint',] }],\n        popoverPoint: [{ type: Input, args: ['clrPopoverOldPopoverPoint',] }],\n        popoverOptions: [{ type: Input, args: ['clrPopoverOldOptions',] }],\n        clrPopoverOldChange: [{ type: Output, args: ['clrPopoverOldChange',] }],\n        clrPopoverOld: [{ type: Input }]\n    };\n    return PopoverDirectiveOld;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar POPOVER_DIRECTIVES = [PopoverDirectiveOld];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrCommonPopoverModule = /** @class */ (function () {\n    function ClrCommonPopoverModule() {\n    }\n    ClrCommonPopoverModule.decorators = [\n        { type: NgModule, args: [{ imports: [CommonModule], declarations: [POPOVER_DIRECTIVES], exports: [POPOVER_DIRECTIVES] },] }\n    ];\n    return ClrCommonPopoverModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * This is an abstract class because we need it to still be a valid token for dependency injection after transpiling.\n * This does not mean you should extend it, simply implementing it is fine.\n * @abstract\n */\nvar  /**\n * This is an abstract class because we need it to still be a valid token for dependency injection after transpiling.\n * This does not mean you should extend it, simply implementing it is fine.\n * @abstract\n */\nLoadingListener = /** @class */ (function () {\n    function LoadingListener() {\n    }\n    return LoadingListener;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @enum {number} */\nvar ClrLoadingState = {\n    DEFAULT: 0,\n    LOADING: 1,\n    SUCCESS: 2,\n    ERROR: 3,\n};\nClrLoadingState[ClrLoadingState.DEFAULT] = 'DEFAULT';\nClrLoadingState[ClrLoadingState.LOADING] = 'LOADING';\nClrLoadingState[ClrLoadingState.SUCCESS] = 'SUCCESS';\nClrLoadingState[ClrLoadingState.ERROR] = 'ERROR';\nvar ClrLoading = /** @class */ (function () {\n    // We find the first parent that handles something loading\n    function ClrLoading(listener) {\n        this.listener = listener;\n        this._loadingState = ClrLoadingState.DEFAULT;\n    }\n    Object.defineProperty(ClrLoading.prototype, \"loadingState\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._loadingState;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value === true) {\n                value = ClrLoadingState.LOADING;\n            }\n            else if (!value) {\n                value = ClrLoadingState.DEFAULT;\n            }\n            if (value === this._loadingState) {\n                return;\n            }\n            this._loadingState = value;\n            if (this.listener) {\n                this.listener.loadingStateChange(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrLoading.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.loadingState = ClrLoadingState.DEFAULT;\n    };\n    ClrLoading.decorators = [\n        { type: Directive, args: [{ selector: '[clrLoading]' },] }\n    ];\n    /** @nocollapse */\n    ClrLoading.ctorParameters = function () { return [\n        { type: LoadingListener, decorators: [{ type: Optional }] }\n    ]; };\n    ClrLoading.propDecorators = {\n        loadingState: [{ type: Input, args: ['clrLoading',] }]\n    };\n    return ClrLoading;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ButtonInGroupService = /** @class */ (function () {\n    function ButtonInGroupService() {\n        this._changes = new Subject();\n    }\n    Object.defineProperty(ButtonInGroupService.prototype, \"changes\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._changes.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} button\n     * @return {?}\n     */\n    ButtonInGroupService.prototype.updateButtonGroup = /**\n     * @param {?} button\n     * @return {?}\n     */\n    function (button) {\n        this._changes.next(button);\n    };\n    ButtonInGroupService.decorators = [\n        { type: Injectable }\n    ];\n    return ButtonInGroupService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrButton = /** @class */ (function () {\n    function ClrButton(buttonInGroupService) {\n        this.buttonInGroupService = buttonInGroupService;\n        this._enableService = false;\n        this._inMenu = false;\n        this._classNames = 'btn';\n        this._name = null;\n        this._type = null;\n        this._disabled = null;\n        this._click = new EventEmitter(false);\n    }\n    Object.defineProperty(ClrButton.prototype, \"inMenu\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._inMenu;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            value = !!value;\n            if (this._inMenu !== value) {\n                this._inMenu = value;\n                // We check if the service flag is enabled\n                // and if the service exists because the service is optional\n                if (this._enableService && this.buttonInGroupService) {\n                    this.buttonInGroupService.updateButtonGroup(this);\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrButton.prototype, \"classNames\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._classNames;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (typeof value === 'string') {\n                /** @type {?} */\n                var classNames = value.split(' ');\n                if (classNames.indexOf('btn') === -1) {\n                    classNames.push('btn');\n                }\n                this._classNames = classNames.join(' ');\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrButton.prototype, \"name\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._name;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (typeof value === 'string') {\n                this._name = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrButton.prototype, \"type\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._type;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (typeof value === 'string') {\n                this._type = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrButton.prototype, \"disabled\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._disabled;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value !== null && value !== false) {\n                this._disabled = '';\n            }\n            else {\n                this._disabled = null;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} state\n     * @return {?}\n     */\n    ClrButton.prototype.loadingStateChange = /**\n     * @param {?} state\n     * @return {?}\n     */\n    function (state$$1) {\n        this.loading = state$$1 === ClrLoadingState.LOADING;\n    };\n    /**\n     * @return {?}\n     */\n    ClrButton.prototype.emitClick = /**\n     * @return {?}\n     */\n    function () {\n        this._click.emit(true);\n    };\n    /**\n     * @return {?}\n     */\n    ClrButton.prototype.ngAfterViewInit = /**\n     * @return {?}\n     */\n    function () {\n        this._enableService = true;\n    };\n    ClrButton.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-button',\n                    template: \"\\n        <ng-template #buttonProjectedRef>\\n            <button \\n                [class]=\\\"classNames\\\" \\n                (click)=\\\"emitClick()\\\"\\n                [attr.type]=\\\"type\\\"\\n                [attr.name]=\\\"name\\\"\\n                [attr.disabled]=\\\"disabled\\\">\\n                <span class=\\\"spinner spinner-inline\\\" *ngIf=\\\"loading\\\"></span>\\n                <ng-content></ng-content>\\n            </button>\\n        </ng-template>\\n    \",\n                    providers: [{ provide: LoadingListener, useExisting: ClrButton }]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrButton.ctorParameters = function () { return [\n        { type: ButtonInGroupService, decorators: [{ type: SkipSelf }, { type: Optional }] }\n    ]; };\n    ClrButton.propDecorators = {\n        templateRef: [{ type: ViewChild, args: ['buttonProjectedRef',] }],\n        inMenu: [{ type: Input, args: ['clrInMenu',] }],\n        classNames: [{ type: Input, args: ['class',] }],\n        name: [{ type: Input, args: ['name',] }],\n        type: [{ type: Input, args: ['type',] }],\n        disabled: [{ type: Input, args: ['disabled',] }],\n        _click: [{ type: Output, args: ['click',] }]\n    };\n    return ClrButton;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/** @type {?} */\nvar CLR_MENU_POSITIONS = [\n    'bottom-left',\n    'bottom-right',\n    'top-left',\n    'top-right',\n    'left-bottom',\n    'left-top',\n    'right-bottom',\n    'right-top',\n];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// @TODO Put the Required type back in when our minimumly supported version of Angular uses\n// TS 2.8 or greater (should be Angular 7)\n// export class ClrCommonStringsService implements Required<ClrCommonStrings> {\nvar \n// @TODO Put the Required type back in when our minimumly supported version of Angular uses\n// TS 2.8 or greater (should be Angular 7)\n// export class ClrCommonStringsService implements Required<ClrCommonStrings> {\nClrCommonStringsService = /** @class */ (function () {\n    function ClrCommonStringsService() {\n        this.open = 'Open';\n        this.close = 'Close';\n        this.show = 'Show';\n        this.hide = 'Hide';\n        this.expand = 'Expand';\n        this.collapse = 'Collapse';\n        this.more = 'More';\n        this.select = 'Select';\n        this.selectAll = 'Select All';\n        this.previous = 'Previous';\n        this.next = 'Next';\n        this.current = 'Jump to current';\n        this.info = 'Info';\n        this.success = 'Success';\n        this.warning = 'Warning';\n        this.danger = 'Error';\n        this.rowActions = 'Available actions';\n        this.pickColumns = 'Show or hide columns';\n    }\n    return ClrCommonStringsService;\n}());\n/**\n * @param {?=} existing\n * @return {?}\n */\nfunction commonStringsFactory(existing) {\n    /** @type {?} */\n    var defaults = new ClrCommonStringsService();\n    if (existing) {\n        return __assign({}, defaults, existing);\n    }\n    return defaults;\n}\n/** @type {?} */\nvar COMMON_STRINGS_PROVIDER = {\n    useFactory: commonStringsFactory,\n    // We have a circular dependency for now, we can address it later once these\n    // tree-shakeable providers have proper documentation.\n    deps: [[new Optional(), new SkipSelf(), forwardRef(function () { return ClrCommonStrings; })]],\n};\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @abstract\n */\nvar ClrCommonStrings = /** @class */ (function () {\n    function ClrCommonStrings() {\n    }\n    ClrCommonStrings.decorators = [\n        { type: Injectable, args: [__assign({ providedIn: 'root' }, COMMON_STRINGS_PROVIDER),] }\n    ];\n    /** @nocollapse */ ClrCommonStrings.ngInjectableDef = defineInjectable({ factory: function ClrCommonStrings_Factory() { return new ClrCommonStrings(); }, token: ClrCommonStrings, providedIn: \"root\" });\n    return ClrCommonStrings;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrButtonGroup = /** @class */ (function () {\n    function ClrButtonGroup(buttonGroupNewService, elementRef, commonStrings) {\n        this.buttonGroupNewService = buttonGroupNewService;\n        this.elementRef = elementRef;\n        this.commonStrings = commonStrings;\n        this.inlineButtons = [];\n        this.menuButtons = [];\n        this._openMenu = false;\n        this.anchorPoint = Point.BOTTOM_LEFT; // default if menuPosition isn't set\n        // default if menuPosition isn't set\n        this.popoverPoint = Point.LEFT_TOP; // default if menuPosition isn't set\n        /**\n         * Flag with indicates if the overflow menu toggle was clicked.\n         * If true, this can save us traversing the DOM to find\n         * whether the click was withing the button group toggle\n         * or menu in the onMouseClick method\n         */\n        this._overflowMenuToggleClicked = false;\n    }\n    /**\n     * 1. Initializes the initial Button Group View\n     * 2. Subscribes to changes on the ContentChildren\n     *    in case the user content projection changes\n     */\n    /**\n     * 1. Initializes the initial Button Group View\n     * 2. Subscribes to changes on the ContentChildren\n     *    in case the user content projection changes\n     * @return {?}\n     */\n    ClrButtonGroup.prototype.ngAfterContentInit = /**\n     * 1. Initializes the initial Button Group View\n     * 2. Subscribes to changes on the ContentChildren\n     *    in case the user content projection changes\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.initializeButtons();\n        this.buttonGroupNewService.changes.subscribe(function (button) { return _this.rearrangeButton(button); });\n        this.buttons.changes.subscribe(function () {\n            _this.initializeButtons();\n        });\n    };\n    /**\n     * Moves the button into the other ViewContainer\n     * when an update is received.\n     *\n     * @param button\n     */\n    /**\n     * Moves the button into the other ViewContainer\n     * when an update is received.\n     *\n     * @param {?} button\n     * @return {?}\n     */\n    ClrButtonGroup.prototype.rearrangeButton = /**\n     * Moves the button into the other ViewContainer\n     * when an update is received.\n     *\n     * @param {?} button\n     * @return {?}\n     */\n    function (button) {\n        /** @type {?} */\n        var fromView;\n        /** @type {?} */\n        var toView;\n        if (button.inMenu) {\n            fromView = this.inlineButtons;\n            toView = this.menuButtons;\n        }\n        else {\n            fromView = this.menuButtons;\n            toView = this.inlineButtons;\n        }\n        /** @type {?} */\n        var index = fromView.indexOf(button);\n        if (index > -1) {\n            fromView.splice(index, 1);\n            /** @type {?} */\n            var moveIndex = this.getMoveIndex(button);\n            if (moveIndex <= toView.length) {\n                toView.splice(moveIndex, 0, button);\n            }\n        }\n    };\n    /**\n     * Author: Eudes\n     *\n     * Finds the order of a button w.r.t other buttons\n     *\n     * @param buttonToMove\n     * @returns\n     */\n    /**\n     * Author: Eudes\n     *\n     * Finds the order of a button w.r.t other buttons\n     *\n     * @param {?} buttonToMove\n     * @return {?}\n     */\n    ClrButtonGroup.prototype.getMoveIndex = /**\n     * Author: Eudes\n     *\n     * Finds the order of a button w.r.t other buttons\n     *\n     * @param {?} buttonToMove\n     * @return {?}\n     */\n    function (buttonToMove) {\n        /** @type {?} */\n        var tempArr = this.buttons.filter(function (button) { return button.inMenu === buttonToMove.inMenu; });\n        return tempArr.indexOf(buttonToMove);\n    };\n    /**\n     * @return {?}\n     */\n    ClrButtonGroup.prototype.initializeButtons = /**\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var tempInlineButtons = [];\n        /** @type {?} */\n        var tempInMenuButtons = [];\n        this.buttons.forEach(function (button) {\n            if (button.inMenu) {\n                tempInMenuButtons.push(button);\n            }\n            else {\n                tempInlineButtons.push(button);\n            }\n        });\n        this.inlineButtons = tempInlineButtons;\n        this.menuButtons = tempInMenuButtons;\n    };\n    Object.defineProperty(ClrButtonGroup.prototype, \"menuPosition\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._menuPosition;\n        },\n        set: /**\n         * @param {?} pos\n         * @return {?}\n         */\n        function (pos) {\n            if (pos && CLR_MENU_POSITIONS.indexOf(pos) > -1) {\n                this._menuPosition = pos;\n            }\n            else {\n                this._menuPosition = 'bottom-left';\n            }\n            // set the popover values based on menu position\n            switch (this._menuPosition) {\n                case 'top-right':\n                    this.anchorPoint = Point.TOP_RIGHT;\n                    this.popoverPoint = Point.RIGHT_BOTTOM;\n                    break;\n                case 'top-left':\n                    this.anchorPoint = Point.TOP_LEFT;\n                    this.popoverPoint = Point.LEFT_BOTTOM;\n                    break;\n                case 'bottom-right':\n                    this.anchorPoint = Point.BOTTOM_RIGHT;\n                    this.popoverPoint = Point.RIGHT_TOP;\n                    break;\n                case 'bottom-left':\n                    this.anchorPoint = Point.BOTTOM_LEFT;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n                case 'right-top':\n                    this.anchorPoint = Point.RIGHT_TOP;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n                case 'right-bottom':\n                    this.anchorPoint = Point.RIGHT_BOTTOM;\n                    this.popoverPoint = Point.LEFT_BOTTOM;\n                    break;\n                case 'left-top':\n                    this.anchorPoint = Point.LEFT_TOP;\n                    this.popoverPoint = Point.RIGHT_TOP;\n                    break;\n                case 'left-bottom':\n                    this.anchorPoint = Point.LEFT_BOTTOM;\n                    this.popoverPoint = Point.RIGHT_BOTTOM;\n                    break;\n                default:\n                    this.anchorPoint = Point.BOTTOM_LEFT;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrButtonGroup.prototype, \"openMenu\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._openMenu;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._openMenu = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Toggle the ClrDropdown Menu when the ClrDropdown Toggle is\n     * clicked. Also set a flag that indicates that the toggle\n     * was clicked so that we don't traverse the DOM to find the\n     * location of the click.\n     */\n    // default if menuPosition isn't set\n    /**\n     * Toggle the ClrDropdown Menu when the ClrDropdown Toggle is\n     * clicked. Also set a flag that indicates that the toggle\n     * was clicked so that we don't traverse the DOM to find the\n     * location of the click.\n     * @return {?}\n     */\n    ClrButtonGroup.prototype.toggleMenu = \n    // default if menuPosition isn't set\n    /**\n     * Toggle the ClrDropdown Menu when the ClrDropdown Toggle is\n     * clicked. Also set a flag that indicates that the toggle\n     * was clicked so that we don't traverse the DOM to find the\n     * location of the click.\n     * @return {?}\n     */\n    function () {\n        this.openMenu = !this.openMenu;\n        this._overflowMenuToggleClicked = true;\n    };\n    // TODO: Generic Directive to handle this\n    /**\n     * Called on mouse clicks anywhere in the DOM.\n     * Checks to see if the mouseclick happened on the host or outside\n     */\n    // TODO: Generic Directive to handle this\n    /**\n     * Called on mouse clicks anywhere in the DOM.\n     * Checks to see if the mouseclick happened on the host or outside\n     * @param {?} target\n     * @return {?}\n     */\n    ClrButtonGroup.prototype.onMouseClick = \n    // TODO: Generic Directive to handle this\n    /**\n     * Called on mouse clicks anywhere in the DOM.\n     * Checks to see if the mouseclick happened on the host or outside\n     * @param {?} target\n     * @return {?}\n     */\n    function (target) {\n        if (this.openMenu && !this._overflowMenuToggleClicked) {\n            // Reset the overflow menu toggle clicked flag\n            this._overflowMenuToggleClicked = false;\n            /** @type {?} */\n            var current = target;\n            // Get the element in the DOM on which the mouse was clicked\n            /** @type {?} */\n            var host = this.elementRef.nativeElement;\n            if (current.classList.contains('dropdown-menu')) {\n                current = current.parentNode;\n                while (current) {\n                    if (current === document) {\n                        this.openMenu = false;\n                        return;\n                    }\n                    // If clicked on dropdown menu and menu is in host\n                    // do nothing\n                    if (current === host) {\n                        return;\n                    }\n                    current = current.parentNode;\n                }\n            }\n            this.openMenu = false;\n        }\n        this._overflowMenuToggleClicked = false; // Reset the overflow menu toggle clicked flag\n    };\n    ClrButtonGroup.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-button-group',\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<ng-container *ngFor=\\\"let inlineButton of inlineButtons\\\">\\n    <ng-template [ngTemplateOutlet]=\\\"inlineButton.templateRef\\\"></ng-template>\\n</ng-container>\\n<ng-container *ngIf=\\\"menuButtons.length > 0\\\">\\n    <div\\n        class=\\\"btn-group-overflow open\\\"\\n        [ngClass]=\\\"menuPosition\\\"\\n        #anchor>\\n        <button\\n            class=\\\"btn dropdown-toggle\\\"\\n            (click)=\\\"toggleMenu()\\\">\\n            <clr-icon shape=\\\"ellipsis-horizontal\\\" [attr.title]=\\\"commonStrings.more\\\"></clr-icon>\\n        </button>\\n        <div\\n            class=\\\"dropdown-menu\\\"\\n            *clrPopoverOld=\\\"openMenu; anchor: anchor; anchorPoint: anchorPoint; popoverPoint: popoverPoint;\\\">\\n            <ng-template [ngTemplateOutlet]=\\\"ref\\\"></ng-template>\\n        </div>\\n    </div>\\n</ng-container>\\n<ng-template #ref>\\n    <ng-container *ngFor=\\\"let menuButton of menuButtons\\\">\\n        <ng-template [ngTemplateOutlet]=\\\"menuButton.templateRef\\\"></ng-template>\\n    </ng-container>\\n</ng-template>\\n\",\n                    providers: [ButtonInGroupService],\n                    host: { '[class.btn-group]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrButtonGroup.ctorParameters = function () { return [\n        { type: ButtonInGroupService },\n        { type: ElementRef },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrButtonGroup.propDecorators = {\n        buttons: [{ type: ContentChildren, args: [ClrButton,] }],\n        menuPosition: [{ type: Input, args: ['clrMenuPosition',] }],\n        onMouseClick: [{ type: HostListener, args: ['document:click', ['$event.target'],] }]\n    };\n    return ClrButtonGroup;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_BUTTON_GROUP_DIRECTIVES = [ClrButton, ClrButtonGroup];\nvar ClrButtonGroupModule = /** @class */ (function () {\n    function ClrButtonGroupModule() {\n    }\n    ClrButtonGroupModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule, ClrCommonPopoverModule],\n                    declarations: [CLR_BUTTON_GROUP_DIRECTIVES],\n                    exports: [CLR_BUTTON_GROUP_DIRECTIVES],\n                },] }\n    ];\n    return ClrButtonGroupModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrLoadingButton = /** @class */ (function () {\n    function ClrLoadingButton(el, renderer) {\n        this.el = el;\n        this.renderer = renderer;\n        this.buttonState = ClrLoadingState;\n        this.state = ClrLoadingState.DEFAULT;\n        this.clrLoadingChange = new EventEmitter(false);\n    }\n    /**\n     * @param {?} state\n     * @return {?}\n     */\n    ClrLoadingButton.prototype.loadingStateChange = /**\n     * @param {?} state\n     * @return {?}\n     */\n    function (state$$1) {\n        if (state$$1 === this.state) {\n            return;\n        }\n        this.state = state$$1;\n        switch (state$$1) {\n            case ClrLoadingState.DEFAULT:\n                this.renderer.removeStyle(this.el.nativeElement, 'width');\n                this.renderer.removeStyle(this.el.nativeElement, 'transform'); // for chromium render bug see issue https://github.com/vmware/clarity/issues/2700\n                if (!this.disabled) {\n                    this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\n                }\n                break;\n            case ClrLoadingState.LOADING:\n                this.setExplicitButtonWidth();\n                this.renderer.setStyle(this.el.nativeElement, 'transform', 'translatez(0)'); // for chromium render bug see issue https://github.com/vmware/clarity/issues/2700\n                this.renderer.setAttribute(this.el.nativeElement, 'disabled', '');\n                break;\n            case ClrLoadingState.SUCCESS:\n                this.setExplicitButtonWidth();\n                break;\n            case ClrLoadingState.ERROR:\n                this.loadingStateChange(ClrLoadingState.DEFAULT);\n                break;\n            default:\n                break;\n        }\n        this.clrLoadingChange.emit(state$$1);\n    };\n    /**\n     * @return {?}\n     */\n    ClrLoadingButton.prototype.setExplicitButtonWidth = /**\n     * @return {?}\n     */\n    function () {\n        if (this.el.nativeElement && this.el.nativeElement.getBoundingClientRect) {\n            /** @type {?} */\n            var boundingClientRect = this.el.nativeElement.getBoundingClientRect();\n            this.renderer.setStyle(this.el.nativeElement, 'width', boundingClientRect.width + \"px\");\n        }\n    };\n    ClrLoadingButton.decorators = [\n        { type: Component, args: [{\n                    selector: 'button[clrLoading]',\n                    template: \"\\n        <ng-container [ngSwitch]=\\\"state\\\">\\n            <span *ngSwitchCase=\\\"buttonState.LOADING\\\">\\n                <span @spinner class=\\\"spinner spinner-inline\\\"></span>\\n            </span>\\n            <span *ngSwitchCase=\\\"buttonState.SUCCESS\\\">\\n                <span @validated (@validated.done)=\\\"this.loadingStateChange(this.buttonState.DEFAULT)\\\" class=\\\"spinner spinner-inline spinner-check\\\"></span>\\n            </span>\\n            <span *ngSwitchCase=\\\"buttonState.DEFAULT\\\" @defaultButton>\\n                <ng-content></ng-content>\\n            </span>\\n        </ng-container>\\n    \",\n                    providers: [{ provide: LoadingListener, useExisting: ClrLoadingButton }],\n                    animations: [\n                        trigger('defaultButton', [\n                            transition(':enter', [style({ opacity: 0 }), animate('200ms 100ms ease-in', style({ opacity: 1 }))]),\n                            // TODO: see if we can get leave animation to work before spinner's enter animation\n                            transition(':leave', [style({ opacity: 0 })]),\n                        ]),\n                        trigger('spinner', [\n                            transition(':enter', [style({ opacity: 0 }), animate('200ms 100ms ease-in', style({ opacity: 1 }))]),\n                            transition(':leave', [style({ opacity: 1 }), animate('100ms ease-out', style({ opacity: 0 }))]),\n                        ]),\n                        trigger('validated', [\n                            transition(':enter', [\n                                animate('600ms', keyframes([\n                                    style({ transform: 'scale(0,0)', offset: 0 }),\n                                    style({ opacity: 1, offset: 0.2 }),\n                                    style({ transform: 'scale(1.2,1.2)', offset: 0.4 }),\n                                    style({ transform: 'scale(.9,.9)', offset: 0.6 }),\n                                    style({ transform: 'scale(1,1)', offset: 1 }),\n                                ])),\n                            ]),\n                            transition(':leave', [style({ opacity: 1 }), animate('100ms ease-out', style({ opacity: 0 }))]),\n                        ]),\n                    ],\n                    host: { '[attr.disabled]': \"disabled? '' : null\" }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrLoadingButton.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: Renderer2 }\n    ]; };\n    ClrLoadingButton.propDecorators = {\n        disabled: [{ type: Input, args: ['disabled',] }],\n        clrLoadingChange: [{ type: Output, args: ['clrLoadingChange',] }]\n    };\n    return ClrLoadingButton;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_LOADING_BUTTON_DIRECTIVES = [ClrLoadingButton];\nvar ClrLoadingButtonModule = /** @class */ (function () {\n    function ClrLoadingButtonModule() {\n    }\n    ClrLoadingButtonModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule],\n                    declarations: [CLR_LOADING_BUTTON_DIRECTIVES],\n                    exports: [CLR_LOADING_BUTTON_DIRECTIVES],\n                },] }\n    ];\n    return ClrLoadingButtonModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrButtonModule = /** @class */ (function () {\n    function ClrButtonModule() {\n    }\n    ClrButtonModule.decorators = [\n        { type: NgModule, args: [{\n                    exports: [ClrLoadingButtonModule, ClrButtonGroupModule],\n                },] }\n    ];\n    return ClrButtonModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar EmptyAnchor = /** @class */ (function () {\n    function EmptyAnchor() {\n    }\n    EmptyAnchor.decorators = [\n        { type: Component, args: [{\n                    template: ''\n                }] }\n    ];\n    return EmptyAnchor;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * Internal module, please do not export!\n */\nvar ClrHostWrappingModule = /** @class */ (function () {\n    function ClrHostWrappingModule() {\n    }\n    ClrHostWrappingModule.decorators = [\n        { type: NgModule, args: [{ declarations: [EmptyAnchor], exports: [EmptyAnchor], entryComponents: [EmptyAnchor] },] }\n    ];\n    return ClrHostWrappingModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrControlError = /** @class */ (function () {\n    function ClrControlError() {\n    }\n    ClrControlError.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-control-error',\n                    template: \"\\n    <ng-content></ng-content>\\n    \",\n                    host: { '[class.clr-subtext]': 'true' }\n                }] }\n    ];\n    return ClrControlError;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrControlHelper = /** @class */ (function () {\n    function ClrControlHelper() {\n    }\n    ClrControlHelper.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-control-helper',\n                    template: \"\\n    <ng-content></ng-content>\\n    \",\n                    host: { '[class.clr-subtext]': 'true' }\n                }] }\n    ];\n    return ClrControlHelper;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar NgControlService = /** @class */ (function () {\n    function NgControlService() {\n        // Observable to subscribe to the control, since its not available immediately for projected content\n        this._controlChanges = new Subject();\n    }\n    Object.defineProperty(NgControlService.prototype, \"controlChanges\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._controlChanges.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} control\n     * @return {?}\n     */\n    NgControlService.prototype.setControl = /**\n     * @param {?} control\n     * @return {?}\n     */\n    function (control) {\n        this._controlChanges.next(control);\n    };\n    NgControlService.decorators = [\n        { type: Injectable }\n    ];\n    return NgControlService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar IfErrorService = /** @class */ (function () {\n    function IfErrorService(ngControlService) {\n        var _this = this;\n        this.ngControlService = ngControlService;\n        // Implement our own status changes observable, since Angular controls don't\n        // fire on events like blur, and we want to return the boolean state instead of a string\n        this._statusChanges = new Subject();\n        this.subscriptions = [];\n        // Wait for the control to be available\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            if (control) {\n                _this.control = control;\n                _this.listenForChanges();\n            }\n        }));\n    }\n    Object.defineProperty(IfErrorService.prototype, \"statusChanges\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._statusChanges.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // Subscribe to the status change events, only after touched and emit the control\n    // Subscribe to the status change events, only after touched and emit the control\n    /**\n     * @return {?}\n     */\n    IfErrorService.prototype.listenForChanges = \n    // Subscribe to the status change events, only after touched and emit the control\n    /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.subscriptions.push(this.control.statusChanges.subscribe(function () {\n            _this.sendValidity();\n        }));\n    };\n    /**\n     * @return {?}\n     */\n    IfErrorService.prototype.sendValidity = /**\n     * @return {?}\n     */\n    function () {\n        if ((this.control.touched || this.control.dirty) && this.control.invalid) {\n            this._statusChanges.next(true);\n        }\n        else {\n            this._statusChanges.next(false);\n        }\n    };\n    // Allows a control to push a status check upstream, such as on blur\n    // Allows a control to push a status check upstream, such as on blur\n    /**\n     * @return {?}\n     */\n    IfErrorService.prototype.triggerStatusChange = \n    // Allows a control to push a status check upstream, such as on blur\n    /**\n     * @return {?}\n     */\n    function () {\n        if (this.control) {\n            this.sendValidity();\n        }\n    };\n    // Clean up subscriptions\n    // Clean up subscriptions\n    /**\n     * @return {?}\n     */\n    IfErrorService.prototype.ngOnDestroy = \n    // Clean up subscriptions\n    /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    IfErrorService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    IfErrorService.ctorParameters = function () { return [\n        { type: NgControlService }\n    ]; };\n    return IfErrorService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrIfError = /** @class */ (function () {\n    function ClrIfError(ifErrorService, ngControlService, template, container) {\n        var _this = this;\n        this.ifErrorService = ifErrorService;\n        this.ngControlService = ngControlService;\n        this.template = template;\n        this.container = container;\n        this.subscriptions = [];\n        this.displayed = false;\n        if (!this.ifErrorService) {\n            throw new Error('clrIfError can only be used within a form control container element like clr-input-container');\n        }\n        else {\n            this.displayError(false);\n        }\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.control = control;\n        }));\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            // If there is a specific error to track, check it, otherwise check overall validity\n            if (_this.error && _this.control) {\n                _this.displayError(_this.control.hasError(_this.error));\n            }\n            else {\n                _this.displayError(invalid);\n            }\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrIfError.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @param {?} invalid\n     * @return {?}\n     */\n    ClrIfError.prototype.displayError = /**\n     * @param {?} invalid\n     * @return {?}\n     */\n    function (invalid) {\n        if (invalid && !this.displayed) {\n            this.container.createEmbeddedView(this.template);\n            this.displayed = true;\n        }\n        else if (!invalid) {\n            this.container.clear();\n            this.displayed = false;\n        }\n    };\n    ClrIfError.decorators = [\n        { type: Directive, args: [{ selector: '[clrIfError]' },] }\n    ];\n    /** @nocollapse */\n    ClrIfError.ctorParameters = function () { return [\n        { type: IfErrorService, decorators: [{ type: Optional }] },\n        { type: NgControlService, decorators: [{ type: Optional }] },\n        { type: TemplateRef },\n        { type: ViewContainerRef }\n    ]; };\n    ClrIfError.propDecorators = {\n        error: [{ type: Input, args: ['clrIfError',] }]\n    };\n    return ClrIfError;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar counter = 0;\nvar ControlIdService = /** @class */ (function () {\n    function ControlIdService() {\n        this._id = 'clr-form-control-' + ++counter;\n        this._idChange = new BehaviorSubject(this._id);\n    }\n    Object.defineProperty(ControlIdService.prototype, \"id\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._id;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._id = value;\n            this._idChange.next(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ControlIdService.prototype, \"idChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._idChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ControlIdService.decorators = [\n        { type: Injectable }\n    ];\n    return ControlIdService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @enum {string} */\nvar Layouts = {\n    VERTICAL: 'vertical',\n    HORIZONTAL: 'horizontal',\n    COMPACT: 'compact',\n};\nvar LayoutService = /** @class */ (function () {\n    function LayoutService() {\n        this.layout = Layouts.HORIZONTAL;\n        // This is basically a replacement for Object.values(), which IE11 and Node <9 don't support :(\n        // String enums cannot be reverse-mapped, meaning Layouts['COMPACT'] does not return 'compact' so\n        // this exists to deal with this little caveat to get the list of the values as an array.\n        this.layoutValues = Object.keys(Layouts).map(function (key) { return Layouts[key]; });\n    }\n    /**\n     * @return {?}\n     */\n    LayoutService.prototype.isVertical = /**\n     * @return {?}\n     */\n    function () {\n        return this.layout === Layouts.VERTICAL;\n    };\n    /**\n     * @return {?}\n     */\n    LayoutService.prototype.isHorizontal = /**\n     * @return {?}\n     */\n    function () {\n        return this.layout === Layouts.HORIZONTAL;\n    };\n    /**\n     * @return {?}\n     */\n    LayoutService.prototype.isCompact = /**\n     * @return {?}\n     */\n    function () {\n        return this.layout === Layouts.COMPACT;\n    };\n    Object.defineProperty(LayoutService.prototype, \"layoutClass\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return \"clr-form-\" + this.layout;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} layout\n     * @return {?}\n     */\n    LayoutService.prototype.isValid = /**\n     * @param {?} layout\n     * @return {?}\n     */\n    function (layout) {\n        return this.layoutValues.indexOf(layout) > -1;\n    };\n    LayoutService.decorators = [\n        { type: Injectable }\n    ];\n    return LayoutService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrLabel = /** @class */ (function () {\n    function ClrLabel(controlIdService, layoutService, ngControlService, renderer, el) {\n        this.controlIdService = controlIdService;\n        this.layoutService = layoutService;\n        this.ngControlService = ngControlService;\n        this.renderer = renderer;\n        this.el = el;\n        this.subscriptions = [];\n    }\n    /**\n     * @return {?}\n     */\n    ClrLabel.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        // Only add the clr-control-label if it is inside a control container\n        if (this.controlIdService || this.ngControlService) {\n            this.renderer.addClass(this.el.nativeElement, 'clr-control-label');\n        }\n        // Only set the grid column classes if we are in the right context and if they aren't already set\n        if (this.layoutService &&\n            !this.layoutService.isVertical() &&\n            this.el.nativeElement &&\n            this.el.nativeElement.className.indexOf('clr-col') < 0) {\n            this.renderer.addClass(this.el.nativeElement, 'clr-col-xs-12');\n            this.renderer.addClass(this.el.nativeElement, 'clr-col-md-2');\n        }\n        if (this.controlIdService && !this.forAttr) {\n            this.subscriptions.push(this.controlIdService.idChange.subscribe(function (id) { return (_this.forAttr = id); }));\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrLabel.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrLabel.decorators = [\n        { type: Directive, args: [{ selector: 'label' },] }\n    ];\n    /** @nocollapse */\n    ClrLabel.ctorParameters = function () { return [\n        { type: ControlIdService, decorators: [{ type: Optional }] },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: NgControlService, decorators: [{ type: Optional }] },\n        { type: Renderer2 },\n        { type: ElementRef }\n    ]; };\n    ClrLabel.propDecorators = {\n        forAttr: [{ type: HostBinding, args: ['attr.for',] }, { type: Input, args: ['for',] }]\n    };\n    return ClrLabel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar IS_NEW_FORMS_LAYOUT = new InjectionToken('IS_NEW_FORMS_LAYOUT');\n/** @type {?} */\nvar IS_NEW_FORMS_LAYOUT_TRUE_PROVIDER = {\n    provide: IS_NEW_FORMS_LAYOUT,\n    useValue: true,\n};\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar MarkControlService = /** @class */ (function () {\n    function MarkControlService() {\n        this._dirty = new Subject();\n    }\n    Object.defineProperty(MarkControlService.prototype, \"dirtyChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._dirty.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    MarkControlService.prototype.markAsDirty = /**\n     * @return {?}\n     */\n    function () {\n        this._dirty.next();\n    };\n    MarkControlService.decorators = [\n        { type: Injectable }\n    ];\n    return MarkControlService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrForm = /** @class */ (function () {\n    function ClrForm(layoutService, markControlService) {\n        this.layoutService = layoutService;\n        this.markControlService = markControlService;\n    }\n    /**\n     * @return {?}\n     */\n    ClrForm.prototype.markAsDirty = /**\n     * @return {?}\n     */\n    function () {\n        this.markControlService.markAsDirty();\n    };\n    ClrForm.decorators = [\n        { type: Directive, args: [{\n                    selector: '[clrForm]',\n                    providers: [LayoutService, MarkControlService, IS_NEW_FORMS_LAYOUT_TRUE_PROVIDER],\n                    host: {\n                        '[class.clr-form]': 'true',\n                        '[class.clr-form-horizontal]': 'layoutService.isHorizontal()',\n                        '[class.clr-form-compact]': 'layoutService.isCompact()',\n                    },\n                },] }\n    ];\n    /** @nocollapse */\n    ClrForm.ctorParameters = function () { return [\n        { type: LayoutService },\n        { type: MarkControlService }\n    ]; };\n    return ClrForm;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrLayout = /** @class */ (function () {\n    function ClrLayout(layoutService) {\n        this.layoutService = layoutService;\n    }\n    /**\n     * @return {?}\n     */\n    ClrLayout.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        // Only set the layout if it is a valid option\n        if (this.layout && this.layoutService.isValid(this.layout)) {\n            this.layoutService.layout = this.layout;\n        }\n    };\n    ClrLayout.decorators = [\n        { type: Directive, args: [{\n                    selector: '[clrLayout]',\n                },] }\n    ];\n    /** @nocollapse */\n    ClrLayout.ctorParameters = function () { return [\n        { type: LayoutService }\n    ]; };\n    ClrLayout.propDecorators = {\n        layout: [{ type: Input, args: ['clrLayout',] }]\n    };\n    return ClrLayout;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrCommonFormsModule = /** @class */ (function () {\n    function ClrCommonFormsModule() {\n    }\n    ClrCommonFormsModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule],\n                    declarations: [ClrLabel, ClrControlError, ClrControlHelper, ClrIfError, ClrForm, ClrLayout],\n                    exports: [ClrLabel, ClrControlError, ClrControlHelper, ClrIfError, ClrForm, ClrLayout],\n                },] }\n    ];\n    return ClrCommonFormsModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrCheckboxWrapper = /** @class */ (function () {\n    function ClrCheckboxWrapper() {\n        // We need both _dynamic for HostWrapper and ContentChild(ClrLabel) in cases where\n        // the user puts a radio inside a wrapper without a label, host wrapping doesn't apply\n        // but we'd still need to insert a label\n        this._dynamic = false;\n    }\n    ClrCheckboxWrapper.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-checkbox-wrapper',\n                    template: \"\\n    <ng-content select=\\\"[clrCheckbox]\\\"></ng-content>\\n    <ng-content select=\\\"label\\\"></ng-content>\\n    <label *ngIf=\\\"!label\\\"></label>\\n  \",\n                    host: {\n                        '[class.clr-checkbox-wrapper]': 'true',\n                    },\n                    providers: [ControlIdService]\n                }] }\n    ];\n    ClrCheckboxWrapper.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }]\n    };\n    return ClrCheckboxWrapper;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * HostWrapper must be called in OnInit to ensure that the Views are ready. If its called in a constructor the view is\n * still undefined.\n * TODO - make sure these comment annotations do not break ng-packgr.\n * @template W\n */\nvar /**\n * HostWrapper must be called in OnInit to ensure that the Views are ready. If its called in a constructor the view is\n * still undefined.\n * TODO - make sure these comment annotations do not break ng-packgr.\n * @template W\n */\nHostWrapper = /** @class */ (function () {\n    function HostWrapper(containerType, vcr, index) {\n        if (index === void 0) { index = 0; }\n        this.injector = vcr.injector;\n        // If the host is already wrapped, we don't do anything\n        if (!this.injector.get(containerType, null)) {\n            /** @type {?} */\n            var cfr = this.injector.get(ComponentFactoryResolver);\n            /** @type {?} */\n            var el = this.injector.get(ElementRef);\n            // We need a new anchor, since we're projecting the current one.\n            vcr.createComponent(cfr.resolveComponentFactory(EmptyAnchor));\n            /** @type {?} */\n            var factory = cfr.resolveComponentFactory(containerType);\n            // Craft the element array based on what slot to use. Angular only uses the index to determine\n            // which ng-content to project into, so if you have more than one ng-content you'll need to set\n            // the index in the constructor appropriately\n            /** @type {?} */\n            var element = [];\n            element[index] = [el.nativeElement];\n            // We're assuming only one projection slot, but in more complex cases we might want to provide\n            // a different array of projected elements.\n            /** @type {?} */\n            var containerRef = vcr.createComponent(factory, undefined, undefined, element);\n            // We can now remove the useless anchor\n            vcr.remove(0);\n            // We note that the container was dynamically created\n            containerRef.instance._dynamic = true;\n            // We keep the wrapper's injector to access the dependencies that weren't available before.\n            this.injector = containerRef.injector;\n        }\n    }\n    /**\n     * @template T\n     * @param {?} token\n     * @param {?=} notFoundValue\n     * @return {?}\n     */\n    HostWrapper.prototype.get = /**\n     * @template T\n     * @param {?} token\n     * @param {?=} notFoundValue\n     * @return {?}\n     */\n    function (token, notFoundValue) {\n        return this.injector.get(token, notFoundValue);\n    };\n    return HostWrapper;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ControlClassService = /** @class */ (function () {\n    function ControlClassService() {\n        this.className = '';\n    }\n    /**\n     * @param {?=} invalid\n     * @param {?=} grid\n     * @param {?=} additional\n     * @return {?}\n     */\n    ControlClassService.prototype.controlClass = /**\n     * @param {?=} invalid\n     * @param {?=} grid\n     * @param {?=} additional\n     * @return {?}\n     */\n    function (invalid, grid, additional) {\n        if (invalid === void 0) { invalid = false; }\n        if (grid === void 0) { grid = false; }\n        if (additional === void 0) { additional = ''; }\n        /** @type {?} */\n        var controlClasses = [this.className, additional];\n        if (invalid) {\n            controlClasses.push('clr-error');\n        }\n        if (grid && this.className.indexOf('clr-col') === -1) {\n            controlClasses.push('clr-col-md-10 clr-col-xs-12');\n        }\n        return controlClasses.join(' ').trim();\n    };\n    // We want to remove the column classes from the input up to the container\n    // We want to remove the column classes from the input up to the container\n    /**\n     * @param {?} renderer\n     * @param {?} element\n     * @return {?}\n     */\n    ControlClassService.prototype.initControlClass = \n    // We want to remove the column classes from the input up to the container\n    /**\n     * @param {?} renderer\n     * @param {?} element\n     * @return {?}\n     */\n    function (renderer, element) {\n        if (element && element.className) {\n            this.className = element.className;\n            /** @type {?} */\n            var klasses = element.className.split(' ');\n            klasses.forEach(function (klass) {\n                if (klass.startsWith('clr-col')) {\n                    renderer.removeClass(element, klass);\n                }\n            });\n        }\n    };\n    ControlClassService.decorators = [\n        { type: Injectable }\n    ];\n    return ControlClassService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template W\n */\nvar WrappedFormControl = /** @class */ (function () {\n    // I lost way too much time trying to make this work without injecting the ViewContainerRef and the Injector,\n    // I'm giving up. So we have to inject these two manually for now.\n    function WrappedFormControl(vcr, wrapperType, injector, ngControl, renderer, el) {\n        var _this = this;\n        this.vcr = vcr;\n        this.wrapperType = wrapperType;\n        this.ngControl = ngControl;\n        this.subscriptions = [];\n        this.index = 0;\n        try {\n            this.ngControlService = injector.get(NgControlService);\n            this.ifErrorService = injector.get(IfErrorService);\n            this.controlClassService = injector.get(ControlClassService);\n            this.markControlService = injector.get(MarkControlService);\n        }\n        catch (e) { }\n        if (this.controlClassService) {\n            this.controlClassService.initControlClass(renderer, el.nativeElement);\n        }\n        if (this.markControlService) {\n            this.subscriptions.push(this.markControlService.dirtyChange.subscribe(function () {\n                _this.ngControl.control.markAsDirty();\n                _this.ngControl.control.updateValueAndValidity();\n            }));\n        }\n    }\n    Object.defineProperty(WrappedFormControl.prototype, \"id\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._id;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._id = value;\n            if (this.controlIdService) {\n                this.controlIdService.id = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    WrappedFormControl.prototype.triggerValidation = /**\n     * @return {?}\n     */\n    function () {\n        if (this.ifErrorService) {\n            this.ifErrorService.triggerStatusChange();\n        }\n    };\n    /**\n     * @template T\n     * @param {?} token\n     * @param {?=} notFoundValue\n     * @return {?}\n     */\n    WrappedFormControl.prototype.getProviderFromContainer = /**\n     * @template T\n     * @param {?} token\n     * @param {?=} notFoundValue\n     * @return {?}\n     */\n    function (token, notFoundValue) {\n        return this._containerInjector.get(token, notFoundValue);\n    };\n    /**\n     * @return {?}\n     */\n    WrappedFormControl.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        this._containerInjector = new HostWrapper(this.wrapperType, this.vcr, this.index);\n        this.controlIdService = this._containerInjector.get(ControlIdService);\n        if (this._id) {\n            this.controlIdService.id = this._id;\n        }\n        else {\n            this._id = this.controlIdService.id;\n        }\n        if (this.ngControlService) {\n            this.ngControlService.setControl(this.ngControl);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    WrappedFormControl.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    WrappedFormControl.propDecorators = {\n        id: [{ type: HostBinding }, { type: Input }],\n        triggerValidation: [{ type: HostListener, args: ['blur',] }]\n    };\n    return WrappedFormControl;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrCheckbox = /** @class */ (function (_super) {\n    __extends(ClrCheckbox, _super);\n    function ClrCheckbox(vcr, injector, control, renderer, el) {\n        return _super.call(this, vcr, ClrCheckboxWrapper, injector, control, renderer, el) || this;\n    }\n    ClrCheckbox.decorators = [\n        { type: Directive, args: [{ selector: '[clrCheckbox]' },] }\n    ];\n    /** @nocollapse */\n    ClrCheckbox.ctorParameters = function () { return [\n        { type: ViewContainerRef },\n        { type: Injector },\n        { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },\n        { type: Renderer2 },\n        { type: ElementRef }\n    ]; };\n    return ClrCheckbox;\n}(WrappedFormControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrCheckboxContainer = /** @class */ (function () {\n    // @TODO Solve for group validation, which doesn't work now with ngModelGroup\n    // Blocked by https://github.com/angular/angular/issues/20268\n    // @Input()\n    // set clrFormGroup(value: FormGroup) {\n    //   this.formGroup = value;\n    // }\n    // @Input()\n    // set clrFormArray(value: FormArray) {\n    //   this.formGroup = value;\n    // }\n    function ClrCheckboxContainer(ifErrorService, layoutService, controlClassService, ngControlService) {\n        var _this = this;\n        this.ifErrorService = ifErrorService;\n        this.layoutService = layoutService;\n        this.controlClassService = controlClassService;\n        this.ngControlService = ngControlService;\n        this.subscriptions = [];\n        this.invalid = false;\n        this.inline = false;\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.control = control;\n        }));\n    }\n    Object.defineProperty(ClrCheckboxContainer.prototype, \"clrInline\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.inline;\n        },\n        // private formGroup: AbstractControl;\n        /*\n         * Here we want to support the following cases\n         * clrInline - true by presence\n         * clrInline=\"true|false\" - unless it is explicitly false, strings are considered true\n         * [clrInline]=\"true|false\" - expect a boolean\n         */\n        set: \n        // private formGroup: AbstractControl;\n        /*\n           * Here we want to support the following cases\n           * clrInline - true by presence\n           * clrInline=\"true|false\" - unless it is explicitly false, strings are considered true\n           * [clrInline]=\"true|false\" - expect a boolean\n           */\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (typeof value === 'string') {\n                this.inline = value === 'false' ? false : true;\n            }\n            else {\n                this.inline = !!value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrCheckboxContainer.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        // @TODO put a solution in for form group validation\n        // if (!this.formGroup) {\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            _this.invalid = invalid;\n        }));\n        // } else {\n        //   // Because ngModel does this, we have to delay a tick to get the result\n        //   Promise.resolve().then(() => {\n        //     this.subscriptions.push(\n        //       this.formGroup.statusChanges.subscribe(() => {\n        //         this.invalid = this.formGroup.invalid;\n        //       })\n        //     );\n        //   });\n        // }\n    };\n    /**\n     * @return {?}\n     */\n    ClrCheckboxContainer.prototype.controlClass = /**\n     * @return {?}\n     */\n    function () {\n        return this.controlClassService.controlClass(this.invalid, this.addGrid(), this.inline ? 'clr-control-inline' : '');\n    };\n    /**\n     * @return {?}\n     */\n    ClrCheckboxContainer.prototype.addGrid = /**\n     * @return {?}\n     */\n    function () {\n        if (this.layoutService && !this.layoutService.isVertical()) {\n            return true;\n        }\n        return false;\n    };\n    /**\n     * @return {?}\n     */\n    ClrCheckboxContainer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.map(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrCheckboxContainer.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-checkbox-container',\n                    template: \"\\n    <ng-content select=\\\"label\\\"></ng-content>\\n    <label *ngIf=\\\"!label && addGrid()\\\"></label>\\n    <div class=\\\"clr-control-container\\\" [class.clr-control-inline]=\\\"clrInline\\\" [ngClass]=\\\"controlClass()\\\">\\n      <ng-content select=\\\"clr-checkbox-wrapper\\\"></ng-content>\\n      <div class=\\\"clr-subtext-wrapper\\\">\\n        <ng-content select=\\\"clr-control-helper\\\" *ngIf=\\\"!invalid\\\"></ng-content>\\n        <clr-icon *ngIf=\\\"invalid\\\" class=\\\"clr-validate-icon\\\" shape=\\\"exclamation-circle\\\" aria-hidden=\\\"true\\\"></clr-icon>\\n        <ng-content select=\\\"clr-control-error\\\" *ngIf=\\\"invalid\\\"></ng-content>\\n      </div>\\n    </div>\\n  \",\n                    host: {\n                        '[class.clr-form-control]': 'true',\n                        '[class.clr-form-control-disabled]': 'control?.disabled',\n                        '[class.clr-row]': 'addGrid()',\n                    },\n                    providers: [NgControlService, ControlClassService, IfErrorService]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrCheckboxContainer.ctorParameters = function () { return [\n        { type: IfErrorService },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: ControlClassService },\n        { type: NgControlService }\n    ]; };\n    ClrCheckboxContainer.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }],\n        clrInline: [{ type: Input }]\n    };\n    return ClrCheckboxContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrCheckboxModule = /** @class */ (function () {\n    function ClrCheckboxModule() {\n    }\n    ClrCheckboxModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule, ClrCommonFormsModule, ClrHostWrappingModule],\n                    declarations: [ClrCheckbox, ClrCheckboxContainer, ClrCheckboxWrapper],\n                    exports: [ClrCommonFormsModule, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxWrapper],\n                    entryComponents: [ClrCheckboxWrapper],\n                },] }\n    ];\n    return ClrCheckboxModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar activeCounter = 0;\n/** @type {?} */\nvar IF_ACTIVE_ID = new InjectionToken('IF_ACTIVE_ID');\n/**\n * @return {?}\n */\nfunction tokenFactory() {\n    return ++activeCounter;\n}\n/** @type {?} */\nvar IF_ACTIVE_ID_PROVIDER = {\n    provide: IF_ACTIVE_ID,\n    useFactory: tokenFactory,\n};\nvar IfActiveService = /** @class */ (function () {\n    function IfActiveService() {\n        /**\n         * *****\n         * \\@property _currentChange\n         *\n         * \\@description\n         * A RXJS Subject that updates and provides subscriptions to for the current current state of a component template\n         * implemting the IfActive structural directive.\n         *\n         */\n        this._currentChange = new Subject();\n    }\n    Object.defineProperty(IfActiveService.prototype, \"currentChange\", {\n        /*********\n         *\n         * @description\n         * A getter function that provides an observable for the _current Subject.\n         *\n         */\n        get: /**\n         * ******\n         *\n         * \\@description\n         * A getter function that provides an observable for the _current Subject.\n         *\n         * @return {?}\n         */\n        function () {\n            return this._currentChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(IfActiveService.prototype, \"current\", {\n        /*********\n         *\n         * @description\n         * A getter that returns the current value of this IfActive instance.\n         * @returns\n         */\n        get: /**\n         * ******\n         *\n         * \\@description\n         * A getter that returns the current value of this IfActive instance.\n         * @return {?}\n         */\n        function () {\n            return this._current;\n        },\n        /*********\n         *\n         * @description\n         * A setter function that updates the current state of _current for this instance of IfActive structural directive.\n         * And, broadcasts the new value to all subscribers.\n         *\n         * @param value\n         */\n        set: /**\n         * ******\n         *\n         * \\@description\n         * A setter function that updates the current state of _current for this instance of IfActive structural directive.\n         * And, broadcasts the new value to all subscribers.\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this._current !== value) {\n                this._current = value;\n                this._currentChange.next(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    IfActiveService.decorators = [\n        { type: Injectable }\n    ];\n    return IfActiveService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrIfActive = /** @class */ (function () {\n    function ClrIfActive(ifActiveService, id, template, container) {\n        var _this = this;\n        this.ifActiveService = ifActiveService;\n        this.id = id;\n        this.template = template;\n        this.container = container;\n        this.wasActive = false;\n        /**\n         * *******\n         * \\@property activeChange\n         *\n         * \\@description\n         * An event emitter that emits when the active property is set to allow for 2way binding when the directive is\n         * used with de-structured / de-sugared syntax.\n         *\n         */\n        this.activeChange = new EventEmitter(false);\n        this.checkAndUpdateView(ifActiveService.current);\n        this.subscription = this.ifActiveService.currentChange.subscribe(function (newCurrentId) {\n            _this.checkAndUpdateView(newCurrentId);\n        });\n    }\n    /**\n     * @param {?} currentId\n     * @return {?}\n     */\n    ClrIfActive.prototype.checkAndUpdateView = /**\n     * @param {?} currentId\n     * @return {?}\n     */\n    function (currentId) {\n        /** @type {?} */\n        var isNowActive = currentId === this.id;\n        // only emit if the new active state is changed since last time.\n        if (isNowActive !== this.wasActive) {\n            this.updateView(isNowActive);\n            this.activeChange.emit(isNowActive);\n            this.wasActive = isNowActive;\n        }\n    };\n    Object.defineProperty(ClrIfActive.prototype, \"active\", {\n        /********\n         *\n         * @description\n         * A getter that returns the current IfActiveService.active value.\n         */\n        get: /**\n         * *****\n         *\n         * \\@description\n         * A getter that returns the current IfActiveService.active value.\n         * @return {?}\n         */\n        function () {\n            return this.ifActiveService.current === this.id;\n        },\n        /*********\n         *\n         * @description\n         * A setter that updates IfActiveService.active with value.\n         *\n         * @param value\n         */\n        set: /**\n         * ******\n         *\n         * \\@description\n         * A setter that updates IfActiveService.active with value.\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value) {\n                this.ifActiveService.current = this.id;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /*********\n     *\n     * @description\n     * Function that takes a any value and either created an embedded view for the associated ViewContainerRef or,\n     * Clears all views from the ViewContainerRef\n     * @param value\n     */\n    /**\n     * ******\n     *\n     * \\@description\n     * Function that takes a any value and either created an embedded view for the associated ViewContainerRef or,\n     * Clears all views from the ViewContainerRef\n     * @param {?} value\n     * @return {?}\n     */\n    ClrIfActive.prototype.updateView = /**\n     * ******\n     *\n     * \\@description\n     * Function that takes a any value and either created an embedded view for the associated ViewContainerRef or,\n     * Clears all views from the ViewContainerRef\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        if (value) {\n            this.container.createEmbeddedView(this.template);\n        }\n        else {\n            this.container.clear();\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrIfActive.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscription.unsubscribe();\n    };\n    ClrIfActive.decorators = [\n        { type: Directive, args: [{ selector: '[clrIfActive]' },] }\n    ];\n    /** @nocollapse */\n    ClrIfActive.ctorParameters = function () { return [\n        { type: IfActiveService },\n        { type: Number, decorators: [{ type: Inject, args: [IF_ACTIVE_ID,] }] },\n        { type: TemplateRef },\n        { type: ViewContainerRef }\n    ]; };\n    ClrIfActive.propDecorators = {\n        active: [{ type: Input, args: ['clrIfActive',] }],\n        activeChange: [{ type: Output, args: ['clrIfActiveChange',] }]\n    };\n    return ClrIfActive;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar IfOpenService = /** @class */ (function () {\n    function IfOpenService() {\n        /**\n         * *****\n         * \\@property _openChange\n         *\n         * \\@description\n         * A RXJS Subject that updates and provides subscriptions to for the current open state of a component template\n         * implemting the IfOpen structural directive.\n         */\n        this._openChange = new Subject();\n        /**\n         *  Popovers might need to ignore click events on an element\n         *  (eg: popover opens on focus on an input field. Clicks should be ignored in this case)\n         */\n        this._ignoredElementChange = new Subject();\n    }\n    Object.defineProperty(IfOpenService.prototype, \"openChange\", {\n        /*********\n         *\n         * @description\n         * A getter function that provides an observable for the _opened Subject.\n         *\n         */\n        get: /**\n         * ******\n         *\n         * \\@description\n         * A getter function that provides an observable for the _opened Subject.\n         *\n         * @return {?}\n         */\n        function () {\n            return this._openChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(IfOpenService.prototype, \"open\", {\n        /*********\n         *\n         * @description\n         * A getter that returns the current value of this IfOpen instance.\n         *\n         */\n        get: /**\n         * ******\n         *\n         * \\@description\n         * A getter that returns the current value of this IfOpen instance.\n         *\n         * @return {?}\n         */\n        function () {\n            return this._open;\n        },\n        /*********\n         *\n         * @description\n         * A setter function that updates the current state of _open for this instance of IfOpen structural directive. And,\n         * broadcasts the new value to all subscribers.\n         *\n         * @param value\n         */\n        set: /**\n         * ******\n         *\n         * \\@description\n         * A setter function that updates the current state of _open for this instance of IfOpen structural directive. And,\n         * broadcasts the new value to all subscribers.\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            value = !!value;\n            if (this._open !== value) {\n                this._open = value;\n                this._openChange.next(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    IfOpenService.prototype.toggleWithEvent = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        this.originalEvent = event;\n        this.open = !this.open;\n        delete this.originalEvent;\n    };\n    Object.defineProperty(IfOpenService.prototype, \"ignoredElementChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._ignoredElementChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    IfOpenService.prototype.registerIgnoredElement = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        this._ignoredElementChange.next(element);\n    };\n    IfOpenService.decorators = [\n        { type: Injectable }\n    ];\n    return IfOpenService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrIfOpen = /** @class */ (function () {\n    function ClrIfOpen(ifOpenService, template, container) {\n        var _this = this;\n        this.ifOpenService = ifOpenService;\n        this.template = template;\n        this.container = container;\n        /**\n         * *******\n         * \\@property openChange\n         *\n         * \\@description\n         * An event emitter that emits when the open property is set to allow for 2way binding when the directive is\n         * used with de-structured / de-sugared syntax.\n         */\n        this.openChange = new EventEmitter(false);\n        this.subscription = this.ifOpenService.openChange.subscribe(function (change) {\n            _this.updateView(change);\n            _this.openChange.emit(change);\n        });\n    }\n    Object.defineProperty(ClrIfOpen.prototype, \"open\", {\n        /********\n         *\n         * @description\n         * A getter that returns the current IfOpenService.open value.\n         *\n         */\n        get: /**\n         * *****\n         *\n         * \\@description\n         * A getter that returns the current IfOpenService.open value.\n         *\n         * @return {?}\n         */\n        function () {\n            return this.ifOpenService.open;\n        },\n        /*********\n         *\n         * @description\n         * A setter that updates IfOpenService.open with value.\n         *\n         * @param value\n         */\n        set: /**\n         * ******\n         *\n         * \\@description\n         * A setter that updates IfOpenService.open with value.\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.ifOpenService.open = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /*********\n     *\n     * @description\n     * Function that takes a boolean value and either created an embedded view for the associated ViewContainerRef or,\n     * Clears all views from the ViewContainerRef\n     * @param value\n     */\n    /**\n     * ******\n     *\n     * \\@description\n     * Function that takes a boolean value and either created an embedded view for the associated ViewContainerRef or,\n     * Clears all views from the ViewContainerRef\n     * @param {?} value\n     * @return {?}\n     */\n    ClrIfOpen.prototype.updateView = /**\n     * ******\n     *\n     * \\@description\n     * Function that takes a boolean value and either created an embedded view for the associated ViewContainerRef or,\n     * Clears all views from the ViewContainerRef\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        if (value) {\n            this.container.createEmbeddedView(this.template);\n        }\n        else {\n            this.container.clear();\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrIfOpen.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscription.unsubscribe();\n    };\n    ClrIfOpen.decorators = [\n        { type: Directive, args: [{ selector: '[clrIfOpen]' },] }\n    ];\n    /** @nocollapse */\n    ClrIfOpen.ctorParameters = function () { return [\n        { type: IfOpenService },\n        { type: TemplateRef },\n        { type: ViewContainerRef }\n    ]; };\n    ClrIfOpen.propDecorators = {\n        open: [{ type: Input, args: ['clrIfOpen',] }],\n        openChange: [{ type: Output, args: ['clrIfOpenChange',] }]\n    };\n    return ClrIfOpen;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CONDITIONAL_DIRECTIVES = [ClrIfActive, ClrIfOpen];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrConditionalModule = /** @class */ (function () {\n    function ClrConditionalModule() {\n    }\n    ClrConditionalModule.decorators = [\n        { type: NgModule, args: [{ imports: [CommonModule], declarations: [CONDITIONAL_DIRECTIVES], exports: [CONDITIONAL_DIRECTIVES] },] }\n    ];\n    return ClrConditionalModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar FocusTrapTracker = /** @class */ (function () {\n    function FocusTrapTracker() {\n        this._previousFocusTraps = [];\n    }\n    Object.defineProperty(FocusTrapTracker.prototype, \"current\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._current;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._previousFocusTraps.push(this._current);\n            this._current = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(FocusTrapTracker.prototype, \"nbFocusTrappers\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._previousFocusTraps.length;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    FocusTrapTracker.prototype.activatePreviousTrapper = /**\n     * @return {?}\n     */\n    function () {\n        this._current = this._previousFocusTraps.pop();\n    };\n    FocusTrapTracker.decorators = [\n        { type: Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    /** @nocollapse */ FocusTrapTracker.ngInjectableDef = defineInjectable({ factory: function FocusTrapTracker_Factory() { return new FocusTrapTracker(); }, token: FocusTrapTracker, providedIn: \"root\" });\n    return FocusTrapTracker;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar FocusTrapDirective = /** @class */ (function () {\n    function FocusTrapDirective(el, injector, focusTrapsTracker, renderer, platformId) {\n        this.el = el;\n        this.injector = injector;\n        this.focusTrapsTracker = focusTrapsTracker;\n        this.renderer = renderer;\n        this.platformId = platformId;\n        this.document = this.injector.get(DOCUMENT);\n        this.focusTrapsTracker.current = this;\n        this.renderer.setAttribute(this.el.nativeElement, 'tabindex', '0');\n    }\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    FocusTrapDirective.prototype.onFocusIn = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        /** @type {?} */\n        var nativeElement = this.el.nativeElement;\n        if (this.focusTrapsTracker.current === this && event.target && !nativeElement.contains(event.target)) {\n            nativeElement.focus();\n        }\n    };\n    /**\n     * @return {?}\n     */\n    FocusTrapDirective.prototype.createFocusableOffScreenEl = /**\n     * @return {?}\n     */\n    function () {\n        // Not using Renderer2's createElement method because that leads to DOM leakage.\n        // https://github.com/angular/angular/issues/26954\n        /** @type {?} */\n        var offScreenSpan = this.document.createElement('span');\n        this.renderer.setAttribute(offScreenSpan, 'tabindex', '0');\n        this.renderer.addClass(offScreenSpan, 'offscreen-focus-rebounder');\n        return offScreenSpan;\n    };\n    /**\n     * @return {?}\n     */\n    FocusTrapDirective.prototype.addReboundEls = /**\n     * @return {?}\n     */\n    function () {\n        // We will add these focus rebounding elements only in the following conditions:\n        // 1. It should be running inside browser platform as it accesses document.body element\n        // 2. We should NOT add them more than once. Hence, we are counting a number of focus trappers\n        //    and only add on the first focus trapper.\n        if (isPlatformBrowser(this.platformId) && this.focusTrapsTracker.nbFocusTrappers === 1) {\n            this.topReboundEl = this.createFocusableOffScreenEl();\n            this.bottomReboundEl = this.createFocusableOffScreenEl();\n            // Add reboundBeforeTrapEl to the document body as the first child\n            this.renderer.insertBefore(this.document.body, this.topReboundEl, this.document.body.firstChild);\n            // Add reboundAfterTrapEl to the document body as the last child\n            this.renderer.appendChild(this.document.body, this.bottomReboundEl);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    FocusTrapDirective.prototype.removeReboundEls = /**\n     * @return {?}\n     */\n    function () {\n        if (isPlatformBrowser(this.platformId) &&\n            this.focusTrapsTracker.nbFocusTrappers === 1 &&\n            this.topReboundEl &&\n            this.bottomReboundEl) {\n            this.renderer.removeChild(this.document.body, this.topReboundEl);\n            this.renderer.removeChild(this.document.body, this.bottomReboundEl);\n            // These are here to to make sure that\n            // we completely delete all traces of the removed DOM objects.\n            delete this.topReboundEl;\n            delete this.bottomReboundEl;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    FocusTrapDirective.prototype.setPreviousFocus = /**\n     * @return {?}\n     */\n    function () {\n        if (this.previousActiveElement && this.previousActiveElement.focus) {\n            this.previousActiveElement.focus();\n        }\n    };\n    /**\n     * @return {?}\n     */\n    FocusTrapDirective.prototype.ngAfterViewInit = /**\n     * @return {?}\n     */\n    function () {\n        if (isPlatformBrowser(this.platformId)) {\n            this.previousActiveElement = (/** @type {?} */ (this.document.activeElement));\n        }\n        this.addReboundEls();\n    };\n    /**\n     * @return {?}\n     */\n    FocusTrapDirective.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.removeReboundEls();\n        this.setPreviousFocus();\n        this.focusTrapsTracker.activatePreviousTrapper();\n    };\n    FocusTrapDirective.decorators = [\n        { type: Directive, args: [{ selector: '[clrFocusTrap]' },] }\n    ];\n    /** @nocollapse */\n    FocusTrapDirective.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: Injector },\n        { type: FocusTrapTracker },\n        { type: Renderer2 },\n        { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }\n    ]; };\n    FocusTrapDirective.propDecorators = {\n        onFocusIn: [{ type: HostListener, args: ['document:focusin', ['$event'],] }]\n    };\n    return FocusTrapDirective;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar FOCUS_TRAP_DIRECTIVES = [FocusTrapDirective];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrFocusTrapModule = /** @class */ (function () {\n    function ClrFocusTrapModule() {\n    }\n    ClrFocusTrapModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule],\n                    declarations: [FOCUS_TRAP_DIRECTIVES],\n                    exports: [FOCUS_TRAP_DIRECTIVES],\n                },] }\n    ];\n    return ClrFocusTrapModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2017 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/** @type {?} */\nvar UP_ARROW = 38;\n/** @type {?} */\nvar DOWN_ARROW = 40;\n/** @type {?} */\nvar RIGHT_ARROW = 39;\n/** @type {?} */\nvar LEFT_ARROW = 37;\n/** @type {?} */\nvar ESC = 27;\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * This is the en-001 short locale date format. Setting as default.\n * @type {?}\n */\nvar DEFAULT_LOCALE_FORMAT = 'dd/MM/y';\n// https://en.wikipedia.org/wiki/Date_format_by_country\n/** @type {?} */\nvar LITTLE_ENDIAN_REGEX = /d+.+m+.+y+/i;\n/** @type {?} */\nvar MIDDLE_ENDIAN_REGEX = /m+.+d+.+y+/i;\n// No need for BIG_ENDIAN_REGEX because anything that doesn't satisfy the above 2\n// is automatically BIG_ENDIAN\n/** @type {?} */\nvar DELIMITER_REGEX = /d+|m+|y+/i;\n/** @type {?} */\nvar USER_INPUT_REGEX = /\\d+/g;\n/** @type {?} */\nvar MOBILE_USERAGENT_REGEX = /Mobi/i;\n/** @type {?} */\nvar RTL_REGEX = /\\u200f/g;\n/** @type {?} */\nvar YEAR = 'YYYY';\n/** @type {?} */\nvar MONTH = 'MM';\n/** @type {?} */\nvar DATE = 'DD';\n/** @type {?} */\nvar LITTLE_ENDIAN = {\n    name: 'LITTLE_ENDIAN',\n    format: [DATE, MONTH, YEAR],\n};\n/** @type {?} */\nvar MIDDLE_ENDIAN = {\n    name: 'MIDDLE_ENDIAN',\n    format: [MONTH, DATE, YEAR],\n};\n/** @type {?} */\nvar BIG_ENDIAN = {\n    name: 'BIG_ENDIAN',\n    format: [YEAR, MONTH, DATE],\n};\n/** @type {?} */\nvar NO_OF_DAYS_IN_A_WEEK = 7;\n/** @type {?} */\nvar NO_OF_ROWS_IN_CALENDAR_VIEW = 6;\n/** @type {?} */\nvar TOTAL_DAYS_IN_DAYS_VIEW = NO_OF_DAYS_IN_A_WEEK * NO_OF_ROWS_IN_CALENDAR_VIEW;\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * Returns the number of days in a month.\n * @param {?} year\n * @param {?} month\n * @return {?}\n */\nfunction getNumberOfDaysInTheMonth(year, month) {\n    // If we go to the next month, but use a day of 0, it returns the last day from the previous month\n    return new Date(year, month + 1, 0).getDate();\n}\n/**\n * Returns the day for the corresponding date where 0 represents Sunday.\n * @param {?} year\n * @param {?} month\n * @param {?} date\n * @return {?}\n */\nfunction getDay(year, month, date) {\n    return new Date(year, month, date).getDay();\n}\n/**\n * Takes in a year and if it is a 2 digit year, returns the corresponding 4 digit year.\n * Window of 80 years before and 20 years after the present year.\n * Credit: https://github.com/globalizejs/globalize/blob/e1b31cd6a4f1cff75b185b68b7a32220aac5196f/src/date/parse.js\n * @param {?} year\n * @return {?}\n */\nfunction parseToFourDigitYear(year) {\n    if (year > 9999 || (year > 100 && year < 999) || year < 10) {\n        return -1;\n    }\n    if (year > 999) {\n        return year;\n    }\n    /** @type {?} */\n    var currYear = new Date().getFullYear();\n    /** @type {?} */\n    var century = Math.floor(currYear / 100) * 100;\n    /** @type {?} */\n    var result = year + century;\n    if (result > currYear + 20) {\n        result = result - 100;\n    }\n    return result;\n}\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\nvar DayViewModel = /** @class */ (function () {\n    function DayViewModel(dayModel, isTodaysDate, isDisabled, isSelected, isFocusable) {\n        if (isTodaysDate === void 0) { isTodaysDate = false; }\n        if (isDisabled === void 0) { isDisabled = false; }\n        if (isSelected === void 0) { isSelected = false; }\n        if (isFocusable === void 0) { isFocusable = false; }\n        this.dayModel = dayModel;\n        this.isTodaysDate = isTodaysDate;\n        this.isDisabled = isDisabled;\n        this.isSelected = isSelected;\n        this.isFocusable = isFocusable;\n    }\n    Object.defineProperty(DayViewModel.prototype, \"tabIndex\", {\n        /**\n         * Gets the tab index based on the isFocusable flag.\n         */\n        get: /**\n         * Gets the tab index based on the isFocusable flag.\n         * @return {?}\n         */\n        function () {\n            return this.isFocusable ? 0 : -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return DayViewModel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar CalendarModel = /** @class */ (function () {\n    function CalendarModel(year, month) {\n        this.year = year;\n        this.month = month;\n        this.initializeDaysInCalendar();\n    }\n    /**\n     * Populates the days array with the DayModels in the current Calendar.\n     */\n    /**\n     * Populates the days array with the DayModels in the current Calendar.\n     * @return {?}\n     */\n    CalendarModel.prototype.initializeDaysInCalendar = /**\n     * Populates the days array with the DayModels in the current Calendar.\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        /** @type {?} */\n        var noOfDaysInCalendar = getNumberOfDaysInTheMonth(this.year, this.month);\n        this.days = Array(noOfDaysInCalendar)\n            .fill(null)\n            .map(function (date, index) {\n            return new DayModel(_this.year, _this.month, index + 1);\n        });\n    };\n    /**\n     * Checks if the calendar passed is equal to the current calendar.\n     */\n    /**\n     * Checks if the calendar passed is equal to the current calendar.\n     * @param {?} calendar\n     * @return {?}\n     */\n    CalendarModel.prototype.isEqual = /**\n     * Checks if the calendar passed is equal to the current calendar.\n     * @param {?} calendar\n     * @return {?}\n     */\n    function (calendar) {\n        if (calendar) {\n            return this.year === calendar.year && this.month === calendar.month;\n        }\n        return false;\n    };\n    /**\n     * Checks if a DayModel is in the Calendar\n     */\n    /**\n     * Checks if a DayModel is in the Calendar\n     * @param {?} day\n     * @return {?}\n     */\n    CalendarModel.prototype.isDayInCalendar = /**\n     * Checks if a DayModel is in the Calendar\n     * @param {?} day\n     * @return {?}\n     */\n    function (day) {\n        if (day) {\n            return this.year === day.year && this.month === day.month;\n        }\n        return false;\n    };\n    /**\n     * Returns CalendarModel of the previous month.\n     */\n    /**\n     * Returns CalendarModel of the previous month.\n     * @return {?}\n     */\n    CalendarModel.prototype.previousMonth = /**\n     * Returns CalendarModel of the previous month.\n     * @return {?}\n     */\n    function () {\n        if (this.month === 0) {\n            return new CalendarModel(this.year - 1, 11);\n        }\n        else {\n            return new CalendarModel(this.year, this.month - 1);\n        }\n    };\n    /**\n     * Returns CalendarModel of the next month.\n     */\n    /**\n     * Returns CalendarModel of the next month.\n     * @return {?}\n     */\n    CalendarModel.prototype.nextMonth = /**\n     * Returns CalendarModel of the next month.\n     * @return {?}\n     */\n    function () {\n        if (this.month === 11) {\n            return new CalendarModel(this.year + 1, 0);\n        }\n        else {\n            return new CalendarModel(this.year, this.month + 1);\n        }\n    };\n    return CalendarModel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DayModel = /** @class */ (function () {\n    function DayModel(year, month, date) {\n        this.year = year;\n        this.month = month;\n        this.date = date;\n    }\n    Object.defineProperty(DayModel.prototype, \"calendar\", {\n        /**\n         * Returns the Calendar for the current DayModel.\n         */\n        get: /**\n         * Returns the Calendar for the current DayModel.\n         * @return {?}\n         */\n        function () {\n            return new CalendarModel(this.year, this.month);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Checks if the passed CalendarDate is equal to itself.\n     */\n    /**\n     * Checks if the passed CalendarDate is equal to itself.\n     * @param {?} day\n     * @return {?}\n     */\n    DayModel.prototype.isEqual = /**\n     * Checks if the passed CalendarDate is equal to itself.\n     * @param {?} day\n     * @return {?}\n     */\n    function (day) {\n        if (day) {\n            return this.year === day.year && this.month === day.month && this.date === day.date;\n        }\n        return false;\n    };\n    /**\n     * Converts the CalendarDate into the Javascript Date object.\n     */\n    /**\n     * Converts the CalendarDate into the Javascript Date object.\n     * @return {?}\n     */\n    DayModel.prototype.toDate = /**\n     * Converts the CalendarDate into the Javascript Date object.\n     * @return {?}\n     */\n    function () {\n        return new Date(this.year, this.month, this.date);\n    };\n    /**\n     * Returns a new DayModel which is incremented based on the value passed.\n     */\n    /**\n     * Returns a new DayModel which is incremented based on the value passed.\n     * @param {?} value\n     * @return {?}\n     */\n    DayModel.prototype.incrementBy = /**\n     * Returns a new DayModel which is incremented based on the value passed.\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        // Creating new Javascript Date object to increment because\n        // it will automatically take care of switching to next or previous\n        // months & years without we having to worry about it.\n        /** @type {?} */\n        var date = new Date(this.year, this.month, this.date + value);\n        return new DayModel(date.getFullYear(), date.getMonth(), date.getDate());\n    };\n    /**\n     * Clones the current day model.\n     */\n    /**\n     * Clones the current day model.\n     * @return {?}\n     */\n    DayModel.prototype.clone = /**\n     * Clones the current day model.\n     * @return {?}\n     */\n    function () {\n        return new DayModel(this.year, this.month, this.date);\n    };\n    return DayModel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar CalendarViewModel = /** @class */ (function () {\n    function CalendarViewModel(calendar, selectedDay, focusableDay, today, firstDayOfWeek) {\n        this.calendar = calendar;\n        this.selectedDay = selectedDay;\n        this.focusableDay = focusableDay;\n        this.today = today;\n        this.firstDayOfWeek = firstDayOfWeek;\n        this.currMonthDayViews = [];\n        this.initializeCalendarView();\n    }\n    Object.defineProperty(CalendarViewModel.prototype, \"calendarView\", {\n        /**\n         * DayViewModel matrix. Size 6x7\n         */\n        get: /**\n         * DayViewModel matrix. Size 6x7\n         * @return {?}\n         */\n        function () {\n            return this._calendarView;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Generates a 6x7 matrix of DayViewModel based on the Calendar.\n     * The 6x7 matrix is structured according to the first day of the week.\n     * 6 rows to accommodate months which might have dates spanning over 6 weeks.\n     * 7 columns because there are 7 days in a week :P :D\n     */\n    /**\n     * Generates a 6x7 matrix of DayViewModel based on the Calendar.\n     * The 6x7 matrix is structured according to the first day of the week.\n     * 6 rows to accommodate months which might have dates spanning over 6 weeks.\n     * 7 columns because there are 7 days in a week :P :D\n     * @return {?}\n     */\n    CalendarViewModel.prototype.initializeCalendarView = /**\n     * Generates a 6x7 matrix of DayViewModel based on the Calendar.\n     * The 6x7 matrix is structured according to the first day of the week.\n     * 6 rows to accommodate months which might have dates spanning over 6 weeks.\n     * 7 columns because there are 7 days in a week :P :D\n     * @return {?}\n     */\n    function () {\n        // Generate prev and next month calendar models.\n        /** @type {?} */\n        var prevMonthCalendar = this.calendar.previousMonth();\n        /** @type {?} */\n        var nextMonthCalendar = this.calendar.nextMonth();\n        // Get no of days from prev and next months.\n        /** @type {?} */\n        var daysFromPrevMonthInCalView = this.numDaysFromPrevMonthInCalView(this.calendar.year, this.calendar.month);\n        /** @type {?} */\n        var daysFromNextMonthInCalView = TOTAL_DAYS_IN_DAYS_VIEW - (this.calendar.days.length + daysFromPrevMonthInCalView);\n        // Generate prev, curr and next day view models\n        /** @type {?} */\n        var prevMonthDayViews = [];\n        /** @type {?} */\n        var nextMonthDayViews = [];\n        if (daysFromPrevMonthInCalView > 0) {\n            prevMonthDayViews = this.generateDayViewModels(prevMonthCalendar.days.slice(-1 * daysFromPrevMonthInCalView), true, false);\n        }\n        this.currMonthDayViews = this.generateDayViewModels(this.calendar.days, false, true);\n        if (daysFromNextMonthInCalView > 0) {\n            nextMonthDayViews = this.generateDayViewModels(nextMonthCalendar.days.slice(0, daysFromNextMonthInCalView), true, false);\n        }\n        // Generate calendar view and initialize flags\n        this._calendarView = this.generateCalendarView(prevMonthDayViews, this.currMonthDayViews, nextMonthDayViews);\n        this.initializeSelectedDay();\n        this.initializeFocusableDay();\n    };\n    /**\n     * Generates a DayViewModel array based on the DayModel passed\n     */\n    /**\n     * Generates a DayViewModel array based on the DayModel passed\n     * @param {?} days\n     * @param {?} isDisabled\n     * @param {?} isCurrentCalendar\n     * @return {?}\n     */\n    CalendarViewModel.prototype.generateDayViewModels = /**\n     * Generates a DayViewModel array based on the DayModel passed\n     * @param {?} days\n     * @param {?} isDisabled\n     * @param {?} isCurrentCalendar\n     * @return {?}\n     */\n    function (days, isDisabled, isCurrentCalendar) {\n        /** @type {?} */\n        var dayViews = days.map(function (day) {\n            return new DayViewModel(day, false, isDisabled, false, false);\n        });\n        if (isCurrentCalendar && this.calendar.isDayInCalendar(this.today)) {\n            dayViews[this.today.date - 1].isTodaysDate = true;\n        }\n        return dayViews;\n    };\n    /**\n     * Gets the first day of the current month to figure out how many dates of previous month\n     * are needed to complete the Calendar View based on the first day of the week.\n     * eg: Assuming locale en-US, the first day of the week is Sunday,\n     * if first day of the current month lands on Wednesday, then\n     * (this.getDay function would return 3 since\n     * first day of the week is 0), we need the 3 days from the previous month.\n     */\n    /**\n     * Gets the first day of the current month to figure out how many dates of previous month\n     * are needed to complete the Calendar View based on the first day of the week.\n     * eg: Assuming locale en-US, the first day of the week is Sunday,\n     * if first day of the current month lands on Wednesday, then\n     * (this.getDay function would return 3 since\n     * first day of the week is 0), we need the 3 days from the previous month.\n     * @param {?} currentYear\n     * @param {?} currentMonth\n     * @return {?}\n     */\n    CalendarViewModel.prototype.numDaysFromPrevMonthInCalView = /**\n     * Gets the first day of the current month to figure out how many dates of previous month\n     * are needed to complete the Calendar View based on the first day of the week.\n     * eg: Assuming locale en-US, the first day of the week is Sunday,\n     * if first day of the current month lands on Wednesday, then\n     * (this.getDay function would return 3 since\n     * first day of the week is 0), we need the 3 days from the previous month.\n     * @param {?} currentYear\n     * @param {?} currentMonth\n     * @return {?}\n     */\n    function (currentYear, currentMonth) {\n        /** @type {?} */\n        var firstDayOfCurrMonth = getDay(currentYear, currentMonth, 1);\n        if (firstDayOfCurrMonth >= this.firstDayOfWeek) {\n            return firstDayOfCurrMonth - this.firstDayOfWeek;\n        }\n        else {\n            return NO_OF_DAYS_IN_A_WEEK + firstDayOfCurrMonth - this.firstDayOfWeek;\n        }\n    };\n    /**\n     * Checks if the Day passed is in the CalendarView.\n     */\n    /**\n     * Checks if the Day passed is in the CalendarView.\n     * @param {?} day\n     * @return {?}\n     */\n    CalendarViewModel.prototype.isDayInCalendarView = /**\n     * Checks if the Day passed is in the CalendarView.\n     * @param {?} day\n     * @return {?}\n     */\n    function (day) {\n        if (!this.calendar.isDayInCalendar(day)) {\n            return false;\n        }\n        return true;\n    };\n    /**\n     * Using the DayViewModels from the previous, current and next month, this function\n     * generates the CalendarView.\n     */\n    /**\n     * Using the DayViewModels from the previous, current and next month, this function\n     * generates the CalendarView.\n     * @param {?} prev\n     * @param {?} curr\n     * @param {?} next\n     * @return {?}\n     */\n    CalendarViewModel.prototype.generateCalendarView = /**\n     * Using the DayViewModels from the previous, current and next month, this function\n     * generates the CalendarView.\n     * @param {?} prev\n     * @param {?} curr\n     * @param {?} next\n     * @return {?}\n     */\n    function (prev, curr, next) {\n        /** @type {?} */\n        var combinationArr = __spread(prev, curr, next);\n        /** @type {?} */\n        var calendarView = [];\n        for (var i = 0; i < NO_OF_ROWS_IN_CALENDAR_VIEW; i++) {\n            calendarView[i] = combinationArr.slice(i * NO_OF_DAYS_IN_A_WEEK, (i + 1) * NO_OF_DAYS_IN_A_WEEK);\n        }\n        return calendarView;\n    };\n    /**\n     * Initialize the selected day if the day is in the calendar.\n     */\n    /**\n     * Initialize the selected day if the day is in the calendar.\n     * @return {?}\n     */\n    CalendarViewModel.prototype.initializeSelectedDay = /**\n     * Initialize the selected day if the day is in the calendar.\n     * @return {?}\n     */\n    function () {\n        if (this.selectedDay && this.isDayInCalendarView(this.selectedDay)) {\n            this.currMonthDayViews[this.selectedDay.date - 1].isSelected = true;\n        }\n    };\n    /**\n     * Initializes the focusable day if the day is in the calendar. If focusable day is not set, then\n     * we check for the selected day. If selected day is not set then check if today is in the current\n     * calendar. If not then just set the 15th of the current calendar month.\n     */\n    /**\n     * Initializes the focusable day if the day is in the calendar. If focusable day is not set, then\n     * we check for the selected day. If selected day is not set then check if today is in the current\n     * calendar. If not then just set the 15th of the current calendar month.\n     * @return {?}\n     */\n    CalendarViewModel.prototype.initializeFocusableDay = /**\n     * Initializes the focusable day if the day is in the calendar. If focusable day is not set, then\n     * we check for the selected day. If selected day is not set then check if today is in the current\n     * calendar. If not then just set the 15th of the current calendar month.\n     * @return {?}\n     */\n    function () {\n        if (this.focusableDay && this.isDayInCalendarView(this.focusableDay)) {\n            this.setFocusableFlag(this.focusableDay, true);\n        }\n        else if (this.selectedDay && this.isDayInCalendarView(this.selectedDay)) {\n            this.setFocusableFlag(this.selectedDay, true);\n            this.focusableDay = this.selectedDay.clone();\n        }\n        else if (this.isDayInCalendarView(this.today)) {\n            this.setFocusableFlag(this.today, true);\n            this.focusableDay = this.today.clone();\n        }\n        else {\n            this.focusableDay = new DayModel(this.calendar.year, this.calendar.month, 15);\n            this.setFocusableFlag(this.focusableDay, true);\n        }\n    };\n    /**\n     * @param {?} day\n     * @param {?} flag\n     * @return {?}\n     */\n    CalendarViewModel.prototype.setFocusableFlag = /**\n     * @param {?} day\n     * @param {?} flag\n     * @return {?}\n     */\n    function (day, flag) {\n        if (day) {\n            this.currMonthDayViews[day.date - 1].isFocusable = flag;\n        }\n    };\n    /**\n     * Updates the focusable day in the calendar.\n     */\n    /**\n     * Updates the focusable day in the calendar.\n     * @param {?} day\n     * @return {?}\n     */\n    CalendarViewModel.prototype.updateFocusableDay = /**\n     * Updates the focusable day in the calendar.\n     * @param {?} day\n     * @return {?}\n     */\n    function (day) {\n        this.setFocusableFlag(this.focusableDay, false);\n        this.setFocusableFlag(day, true);\n        this.focusableDay = day;\n    };\n    return CalendarViewModel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * This service is responsible for:\n * 1. Initializing the displayed calendar.\n * 2. Moving the calendar to the next, previous or current months\n * 3. Managing the focused and selected day models.\n */\nvar DateNavigationService = /** @class */ (function () {\n    function DateNavigationService() {\n        /**\n         * Variable to store today's date.\n         */\n        this._todaysFullDate = new Date();\n        this._selectedDayChange = new Subject();\n        this._displayedCalendarChange = new Subject();\n        this._focusOnCalendarChange = new Subject();\n        this._focusedDayChange = new Subject();\n    }\n    Object.defineProperty(DateNavigationService.prototype, \"displayedCalendar\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._displayedCalendar;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // not a setter because i want this to remain private\n    // not a setter because i want this to remain private\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    DateNavigationService.prototype.setDisplayedCalendar = \n    // not a setter because i want this to remain private\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        if (!this._displayedCalendar.isEqual(value)) {\n            this._displayedCalendar = value;\n            this._displayedCalendarChange.next();\n        }\n    };\n    /**\n     * @return {?}\n     */\n    DateNavigationService.prototype.initializeTodaysDate = /**\n     * @return {?}\n     */\n    function () {\n        this._todaysFullDate = new Date();\n        this._today = new DayModel(this._todaysFullDate.getFullYear(), this._todaysFullDate.getMonth(), this._todaysFullDate.getDate());\n    };\n    Object.defineProperty(DateNavigationService.prototype, \"today\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._today;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DateNavigationService.prototype, \"selectedDayChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._selectedDayChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Notifies that the selected day has changed so that the date can be emitted to the user.\n     * Note: Only to be called from day.ts\n     */\n    /**\n     * Notifies that the selected day has changed so that the date can be emitted to the user.\n     * Note: Only to be called from day.ts\n     * @param {?} dayModel\n     * @return {?}\n     */\n    DateNavigationService.prototype.notifySelectedDayChanged = /**\n     * Notifies that the selected day has changed so that the date can be emitted to the user.\n     * Note: Only to be called from day.ts\n     * @param {?} dayModel\n     * @return {?}\n     */\n    function (dayModel) {\n        if (dayModel.isEqual(this.selectedDay)) {\n            return;\n        }\n        this.selectedDay = dayModel;\n        this._selectedDayChange.next(dayModel);\n    };\n    /**\n     * Initializes the calendar based on the selected day.\n     */\n    /**\n     * Initializes the calendar based on the selected day.\n     * @return {?}\n     */\n    DateNavigationService.prototype.initializeCalendar = /**\n     * Initializes the calendar based on the selected day.\n     * @return {?}\n     */\n    function () {\n        this.focusedDay = null; // Can be removed later on the store focus\n        this.initializeTodaysDate();\n        if (this.selectedDay) {\n            this._displayedCalendar = new CalendarModel(this.selectedDay.year, this.selectedDay.month);\n        }\n        else {\n            this._displayedCalendar = new CalendarModel(this.today.year, this.today.month);\n        }\n    };\n    /**\n     * @param {?} month\n     * @return {?}\n     */\n    DateNavigationService.prototype.changeMonth = /**\n     * @param {?} month\n     * @return {?}\n     */\n    function (month) {\n        this.setDisplayedCalendar(new CalendarModel(this._displayedCalendar.year, month));\n    };\n    /**\n     * @param {?} year\n     * @return {?}\n     */\n    DateNavigationService.prototype.changeYear = /**\n     * @param {?} year\n     * @return {?}\n     */\n    function (year) {\n        this.setDisplayedCalendar(new CalendarModel(year, this._displayedCalendar.month));\n    };\n    /**\n     * Moves the displayed calendar to the next month.\n     */\n    /**\n     * Moves the displayed calendar to the next month.\n     * @return {?}\n     */\n    DateNavigationService.prototype.moveToNextMonth = /**\n     * Moves the displayed calendar to the next month.\n     * @return {?}\n     */\n    function () {\n        this.setDisplayedCalendar(this._displayedCalendar.nextMonth());\n    };\n    /**\n     * Moves the displayed calendar to the previous month.\n     */\n    /**\n     * Moves the displayed calendar to the previous month.\n     * @return {?}\n     */\n    DateNavigationService.prototype.moveToPreviousMonth = /**\n     * Moves the displayed calendar to the previous month.\n     * @return {?}\n     */\n    function () {\n        this.setDisplayedCalendar(this._displayedCalendar.previousMonth());\n    };\n    /**\n     * Moves the displayed calendar to the current month and year.\n     */\n    /**\n     * Moves the displayed calendar to the current month and year.\n     * @return {?}\n     */\n    DateNavigationService.prototype.moveToCurrentMonth = /**\n     * Moves the displayed calendar to the current month and year.\n     * @return {?}\n     */\n    function () {\n        if (!this.displayedCalendar.isDayInCalendar(this.today)) {\n            this.setDisplayedCalendar(new CalendarModel(this.today.year, this.today.month));\n        }\n        this._focusOnCalendarChange.next();\n    };\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    DateNavigationService.prototype.incrementFocusDay = /**\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        this.focusedDay = this.focusedDay.incrementBy(value);\n        if (this._displayedCalendar.isDayInCalendar(this.focusedDay)) {\n            this._focusedDayChange.next(this.focusedDay);\n        }\n        else {\n            this.setDisplayedCalendar(this.focusedDay.calendar);\n        }\n        this._focusOnCalendarChange.next();\n    };\n    Object.defineProperty(DateNavigationService.prototype, \"displayedCalendarChange\", {\n        /**\n         * This observable lets the subscriber know that the displayed calendar has changed.\n         */\n        get: /**\n         * This observable lets the subscriber know that the displayed calendar has changed.\n         * @return {?}\n         */\n        function () {\n            return this._displayedCalendarChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DateNavigationService.prototype, \"focusOnCalendarChange\", {\n        /**\n         * This observable lets the subscriber know that the focus should be applied on the calendar.\n         */\n        get: /**\n         * This observable lets the subscriber know that the focus should be applied on the calendar.\n         * @return {?}\n         */\n        function () {\n            return this._focusOnCalendarChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DateNavigationService.prototype, \"focusedDayChange\", {\n        /**\n         * This observable lets the subscriber know that the focused day in the displayed calendar has changed.\n         */\n        get: /**\n         * This observable lets the subscriber know that the focused day in the displayed calendar has changed.\n         * @return {?}\n         */\n        function () {\n            return this._focusedDayChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    DateNavigationService.decorators = [\n        { type: Injectable }\n    ];\n    return DateNavigationService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * This service focuses the day that is focusable in the calendar.\n */\nvar DatepickerFocusService = /** @class */ (function () {\n    function DatepickerFocusService(_ngZone, platformId) {\n        this._ngZone = _ngZone;\n        this.platformId = platformId;\n    }\n    // Credit: Material: https://github.com/angular/material2/blob/master/src/lib/datepicker/calendar.ts\n    // Credit: Material: https://github.com/angular/material2/blob/master/src/lib/datepicker/calendar.ts\n    /**\n     * @param {?} elRef\n     * @return {?}\n     */\n    DatepickerFocusService.prototype.focusCell = \n    // Credit: Material: https://github.com/angular/material2/blob/master/src/lib/datepicker/calendar.ts\n    /**\n     * @param {?} elRef\n     * @return {?}\n     */\n    function (elRef) {\n        var _this = this;\n        this._ngZone.runOutsideAngular(function () {\n            _this._ngZone.onStable\n                .asObservable()\n                .pipe(first())\n                .subscribe(function () {\n                if (isPlatformBrowser(_this.platformId)) {\n                    /** @type {?} */\n                    var focusEl = elRef.nativeElement.querySelector('[tabindex=\"0\"]');\n                    if (focusEl) {\n                        focusEl.focus();\n                    }\n                }\n            });\n        });\n    };\n    DatepickerFocusService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DatepickerFocusService.ctorParameters = function () { return [\n        { type: NgZone },\n        { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }\n    ]; };\n    return DatepickerFocusService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * This service extracts the Angular CLDR data needed by the datepicker.\n */\nvar LocaleHelperService = /** @class */ (function () {\n    function LocaleHelperService(locale) {\n        this.locale = locale;\n        this._firstDayOfWeek = 0;\n        this.initializeLocaleData();\n    }\n    Object.defineProperty(LocaleHelperService.prototype, \"firstDayOfWeek\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._firstDayOfWeek;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(LocaleHelperService.prototype, \"localeDaysNarrow\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._localeDaysNarrow;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(LocaleHelperService.prototype, \"localeMonthsAbbreviated\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._localeMonthsAbbreviated;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(LocaleHelperService.prototype, \"localeMonthsWide\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._localeMonthsWide;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(LocaleHelperService.prototype, \"localeDateFormat\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._localeDateFormat;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Initializes the locale data.\n     */\n    /**\n     * Initializes the locale data.\n     * @return {?}\n     */\n    LocaleHelperService.prototype.initializeLocaleData = /**\n     * Initializes the locale data.\n     * @return {?}\n     */\n    function () {\n        // Order in which these functions is called is very important.\n        this.initializeFirstDayOfWeek();\n        this.initializeLocaleDateFormat();\n        this.initializeLocaleMonthsAbbreviated();\n        this.initializeLocaleMonthsWide();\n        this.initializeLocaleDaysNarrow();\n    };\n    /**\n     * Initialize day names in the TranslationWidth.Narrow format based on the locale.\n     * eg: [S, M, T...] for en-US.\n     */\n    /**\n     * Initialize day names in the TranslationWidth.Narrow format based on the locale.\n     * eg: [S, M, T...] for en-US.\n     * @return {?}\n     */\n    LocaleHelperService.prototype.initializeLocaleDaysNarrow = /**\n     * Initialize day names in the TranslationWidth.Narrow format based on the locale.\n     * eg: [S, M, T...] for en-US.\n     * @return {?}\n     */\n    function () {\n        // Get locale day names starting with Sunday\n        /** @type {?} */\n        var tempArr = getLocaleDayNames(this.locale, FormStyle.Standalone, TranslationWidth.Narrow).slice();\n        // Get first day of the week based on the locale\n        /** @type {?} */\n        var firstDayOfWeek = this.firstDayOfWeek;\n        // Rearrange the tempArr to start with the first day of the week based on the locale.\n        if (firstDayOfWeek > 0) {\n            /** @type {?} */\n            var prevDays = tempArr.splice(0, firstDayOfWeek);\n            tempArr.push.apply(tempArr, __spread(prevDays));\n        }\n        this._localeDaysNarrow = tempArr;\n    };\n    /**\n     * Initializes the array of month names in the TranslationWidth.Abbreviated format.\n     * e.g. `[Jan, Feb, ...]` for en-US\n     */\n    /**\n     * Initializes the array of month names in the TranslationWidth.Abbreviated format.\n     * e.g. `[Jan, Feb, ...]` for en-US\n     * @return {?}\n     */\n    LocaleHelperService.prototype.initializeLocaleMonthsAbbreviated = /**\n     * Initializes the array of month names in the TranslationWidth.Abbreviated format.\n     * e.g. `[Jan, Feb, ...]` for en-US\n     * @return {?}\n     */\n    function () {\n        this._localeMonthsAbbreviated = getLocaleMonthNames(this.locale, FormStyle.Standalone, TranslationWidth.Abbreviated).slice();\n    };\n    /**\n     * Initializes the array of month names in the TranslationWidth.Wide format.\n     * e.g. `[January, February, ...]` for en-US\n     */\n    /**\n     * Initializes the array of month names in the TranslationWidth.Wide format.\n     * e.g. `[January, February, ...]` for en-US\n     * @return {?}\n     */\n    LocaleHelperService.prototype.initializeLocaleMonthsWide = /**\n     * Initializes the array of month names in the TranslationWidth.Wide format.\n     * e.g. `[January, February, ...]` for en-US\n     * @return {?}\n     */\n    function () {\n        this._localeMonthsWide = getLocaleMonthNames(this.locale, FormStyle.Standalone, TranslationWidth.Wide).slice();\n    };\n    /**\n     * Initializes the first day of the week based on the locale.\n     */\n    /**\n     * Initializes the first day of the week based on the locale.\n     * @return {?}\n     */\n    LocaleHelperService.prototype.initializeFirstDayOfWeek = /**\n     * Initializes the first day of the week based on the locale.\n     * @return {?}\n     */\n    function () {\n        this._firstDayOfWeek = getLocaleFirstDayOfWeek(this.locale);\n    };\n    /**\n     * @return {?}\n     */\n    LocaleHelperService.prototype.initializeLocaleDateFormat = /**\n     * @return {?}\n     */\n    function () {\n        this._localeDateFormat = getLocaleDateFormat(this.locale, FormatWidth.Short);\n    };\n    LocaleHelperService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    LocaleHelperService.ctorParameters = function () { return [\n        { type: String, decorators: [{ type: Inject, args: [LOCALE_ID,] }] }\n    ]; };\n    return LocaleHelperService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrCalendar = /** @class */ (function () {\n    function ClrCalendar(_localeHelperService, _dateNavigationService, _datepickerFocusService, _elRef) {\n        this._localeHelperService = _localeHelperService;\n        this._dateNavigationService = _dateNavigationService;\n        this._datepickerFocusService = _datepickerFocusService;\n        this._elRef = _elRef;\n        this._subs = [];\n        this.generateCalendarView();\n        this.initializeSubscriptions();\n    }\n    Object.defineProperty(ClrCalendar.prototype, \"localeDaysNarrow\", {\n        /**\n         * Gets the locale days according to the TranslationWidth.Narrow format.\n         */\n        get: /**\n         * Gets the locale days according to the TranslationWidth.Narrow format.\n         * @return {?}\n         */\n        function () {\n            return this._localeHelperService.localeDaysNarrow;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrCalendar.prototype, \"calendar\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._dateNavigationService.displayedCalendar;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrCalendar.prototype, \"selectedDay\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._dateNavigationService.selectedDay;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrCalendar.prototype, \"focusedDay\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._dateNavigationService.focusedDay;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrCalendar.prototype, \"today\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._dateNavigationService.today;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Initialize subscriptions to:\n     * 1. update the calendar view model.\n     * 2. update the focusable day in the calendar view model.\n     * 3. focus on the focusable day in the calendar.\n     */\n    /**\n     * Initialize subscriptions to:\n     * 1. update the calendar view model.\n     * 2. update the focusable day in the calendar view model.\n     * 3. focus on the focusable day in the calendar.\n     * @return {?}\n     */\n    ClrCalendar.prototype.initializeSubscriptions = /**\n     * Initialize subscriptions to:\n     * 1. update the calendar view model.\n     * 2. update the focusable day in the calendar view model.\n     * 3. focus on the focusable day in the calendar.\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this._subs.push(this._dateNavigationService.displayedCalendarChange.subscribe(function () {\n            _this.generateCalendarView();\n        }));\n        this._subs.push(this._dateNavigationService.focusedDayChange.subscribe(function (focusedDay) {\n            _this.calendarViewModel.updateFocusableDay(focusedDay);\n        }));\n        this._subs.push(this._dateNavigationService.focusOnCalendarChange.subscribe(function () {\n            _this._datepickerFocusService.focusCell(_this._elRef);\n        }));\n    };\n    /**\n     * Generates the Calendar View based on the calendar retrieved from the DateNavigationService.\n     */\n    /**\n     * Generates the Calendar View based on the calendar retrieved from the DateNavigationService.\n     * @return {?}\n     */\n    ClrCalendar.prototype.generateCalendarView = /**\n     * Generates the Calendar View based on the calendar retrieved from the DateNavigationService.\n     * @return {?}\n     */\n    function () {\n        this.calendarViewModel = new CalendarViewModel(this.calendar, this.selectedDay, this.focusedDay, this.today, this._localeHelperService.firstDayOfWeek);\n    };\n    /**\n     * Delegates Keyboard arrow navigation to the DateNavigationService.\n     */\n    /**\n     * Delegates Keyboard arrow navigation to the DateNavigationService.\n     * @param {?} event\n     * @return {?}\n     */\n    ClrCalendar.prototype.onKeyDown = /**\n     * Delegates Keyboard arrow navigation to the DateNavigationService.\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        if (event && this.focusedDay) {\n            switch (event.keyCode) {\n                case UP_ARROW:\n                    event.preventDefault();\n                    this._dateNavigationService.incrementFocusDay(-1 * NO_OF_DAYS_IN_A_WEEK);\n                    break;\n                case DOWN_ARROW:\n                    event.preventDefault();\n                    this._dateNavigationService.incrementFocusDay(NO_OF_DAYS_IN_A_WEEK);\n                    break;\n                case LEFT_ARROW:\n                    event.preventDefault();\n                    this._dateNavigationService.incrementFocusDay(-1);\n                    break;\n                case RIGHT_ARROW:\n                    event.preventDefault();\n                    this._dateNavigationService.incrementFocusDay(1);\n                    break;\n                default:\n                    break; // No default case. TSLint x-(\n            }\n        }\n    };\n    /**\n     * Focuses on the focusable day when the Calendar View is initialized.\n     */\n    /**\n     * Focuses on the focusable day when the Calendar View is initialized.\n     * @return {?}\n     */\n    ClrCalendar.prototype.ngAfterViewInit = /**\n     * Focuses on the focusable day when the Calendar View is initialized.\n     * @return {?}\n     */\n    function () {\n        this._datepickerFocusService.focusCell(this._elRef);\n    };\n    /**\n     * Unsubscribe from subscriptions.\n     */\n    /**\n     * Unsubscribe from subscriptions.\n     * @return {?}\n     */\n    ClrCalendar.prototype.ngOnDestroy = /**\n     * Unsubscribe from subscriptions.\n     * @return {?}\n     */\n    function () {\n        this._subs.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrCalendar.decorators = [\n        { type: Component, args: [{ selector: 'clr-calendar', template: \"<table class=\\\"calendar-table weekdays\\\">\\n    <tr class=\\\"calendar-row\\\">\\n        <td *ngFor=\\\"let day of localeDaysNarrow\\\" class=\\\"calendar-cell weekday\\\">\\n            {{day}}\\n        </td>\\n    </tr>\\n</table>\\n<table\\n    class=\\\"calendar-table calendar-dates\\\">\\n    <tr class=\\\"calendar-row\\\" *ngFor=\\\"let row of calendarViewModel.calendarView\\\">\\n        <td *ngFor=\\\"let dayView of row\\\" class=\\\"calendar-cell\\\">\\n            <clr-day [clrDayView]=\\\"dayView\\\"></clr-day>\\n        </td>\\n    </tr>\\n</table>\\n\" }] }\n    ];\n    /** @nocollapse */\n    ClrCalendar.ctorParameters = function () { return [\n        { type: LocaleHelperService },\n        { type: DateNavigationService },\n        { type: DatepickerFocusService },\n        { type: ElementRef }\n    ]; };\n    ClrCalendar.propDecorators = {\n        onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }]\n    };\n    return ClrCalendar;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar FocusService = /** @class */ (function () {\n    function FocusService() {\n        this._focused = new BehaviorSubject(false);\n    }\n    Object.defineProperty(FocusService.prototype, \"focusChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._focused.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(FocusService.prototype, \"focused\", {\n        set: /**\n         * @param {?} state\n         * @return {?}\n         */\n        function (state$$1) {\n            this._focused.next(state$$1);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    FocusService.decorators = [\n        { type: Injectable }\n    ];\n    return FocusService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DateFormControlService = /** @class */ (function () {\n    function DateFormControlService() {\n        this._touchedChange = new Subject();\n        this._dirtyChange = new Subject();\n    }\n    Object.defineProperty(DateFormControlService.prototype, \"touchedChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._touchedChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DateFormControlService.prototype, \"dirtyChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._dirtyChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    DateFormControlService.prototype.markAsTouched = /**\n     * @return {?}\n     */\n    function () {\n        this._touchedChange.next();\n    };\n    /**\n     * @return {?}\n     */\n    DateFormControlService.prototype.markAsDirty = /**\n     * @return {?}\n     */\n    function () {\n        this._dirtyChange.next();\n    };\n    DateFormControlService.decorators = [\n        { type: Injectable }\n    ];\n    return DateFormControlService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DateIOService = /** @class */ (function () {\n    function DateIOService(_localeHelperService) {\n        this._localeHelperService = _localeHelperService;\n        this.cldrLocaleDateFormat = DEFAULT_LOCALE_FORMAT;\n        this.localeDisplayFormat = LITTLE_ENDIAN;\n        this.delimiters = ['/', '/'];\n        this.cldrLocaleDateFormat = this._localeHelperService.localeDateFormat;\n        this.initializeLocaleDisplayFormat();\n    }\n    /**\n     * @return {?}\n     */\n    DateIOService.prototype.initializeLocaleDisplayFormat = /**\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var format = this.cldrLocaleDateFormat.toLocaleLowerCase();\n        if (LITTLE_ENDIAN_REGEX.test(format)) {\n            this.localeDisplayFormat = LITTLE_ENDIAN;\n        }\n        else if (MIDDLE_ENDIAN_REGEX.test(format)) {\n            this.localeDisplayFormat = MIDDLE_ENDIAN;\n        }\n        else {\n            // everything else is set to BIG-ENDIAN FORMAT\n            this.localeDisplayFormat = BIG_ENDIAN;\n        }\n        this.extractDelimiters();\n    };\n    /**\n     * @return {?}\n     */\n    DateIOService.prototype.extractDelimiters = /**\n     * @return {?}\n     */\n    function () {\n        if (this.cldrLocaleDateFormat) {\n            // Sanitize Date Format. Remove RTL characters.\n            // FIXME: When we support RTL, remove this and handle it correctly.\n            /** @type {?} */\n            var localeFormat = this.cldrLocaleDateFormat.replace(RTL_REGEX, '');\n            /** @type {?} */\n            var delimiters = localeFormat.split(DELIMITER_REGEX);\n            // NOTE: The split from the CLDR date format should always result\n            // in an arary with 4 elements. The 1st and the 2nd values are the delimiters\n            // we will use in order.\n            // Eg: \"dd/MM/y\".split(/d+|m+|y+/i) results in [\"\", \"/\", \"/\", \"\"]\n            if (delimiters && delimiters.length === 4) {\n                this.delimiters = [delimiters[1], delimiters[2]];\n            }\n            else {\n                console.error('Unexpected date format received. Delimiters extracted: ', delimiters);\n            }\n        }\n    };\n    /**\n     * @param {?} date\n     * @return {?}\n     */\n    DateIOService.prototype.toLocaleDisplayFormatString = /**\n     * @param {?} date\n     * @return {?}\n     */\n    function (date) {\n        if (date) {\n            if (isNaN(date.getTime())) {\n                return '';\n            }\n            /** @type {?} */\n            var dateNo = date.getDate();\n            /** @type {?} */\n            var monthNo = date.getMonth() + 1;\n            /** @type {?} */\n            var dateStr = dateNo > 9 ? dateNo.toString() : '0' + dateNo;\n            /** @type {?} */\n            var monthStr = monthNo > 9 ? monthNo.toString() : '0' + monthNo;\n            if (this.localeDisplayFormat === LITTLE_ENDIAN) {\n                return dateStr + this.delimiters[0] + monthStr + this.delimiters[1] + date.getFullYear();\n            }\n            else if (this.localeDisplayFormat === MIDDLE_ENDIAN) {\n                return monthStr + this.delimiters[0] + dateStr + this.delimiters[1] + date.getFullYear();\n            }\n            else {\n                return date.getFullYear() + this.delimiters[0] + monthStr + this.delimiters[1] + dateStr;\n            }\n        }\n        return '';\n    };\n    Object.defineProperty(DateIOService.prototype, \"placeholderText\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            /** @type {?} */\n            var format = this.localeDisplayFormat.format;\n            return format[0] + this.delimiters[0] + format[1] + this.delimiters[1] + format[2];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Checks if the month entered by the user is valid or not.\n     * Note: Month is 0 based.\n     */\n    /**\n     * Checks if the month entered by the user is valid or not.\n     * Note: Month is 0 based.\n     * @param {?} month\n     * @return {?}\n     */\n    DateIOService.prototype.isValidMonth = /**\n     * Checks if the month entered by the user is valid or not.\n     * Note: Month is 0 based.\n     * @param {?} month\n     * @return {?}\n     */\n    function (month) {\n        return month > -1 && month < 12;\n    };\n    /**\n     * Checks if the date is valid depending on the year and month provided.\n     */\n    /**\n     * Checks if the date is valid depending on the year and month provided.\n     * @param {?} year\n     * @param {?} month\n     * @param {?} date\n     * @return {?}\n     */\n    DateIOService.prototype.isValidDate = /**\n     * Checks if the date is valid depending on the year and month provided.\n     * @param {?} year\n     * @param {?} month\n     * @param {?} date\n     * @return {?}\n     */\n    function (year, month, date) {\n        return date > 0 && date <= getNumberOfDaysInTheMonth(year, month);\n    };\n    /**\n     * Validates the parameters provided and returns the date.\n     * If the parameters are not\n     * valid then return null.\n     * NOTE: (Month here is 1 based since the user has provided that as an input)\n     */\n    /**\n     * Validates the parameters provided and returns the date.\n     * If the parameters are not\n     * valid then return null.\n     * NOTE: (Month here is 1 based since the user has provided that as an input)\n     * @param {?} year\n     * @param {?} month\n     * @param {?} date\n     * @return {?}\n     */\n    DateIOService.prototype.validateAndGetDate = /**\n     * Validates the parameters provided and returns the date.\n     * If the parameters are not\n     * valid then return null.\n     * NOTE: (Month here is 1 based since the user has provided that as an input)\n     * @param {?} year\n     * @param {?} month\n     * @param {?} date\n     * @return {?}\n     */\n    function (year, month, date) {\n        // I don't know whats wrong with the TS compiler. It throws an error if I write\n        // the below if statement. The error is:\n        // Operator '!==' cannot be applied to types '2' and '4'\n        // More info here: https://github.com/Microsoft/TypeScript/issues/12794#issuecomment-270342936\n        /*\n            if (year.length !== 2 || year.length !== 4) {\n                return null;\n            }\n            */\n        // I don't know whats wrong with the TS compiler. It throws an error if I write\n        // the below if statement. The error is:\n        // Operator '!==' cannot be applied to types '2' and '4'\n        // More info here: https://github.com/Microsoft/TypeScript/issues/12794#issuecomment-270342936\n        /*\n                if (year.length !== 2 || year.length !== 4) {\n                    return null;\n                }\n                */\n        // Instead I have to write the logic like this x-(\n        /** @type {?} */\n        var y = +year;\n        /** @type {?} */\n        var m = +month - 1;\n        // month is 0 based\n        /** @type {?} */\n        var d = +date;\n        if (!this.isValidMonth(m) || !this.isValidDate(y, m, d)) {\n            return null;\n        }\n        /** @type {?} */\n        var result = parseToFourDigitYear(y);\n        return result !== -1 ? new Date(result, m, d) : null;\n    };\n    /**\n     * Checks if the input provided by the user is valid.\n     */\n    /**\n     * Checks if the input provided by the user is valid.\n     * @param {?} date\n     * @return {?}\n     */\n    DateIOService.prototype.isValidInput = /**\n     * Checks if the input provided by the user is valid.\n     * @param {?} date\n     * @return {?}\n     */\n    function (date) {\n        if (!date) {\n            return null;\n        }\n        /** @type {?} */\n        var dateParts = date.match(USER_INPUT_REGEX);\n        if (!dateParts || dateParts.length !== 3) {\n            return null;\n        }\n        var _a = __read(dateParts, 3), firstPart = _a[0], secondPart = _a[1], thirdPart = _a[2];\n        if (this.localeDisplayFormat === LITTLE_ENDIAN) {\n            // secondPart is month && firstPart is date\n            return this.validateAndGetDate(thirdPart, secondPart, firstPart);\n        }\n        else if (this.localeDisplayFormat === MIDDLE_ENDIAN) {\n            // firstPart is month && secondPart is date\n            return this.validateAndGetDate(thirdPart, firstPart, secondPart);\n        }\n        else {\n            // secondPart is month && thirdPart is date\n            return this.validateAndGetDate(firstPart, secondPart, thirdPart);\n        }\n    };\n    DateIOService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DateIOService.ctorParameters = function () { return [\n        { type: LocaleHelperService }\n    ]; };\n    return DateIOService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n// iPad mini screen width\n// http://stephen.io/mediaqueries/#iPadMini\n/** @type {?} */\nvar DATEPICKER_ENABLE_BREAKPOINT = 768;\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatepickerEnabledService = /** @class */ (function () {\n    function DatepickerEnabledService(_document) {\n        this._document = _document;\n        this._isUserAgentMobile = false;\n        if (this._document) {\n            this._isUserAgentMobile = MOBILE_USERAGENT_REGEX.test(_document.defaultView.navigator.userAgent);\n            this._innerWidth = _document.defaultView.innerWidth;\n        }\n    }\n    Object.defineProperty(DatepickerEnabledService.prototype, \"isEnabled\", {\n        /**\n         * Returns if the calendar should be active or not.\n         * If the user agent is mobile and the screen width is less than DATEPICKER_ACTIVE_BREAKPOINT\n         * then the calendar is inactive.\n         */\n        get: /**\n         * Returns if the calendar should be active or not.\n         * If the user agent is mobile and the screen width is less than DATEPICKER_ACTIVE_BREAKPOINT\n         * then the calendar is inactive.\n         * @return {?}\n         */\n        function () {\n            // https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent\n            // What they recommend is:\n            //\"In summary, we recommend looking for the string 'Mobi'\n            // anywhere in the User Agent to detect a mobile device.\"\n            if (this._document) {\n                if (this._innerWidth < DATEPICKER_ENABLE_BREAKPOINT && this._isUserAgentMobile) {\n                    return false;\n                }\n            }\n            return true;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    DatepickerEnabledService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DatepickerEnabledService.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }\n    ]; };\n    return DatepickerEnabledService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * This component contains two template for the old and new forms layouts.\n * When it is time to remove the old forms layouts support, remove the ng-templates\n * and ng-container, and just keep the inner content of the #newLayout as the template\n * and move the ng-content for clrDate.\n */\nvar ClrDateContainer = /** @class */ (function () {\n    function ClrDateContainer(_ifOpenService, _dateNavigationService, _datepickerEnabledService, dateFormControlService, commonStrings, ifErrorService, focusService, controlClassService, layoutService, newFormsLayout, ngControlService) {\n        var _this = this;\n        this._ifOpenService = _ifOpenService;\n        this._dateNavigationService = _dateNavigationService;\n        this._datepickerEnabledService = _datepickerEnabledService;\n        this.dateFormControlService = dateFormControlService;\n        this.commonStrings = commonStrings;\n        this.ifErrorService = ifErrorService;\n        this.focusService = focusService;\n        this.controlClassService = controlClassService;\n        this.layoutService = layoutService;\n        this.newFormsLayout = newFormsLayout;\n        this.ngControlService = ngControlService;\n        this._dynamic = false;\n        this.invalid = false;\n        this.focus = false;\n        this.subscriptions = [];\n        this.subscriptions.push(this._ifOpenService.openChange.subscribe(function (open) {\n            if (open) {\n                _this.initializeCalendar();\n            }\n        }));\n        this.subscriptions.push(this.focusService.focusChange.subscribe(function (state$$1) {\n            _this.focus = state$$1;\n        }));\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.control = control;\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrDateContainer.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            _this.invalid = invalid;\n        }));\n    };\n    /**\n     * Returns the classes to apply to the control\n     */\n    /**\n     * Returns the classes to apply to the control\n     * @return {?}\n     */\n    ClrDateContainer.prototype.controlClass = /**\n     * Returns the classes to apply to the control\n     * @return {?}\n     */\n    function () {\n        return this.controlClassService.controlClass(this.invalid, this.addGrid());\n    };\n    /**\n     * Determines if the control needs to add grid classes\n     */\n    /**\n     * Determines if the control needs to add grid classes\n     * @return {?}\n     */\n    ClrDateContainer.prototype.addGrid = /**\n     * Determines if the control needs to add grid classes\n     * @return {?}\n     */\n    function () {\n        if (this.layoutService && !this.layoutService.isVertical()) {\n            return true;\n        }\n        return false;\n    };\n    Object.defineProperty(ClrDateContainer.prototype, \"isEnabled\", {\n        /**\n         * Returns if the Datepicker is enabled or not. If disabled, hides the datepicker trigger.\n         */\n        get: /**\n         * Returns if the Datepicker is enabled or not. If disabled, hides the datepicker trigger.\n         * @return {?}\n         */\n        function () {\n            return this._datepickerEnabledService.isEnabled;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Processes the user input and Initializes the Calendar everytime the datepicker popover is open.\n     */\n    /**\n     * Processes the user input and Initializes the Calendar everytime the datepicker popover is open.\n     * @return {?}\n     */\n    ClrDateContainer.prototype.initializeCalendar = /**\n     * Processes the user input and Initializes the Calendar everytime the datepicker popover is open.\n     * @return {?}\n     */\n    function () {\n        this._dateNavigationService.initializeCalendar();\n    };\n    /**\n     * Toggles the Datepicker Popover.\n     */\n    /**\n     * Toggles the Datepicker Popover.\n     * @param {?} event\n     * @return {?}\n     */\n    ClrDateContainer.prototype.toggleDatepicker = /**\n     * Toggles the Datepicker Popover.\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        this._ifOpenService.toggleWithEvent(event);\n        this.dateFormControlService.markAsTouched();\n    };\n    /**\n     * Unsubscribe from subscriptions.\n     */\n    /**\n     * Unsubscribe from subscriptions.\n     * @return {?}\n     */\n    ClrDateContainer.prototype.ngOnDestroy = /**\n     * Unsubscribe from subscriptions.\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.map(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrDateContainer.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-date-container',\n                    template: \"\\n    <ng-template #oldLayout>\\n        <ng-content></ng-content>\\n        <ng-container *ngTemplateOutlet=\\\"clrDate\\\"></ng-container>\\n        <button\\n            type=\\\"button\\\"\\n            class=\\\"datepicker-trigger\\\"\\n            (click)=\\\"toggleDatepicker($event)\\\"\\n            *ngIf=\\\"isEnabled\\\">\\n            <clr-icon shape=\\\"calendar\\\" class=\\\"datepicker-trigger-icon\\\" [attr.title]=\\\"commonStrings.open\\\"></clr-icon>\\n        </button>\\n        <clr-datepicker-view-manager *clrIfOpen clrFocusTrap></clr-datepicker-view-manager>\\n    </ng-template>\\n    \\n    <ng-template #newLayout>\\n      <ng-content select=\\\"label\\\"></ng-content>\\n      <label *ngIf=\\\"!label && addGrid()\\\"></label>\\n      <div class=\\\"clr-control-container\\\" [ngClass]=\\\"controlClass()\\\">\\n        <div class=\\\"clr-input-wrapper\\\">\\n          <div class=\\\"clr-input-group\\\" [class.clr-focus]=\\\"focus\\\">\\n            <ng-container *ngTemplateOutlet=\\\"clrDate\\\"></ng-container>\\n            <button type=\\\"button\\\" class=\\\"datepicker-trigger\\\" (click)=\\\"toggleDatepicker($event)\\\" *ngIf=\\\"isEnabled\\\" [attr.title]=\\\"commonStrings.open\\\" [disabled]=\\\"control?.disabled\\\">\\n              <clr-icon shape=\\\"calendar\\\" class=\\\"clr-input-group-icon-action\\\"></clr-icon>\\n            </button>\\n            <clr-datepicker-view-manager *clrIfOpen clrFocusTrap></clr-datepicker-view-manager>\\n          </div>\\n          <clr-icon class=\\\"clr-validate-icon\\\" shape=\\\"exclamation-circle\\\"></clr-icon>\\n        </div>\\n        <ng-content select=\\\"clr-control-helper\\\" *ngIf=\\\"!invalid\\\"></ng-content>\\n        <ng-content select=\\\"clr-control-error\\\" *ngIf=\\\"invalid\\\"></ng-content>\\n      </div>\\n    </ng-template>\\n    \\n    <ng-template #clrDate>\\n      <ng-content select=\\\"[clrDate]\\\"></ng-content>\\n    </ng-template>\\n    \\n    <ng-container *ngIf=\\\"newFormsLayout; then newLayout else oldLayout\\\"></ng-container>\\n    \",\n                    providers: [\n                        ControlIdService,\n                        IfOpenService,\n                        LocaleHelperService,\n                        IfErrorService,\n                        ControlClassService,\n                        FocusService,\n                        NgControlService,\n                        DateIOService,\n                        DateNavigationService,\n                        DatepickerEnabledService,\n                        DateFormControlService,\n                    ],\n                    host: {\n                        '[class.date-container]': '!newFormsLayout',\n                        '[class.clr-form-control-disabled]': 'control?.disabled',\n                        '[class.clr-form-control]': 'newFormsLayout',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDateContainer.ctorParameters = function () { return [\n        { type: IfOpenService },\n        { type: DateNavigationService },\n        { type: DatepickerEnabledService },\n        { type: DateFormControlService },\n        { type: ClrCommonStrings },\n        { type: IfErrorService },\n        { type: FocusService },\n        { type: ControlClassService },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [IS_NEW_FORMS_LAYOUT,] }] },\n        { type: NgControlService }\n    ]; };\n    ClrDateContainer.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }]\n    };\n    return ClrDateContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDateInput = /** @class */ (function (_super) {\n    __extends(ClrDateInput, _super);\n    function ClrDateInput(vcr, injector, el, renderer, control, container, _dateIOService, _dateNavigationService, _datepickerEnabledService, dateFormControlService, platformId, focusService, newFormsLayout) {\n        var _this = _super.call(this, vcr, ClrDateContainer, injector, control, renderer, el) || this;\n        _this.el = el;\n        _this.renderer = renderer;\n        _this.control = control;\n        _this.container = container;\n        _this._dateIOService = _dateIOService;\n        _this._dateNavigationService = _dateNavigationService;\n        _this._datepickerEnabledService = _datepickerEnabledService;\n        _this.dateFormControlService = dateFormControlService;\n        _this.platformId = platformId;\n        _this.focusService = focusService;\n        _this.newFormsLayout = newFormsLayout;\n        _this.index = 4;\n        //We need this variable because if the date input has a value initialized\n        //we do not output it. This variable is false during initial load. We make sure that\n        //during initial load dayModelOutputted is equal to the value entered by the user so that initialized\n        //value isn't emitted back to the user. After initial load,\n        //we set this to true and the dayModelOutputted is set only\n        //when the Output is emitted to the user.\n        _this.previousOutputInitializedFlag = false;\n        _this.initialLoad = true;\n        //\n        // Output Management\n        // Note: For now we will not emit both clrDateChange and ngControl outputs\n        // at the same time. This requires us to listen to keydown and blur events to figure out\n        // exactly when the Output should be emitted.\n        // Our recommendation right now is to either use clrDate or use ngModel/FormControl.\n        // Do not use both of them together.\n        //\n        _this._dateUpdated = new EventEmitter(false);\n        return _this;\n    }\n    /**\n     * @param {?} dayModel\n     * @return {?}\n     */\n    ClrDateInput.prototype.initializePreviousOutput = /**\n     * @param {?} dayModel\n     * @return {?}\n     */\n    function (dayModel) {\n        if (!this.previousOutputInitializedFlag) {\n            this.previousOutput = dayModel;\n            this.previousOutputInitializedFlag = true;\n        }\n    };\n    /**\n     * 1. Populate services if the date container is not present.\n     * 2. Initialize Subscriptions.\n     * 3. Process User Input.\n     */\n    /**\n     * 1. Populate services if the date container is not present.\n     * 2. Initialize Subscriptions.\n     * 3. Process User Input.\n     * @return {?}\n     */\n    ClrDateInput.prototype.ngOnInit = /**\n     * 1. Populate services if the date container is not present.\n     * 2. Initialize Subscriptions.\n     * 3. Process User Input.\n     * @return {?}\n     */\n    function () {\n        _super.prototype.ngOnInit.call(this);\n        if (!this.container) {\n            this.populateContainerServices();\n        }\n        this.initializeSubscriptions();\n        this.processInitialInputs();\n        if (this.clrNewLayout !== undefined) {\n            this.newFormsLayout = !!this.clrNewLayout;\n        }\n    };\n    /**\n     * Process the inputs initialized by the user which were missed\n     * because of late subscriptions or lifecycle method calls.\n     */\n    /**\n     * Process the inputs initialized by the user which were missed\n     * because of late subscriptions or lifecycle method calls.\n     * @return {?}\n     */\n    ClrDateInput.prototype.processInitialInputs = /**\n     * Process the inputs initialized by the user which were missed\n     * because of late subscriptions or lifecycle method calls.\n     * @return {?}\n     */\n    function () {\n        this.processUserDateObject(this.dateValueOnInitialLoad);\n        // Handle Inital Value from Reactive Forms\n        // TODO: We are repeating this logic at multiple places. This makes me think\n        // if this class should have implemented the ControlValueAccessor interface.\n        // Will explore that later and see if its a cleaner solution.\n        if (this.control && this.control.value) {\n            this.updateInputValue(this.control.value);\n            this.initializePreviousOutput(this._dateNavigationService.selectedDay);\n        }\n    };\n    /**\n     * Write the initial input set by the user on to the input field.\n     */\n    /**\n     * Write the initial input set by the user on to the input field.\n     * @return {?}\n     */\n    ClrDateInput.prototype.ngAfterViewInit = /**\n     * Write the initial input set by the user on to the input field.\n     * @return {?}\n     */\n    function () {\n        // I don't know why I have to do this but after using the new HostWrapping Module I have to delay the processing\n        // of the initial Input set by the user to here.  If I do not 2 issues occur:\n        // 1. the Input setter is called before ngOnInit. ngOnInit initializes the services without which the setter\n        // fails\n        // 2. The Renderer doesn't work before ngAfterViewInit\n        //(It used to before the new HostWrapping Module for some reason).\n        // I need the renderer to set the value property on the input to make sure that if the user has supplied a Date\n        // input object,  we reflect it with the right date on the input field using the IO service.  I am not sure if\n        // these are major issues or not but just noting them down here.\n        if (this._dateNavigationService) {\n            /** @type {?} */\n            var selDay = this._dateNavigationService.selectedDay;\n            if (selDay) {\n                /** @type {?} */\n                var dateStr = this._dateIOService.toLocaleDisplayFormatString(selDay.toDate());\n                this.writeDateStrToInputField(dateStr);\n            }\n        }\n        this.initialLoad = false;\n    };\n    /**\n     * Populates the services from the container component.\n     */\n    /**\n     * Populates the services from the container component.\n     * @return {?}\n     */\n    ClrDateInput.prototype.populateContainerServices = /**\n     * Populates the services from the container component.\n     * @return {?}\n     */\n    function () {\n        this._dateIOService = this.getProviderFromContainer(DateIOService);\n        this._dateNavigationService = this.getProviderFromContainer(DateNavigationService);\n        this._datepickerEnabledService = this.getProviderFromContainer(DatepickerEnabledService);\n        this.dateFormControlService = this.getProviderFromContainer(DateFormControlService);\n    };\n    /**\n     * Writes the date string value to the input field\n     */\n    /**\n     * Writes the date string value to the input field\n     * @param {?} value\n     * @return {?}\n     */\n    ClrDateInput.prototype.writeDateStrToInputField = /**\n     * Writes the date string value to the input field\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        this.renderer.setProperty(this.el.nativeElement, 'value', value);\n    };\n    Object.defineProperty(ClrDateInput.prototype, \"date\", {\n        /**\n         * Javascript Date object input set by the user.\n         */\n        set: /**\n         * Javascript Date object input set by the user.\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this.initialLoad) {\n                // Store date value passed by the user to process after the services have been initialized by\n                // the ngOnInit hook.\n                this.dateValueOnInitialLoad = value;\n            }\n            else {\n                this.processUserDateObject(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Processes a date object to check if its valid or not.\n     */\n    /**\n     * Processes a date object to check if its valid or not.\n     * @param {?} value\n     * @return {?}\n     */\n    ClrDateInput.prototype.processUserDateObject = /**\n     * Processes a date object to check if its valid or not.\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        if (this._dateIOService) {\n            // The date object is converted back to string because in Javascript you can create a date object\n            // like this: new Date(\"Test\"). This is a date object but it is invalid. Converting the date object\n            // that the user passed helps us to verify the validity of the date object.\n            /** @type {?} */\n            var dateStr = this._dateIOService.toLocaleDisplayFormatString(value);\n            this.updateInputValue(dateStr);\n        }\n    };\n    /**\n     * @param {?} dateStr\n     * @return {?}\n     */\n    ClrDateInput.prototype.updateInputValue = /**\n     * @param {?} dateStr\n     * @return {?}\n     */\n    function (dateStr) {\n        /** @type {?} */\n        var date = this._dateIOService.isValidInput(dateStr);\n        if (date) {\n            /** @type {?} */\n            var dayModel = new DayModel(date.getFullYear(), date.getMonth(), date.getDate());\n            if (!dayModel.isEqual(this._dateNavigationService.selectedDay)) {\n                this._dateNavigationService.selectedDay = dayModel;\n                this.writeDateStrToInputField(dateStr);\n            }\n        }\n        else {\n            this._dateNavigationService.selectedDay = null;\n        }\n    };\n    Object.defineProperty(ClrDateInput.prototype, \"placeholderText\", {\n        /**\n         * Returns the date format for the placeholder according to which the input should be entered by the user.\n         */\n        get: /**\n         * Returns the date format for the placeholder according to which the input should be entered by the user.\n         * @return {?}\n         */\n        function () {\n            return this.placeholder ? this.placeholder : this._dateIOService.placeholderText;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDateInput.prototype, \"inputType\", {\n        /**\n         * Sets the input type to text when the datepicker is enabled. Reverts back to the native date input\n         * when the datepicker is disabled. Datepicker is disabled on mobiles.\n         */\n        get: /**\n         * Sets the input type to text when the datepicker is enabled. Reverts back to the native date input\n         * when the datepicker is disabled. Datepicker is disabled on mobiles.\n         * @return {?}\n         */\n        function () {\n            return isPlatformBrowser(this.platformId) && this._datepickerEnabledService.isEnabled ? 'text' : 'date';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} dayModel\n     * @return {?}\n     */\n    ClrDateInput.prototype.emitDateOutput = /**\n     * @param {?} dayModel\n     * @return {?}\n     */\n    function (dayModel) {\n        if (dayModel && !dayModel.isEqual(this.previousOutput)) {\n            this._dateUpdated.emit(dayModel.toDate());\n            this.previousOutput = dayModel;\n        }\n        else if (!dayModel && this.previousOutput) {\n            this._dateUpdated.emit(null);\n            this.previousOutput = null;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrDateInput.prototype.setFocusStates = /**\n     * @return {?}\n     */\n    function () {\n        if (this.focusService) {\n            this.focusService.focused = true;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrDateInput.prototype.triggerValidation = /**\n     * @return {?}\n     */\n    function () {\n        _super.prototype.triggerValidation.call(this);\n        if (this.focusService) {\n            this.focusService.focused = false;\n        }\n    };\n    /**\n     * Fires this method when the user changes the input focuses out of the input field.\n     */\n    /**\n     * Fires this method when the user changes the input focuses out of the input field.\n     * @param {?} target\n     * @return {?}\n     */\n    ClrDateInput.prototype.onValueChange = /**\n     * Fires this method when the user changes the input focuses out of the input field.\n     * @param {?} target\n     * @return {?}\n     */\n    function (target) {\n        /** @type {?} */\n        var value = target.value;\n        /** @type {?} */\n        var date = this._dateIOService.isValidInput(value);\n        if (date) {\n            /** @type {?} */\n            var dayModel = new DayModel(date.getFullYear(), date.getMonth(), date.getDate());\n            this._dateNavigationService.selectedDay = dayModel;\n            this.emitDateOutput(dayModel);\n        }\n        else {\n            this._dateNavigationService.selectedDay = null;\n            this.emitDateOutput(null);\n        }\n    };\n    /**\n     * Initialize DateIO Subscriptions\n     */\n    /**\n     * Initialize DateIO Subscriptions\n     * @return {?}\n     */\n    ClrDateInput.prototype.initializeSubscriptions = /**\n     * Initialize DateIO Subscriptions\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this._dateNavigationService && this._dateIOService) {\n            // This subscription is fired when the user selects a date from the popover.\n            this.subscriptions.push(this._dateNavigationService.selectedDayChange.subscribe(function (dayModel) {\n                /** @type {?} */\n                var dateStr = _this._dateIOService.toLocaleDisplayFormatString(dayModel.toDate());\n                _this.writeDateStrToInputField(dateStr);\n                // This makes sure that ngModelChange is fired\n                // TODO: Check if there is a better way to do this.\n                // NOTE: Its important to use NgControl and not NgModel because\n                // NgModel only works with template driven forms\n                if (_this.control) {\n                    _this.control.control.setValue(dateStr);\n                }\n                _this.emitDateOutput(dayModel);\n            }));\n            // We do not emit an Output from this subscription because\n            // we only emit the Output when the user has focused out of the input.\n            if (this.control) {\n                this.subscriptions.push(this.control.valueChanges.subscribe(function (value) {\n                    /** @type {?} */\n                    var date = _this._dateIOService.isValidInput(value);\n                    if (date) {\n                        /** @type {?} */\n                        var dayModel = new DayModel(date.getFullYear(), date.getMonth(), date.getDate());\n                        _this._dateNavigationService.selectedDay = dayModel;\n                        _this.initializePreviousOutput(dayModel);\n                    }\n                    else if (value === '' || value === null) {\n                        _this._dateNavigationService.selectedDay = null;\n                        _this.initializePreviousOutput(null);\n                    }\n                    else {\n                        _this.initializePreviousOutput(null);\n                    }\n                }));\n            }\n        }\n        if (this.dateFormControlService) {\n            this.subscriptions.push(this.dateFormControlService.touchedChange.subscribe(function () {\n                if (_this.control) {\n                    _this.control.control.markAsTouched();\n                }\n            }));\n            this.subscriptions.push(this.dateFormControlService.dirtyChange.subscribe(function () {\n                if (_this.control) {\n                    _this.control.control.markAsDirty();\n                }\n            }));\n        }\n    };\n    ClrDateInput.decorators = [\n        { type: Directive, args: [{\n                    selector: '[clrDate]',\n                    host: {\n                        '[class.date-input]': '!newFormsLayout',\n                        '[class.clr-input]': 'newFormsLayout',\n                    },\n                },] }\n    ];\n    /** @nocollapse */\n    ClrDateInput.ctorParameters = function () { return [\n        { type: ViewContainerRef },\n        { type: Injector },\n        { type: ElementRef },\n        { type: Renderer2 },\n        { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },\n        { type: ClrDateContainer, decorators: [{ type: Optional }] },\n        { type: DateIOService, decorators: [{ type: Optional }] },\n        { type: DateNavigationService, decorators: [{ type: Optional }] },\n        { type: DatepickerEnabledService, decorators: [{ type: Optional }] },\n        { type: DateFormControlService, decorators: [{ type: Optional }] },\n        { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },\n        { type: FocusService, decorators: [{ type: Optional }] },\n        { type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [IS_NEW_FORMS_LAYOUT,] }] }\n    ]; };\n    ClrDateInput.propDecorators = {\n        clrNewLayout: [{ type: Input }],\n        date: [{ type: Input, args: ['clrDate',] }],\n        placeholder: [{ type: Input }],\n        placeholderText: [{ type: HostBinding, args: ['attr.placeholder',] }],\n        inputType: [{ type: HostBinding, args: ['attr.type',] }],\n        _dateUpdated: [{ type: Output, args: ['clrDateChange',] }],\n        setFocusStates: [{ type: HostListener, args: ['focus',] }],\n        triggerValidation: [{ type: HostListener, args: ['blur',] }],\n        onValueChange: [{ type: HostListener, args: ['change', ['$event.target'],] }]\n    };\n    return ClrDateInput;\n}(WrappedFormControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// Literally any annotation would work here, but writing our own @HoneyBadger annotation feels overkill.\n/**\n * @abstract\n */\nvar AbstractPopover = /** @class */ (function () {\n    function AbstractPopover(injector, parentHost) {\n        var _this = this;\n        this.parentHost = parentHost;\n        this.updateAnchor = false;\n        this.popoverOptions = {};\n        /*\n             * Until https://github.com/angular/angular/issues/8785 is supported, we don't have any way to instantiate\n             * a separate directive on the host. So let's do dirty but performant for now.\n             */\n        this.closeOnOutsideClick = false;\n        this.el = injector.get(ElementRef);\n        this.ifOpenService = injector.get(IfOpenService);\n        this.renderer = injector.get(Renderer2);\n        // Default anchor is the parent host\n        this.anchorElem = parentHost.nativeElement;\n        this.popoverInstance = new Popover(this.el.nativeElement);\n        this.subscription = this.ifOpenService.openChange.subscribe(function (change) {\n            if (change) {\n                _this.anchor();\n                _this.attachESCListener();\n            }\n            else {\n                _this.release();\n                _this.detachESCListener();\n            }\n        });\n        if (this.ifOpenService.open) {\n            this.anchor();\n            this.attachESCListener();\n        }\n    }\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.anchor = /**\n     * @return {?}\n     */\n    function () {\n        this.updateAnchor = true;\n        // Ugh\n        this.ignore = this.ifOpenService.originalEvent;\n    };\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.release = /**\n     * @return {?}\n     */\n    function () {\n        this.detachOutsideClickListener();\n        this.popoverInstance.release();\n    };\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.ngAfterViewChecked = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this.updateAnchor) {\n            this.updateAnchor = false;\n            this.popoverInstance\n                .anchor(this.anchorElem, this.anchorPoint, this.popoverPoint, this.popoverOptions)\n                .subscribe(function () {\n                // if a scroll event is detected, close the popover\n                _this.ifOpenService.open = false;\n            });\n            this.attachOutsideClickListener();\n        }\n    };\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.release();\n        this.detachESCListener();\n        this.subscription.unsubscribe();\n    };\n    Object.defineProperty(AbstractPopover.prototype, \"isOffScreen\", {\n        /*\n           * Fallback to hide when *clrIfOpen is not being used\n           */\n        get: /*\n             * Fallback to hide when *clrIfOpen is not being used\n             */\n        /**\n         * @return {?}\n         */\n        function () {\n            return this.ifOpenService.open ? false : true;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.attachESCListener = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.documentESCListener = this.renderer.listen('document', 'keydown', function (event) {\n            if (event && event.keyCode === ESC) {\n                _this.ifOpenService.open = false;\n            }\n        });\n    };\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.detachESCListener = /**\n     * @return {?}\n     */\n    function () {\n        if (this.documentESCListener) {\n            this.documentESCListener();\n            delete this.documentESCListener;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.attachOutsideClickListener = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this.closeOnOutsideClick) {\n            this.hostClickListener = this.renderer.listen(this.el.nativeElement, 'click', function (event) { return (_this.ignore = event); });\n            if (this.ignoredElement) {\n                this.ignoredElementClickListener = this.renderer.listen(this.ignoredElement, 'click', function (event) { return (_this.ignore = event); });\n            }\n            this.documentClickListener = this.renderer.listen('document', 'click', function (event) {\n                if (event === _this.ignore) {\n                    delete _this.ignore;\n                }\n                else {\n                    _this.ifOpenService.open = false;\n                }\n            });\n        }\n    };\n    /**\n     * @return {?}\n     */\n    AbstractPopover.prototype.detachOutsideClickListener = /**\n     * @return {?}\n     */\n    function () {\n        if (this.closeOnOutsideClick) {\n            if (this.hostClickListener) {\n                this.hostClickListener();\n                delete this.hostClickListener;\n            }\n            if (this.ignoredElementClickListener) {\n                this.ignoredElementClickListener();\n                delete this.ignoredElementClickListener;\n            }\n            if (this.documentClickListener) {\n                this.documentClickListener();\n                delete this.documentClickListener;\n            }\n        }\n    };\n    AbstractPopover.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    AbstractPopover.ctorParameters = function () { return [\n        { type: Injector },\n        { type: ElementRef, decorators: [{ type: SkipSelf }] }\n    ]; };\n    AbstractPopover.propDecorators = {\n        isOffScreen: [{ type: HostBinding, args: ['class.is-off-screen',] }]\n    };\n    return AbstractPopover;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * This service manages which view is visible in the datepicker popover.\n */\nvar ViewManagerService = /** @class */ (function () {\n    function ViewManagerService() {\n        this._currentView = \"DAYVIEW\" /* DAYVIEW */;\n    }\n    Object.defineProperty(ViewManagerService.prototype, \"isDayView\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._currentView === \"DAYVIEW\" /* DAYVIEW */;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ViewManagerService.prototype, \"isYearView\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._currentView === \"YEARVIEW\" /* YEARVIEW */;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ViewManagerService.prototype, \"isMonthView\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._currentView === \"MONTHVIEW\" /* MONTHVIEW */;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ViewManagerService.prototype.changeToMonthView = /**\n     * @return {?}\n     */\n    function () {\n        this._currentView = \"MONTHVIEW\" /* MONTHVIEW */;\n    };\n    /**\n     * @return {?}\n     */\n    ViewManagerService.prototype.changeToYearView = /**\n     * @return {?}\n     */\n    function () {\n        this._currentView = \"YEARVIEW\" /* YEARVIEW */;\n    };\n    /**\n     * @return {?}\n     */\n    ViewManagerService.prototype.changeToDayView = /**\n     * @return {?}\n     */\n    function () {\n        this._currentView = \"DAYVIEW\" /* DAYVIEW */;\n    };\n    ViewManagerService.decorators = [\n        { type: Injectable }\n    ];\n    return ViewManagerService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatepickerViewManager = /** @class */ (function (_super) {\n    __extends(ClrDatepickerViewManager, _super);\n    function ClrDatepickerViewManager(parent, _injector, _viewManagerService) {\n        var _this = _super.call(this, _injector, parent) || this;\n        _this._viewManagerService = _viewManagerService;\n        _this.configurePopover();\n        return _this;\n    }\n    /**\n     * Configure Popover Direction and Close indicators\n     */\n    /**\n     * Configure Popover Direction and Close indicators\n     * @return {?}\n     */\n    ClrDatepickerViewManager.prototype.configurePopover = /**\n     * Configure Popover Direction and Close indicators\n     * @return {?}\n     */\n    function () {\n        this.anchorPoint = Point.BOTTOM_LEFT;\n        this.popoverPoint = Point.LEFT_TOP;\n        this.closeOnOutsideClick = true;\n    };\n    Object.defineProperty(ClrDatepickerViewManager.prototype, \"isMonthView\", {\n        /**\n         * Returns if the current view is the monthpicker.\n         */\n        get: /**\n         * Returns if the current view is the monthpicker.\n         * @return {?}\n         */\n        function () {\n            return this._viewManagerService.isMonthView;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatepickerViewManager.prototype, \"isYearView\", {\n        /**\n         * Returns if the current view is the yearpicker.\n         */\n        get: /**\n         * Returns if the current view is the yearpicker.\n         * @return {?}\n         */\n        function () {\n            return this._viewManagerService.isYearView;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatepickerViewManager.prototype, \"isDayView\", {\n        /**\n         * Returns if the current view is the daypicker.\n         */\n        get: /**\n         * Returns if the current view is the daypicker.\n         * @return {?}\n         */\n        function () {\n            return this._viewManagerService.isDayView;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDatepickerViewManager.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-datepicker-view-manager',\n                    template: \"<!--\\n* Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n* This software is released under MIT license.\\n* The full license information can be found in LICENSE in the root directory of this project.\\n-->\\n\\n<clr-monthpicker *ngIf=\\\"isMonthView\\\"></clr-monthpicker>\\n<clr-yearpicker *ngIf=\\\"isYearView\\\"></clr-yearpicker>\\n<clr-daypicker *ngIf=\\\"isDayView\\\"></clr-daypicker>\\n\",\n                    providers: [ViewManagerService, DatepickerFocusService],\n                    host: { '[class.datepicker]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatepickerViewManager.ctorParameters = function () { return [\n        { type: ElementRef, decorators: [{ type: SkipSelf }] },\n        { type: Injector },\n        { type: ViewManagerService }\n    ]; };\n    return ClrDatepickerViewManager;\n}(AbstractPopover));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDay = /** @class */ (function () {\n    function ClrDay(_dateNavigationService, _ifOpenService, dateFormControlService) {\n        this._dateNavigationService = _dateNavigationService;\n        this._ifOpenService = _ifOpenService;\n        this.dateFormControlService = dateFormControlService;\n    }\n    /**\n     * Updates the focusedDay in the DateNavigationService when the ClrDay is focused.\n     */\n    /**\n     * Updates the focusedDay in the DateNavigationService when the ClrDay is focused.\n     * @return {?}\n     */\n    ClrDay.prototype.onDayViewFocus = /**\n     * Updates the focusedDay in the DateNavigationService when the ClrDay is focused.\n     * @return {?}\n     */\n    function () {\n        this._dateNavigationService.focusedDay = this.dayView.dayModel;\n    };\n    /**\n     * Updates the selectedDay when the ClrDay is selected and closes the datepicker popover.\n     */\n    /**\n     * Updates the selectedDay when the ClrDay is selected and closes the datepicker popover.\n     * @return {?}\n     */\n    ClrDay.prototype.selectDay = /**\n     * Updates the selectedDay when the ClrDay is selected and closes the datepicker popover.\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var day = this.dayView.dayModel;\n        this._dateNavigationService.notifySelectedDayChanged(day);\n        this.dateFormControlService.markAsDirty();\n        this._ifOpenService.open = false;\n    };\n    ClrDay.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-day',\n                    template: \"\\n        <button\\n            class=\\\"day-btn\\\"\\n            type=\\\"button\\\"\\n            [class.is-today]=\\\"dayView.isTodaysDate\\\"\\n            [class.is-disabled]=\\\"dayView.isDisabled\\\"\\n            [class.is-selected]=\\\"dayView.isSelected\\\"\\n            [attr.tabindex]=\\\"dayView.tabIndex\\\"\\n            (click)=\\\"selectDay()\\\"\\n            (focus)=\\\"onDayViewFocus()\\\">\\n            {{dayView.dayModel.date}}\\n        </button>\\n    \",\n                    host: { '[class.day]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDay.ctorParameters = function () { return [\n        { type: DateNavigationService },\n        { type: IfOpenService },\n        { type: DateFormControlService }\n    ]; };\n    ClrDay.propDecorators = {\n        dayView: [{ type: Input, args: ['clrDayView',] }]\n    };\n    return ClrDay;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDaypicker = /** @class */ (function () {\n    function ClrDaypicker(_viewManagerService, _dateNavigationService, _localeHelperService, commonStrings) {\n        this._viewManagerService = _viewManagerService;\n        this._dateNavigationService = _dateNavigationService;\n        this._localeHelperService = _localeHelperService;\n        this.commonStrings = commonStrings;\n    }\n    /**\n     * Calls the ViewManagerService to change to the monthpicker view.\n     */\n    /**\n     * Calls the ViewManagerService to change to the monthpicker view.\n     * @return {?}\n     */\n    ClrDaypicker.prototype.changeToMonthView = /**\n     * Calls the ViewManagerService to change to the monthpicker view.\n     * @return {?}\n     */\n    function () {\n        this._viewManagerService.changeToMonthView();\n    };\n    /**\n     * Calls the ViewManagerService to change to the yearpicker view.\n     */\n    /**\n     * Calls the ViewManagerService to change to the yearpicker view.\n     * @return {?}\n     */\n    ClrDaypicker.prototype.changeToYearView = /**\n     * Calls the ViewManagerService to change to the yearpicker view.\n     * @return {?}\n     */\n    function () {\n        this._viewManagerService.changeToYearView();\n    };\n    Object.defineProperty(ClrDaypicker.prototype, \"calendarMonth\", {\n        /**\n         * Returns the month value of the calendar in the TranslationWidth.Abbreviated format.\n         */\n        get: /**\n         * Returns the month value of the calendar in the TranslationWidth.Abbreviated format.\n         * @return {?}\n         */\n        function () {\n            return this._localeHelperService.localeMonthsAbbreviated[this._dateNavigationService.displayedCalendar.month];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDaypicker.prototype, \"calendarYear\", {\n        /**\n         * Returns the year value of the calendar.\n         */\n        get: /**\n         * Returns the year value of the calendar.\n         * @return {?}\n         */\n        function () {\n            return this._dateNavigationService.displayedCalendar.year;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Calls the DateNavigationService to move to the next month.\n     */\n    /**\n     * Calls the DateNavigationService to move to the next month.\n     * @return {?}\n     */\n    ClrDaypicker.prototype.nextMonth = /**\n     * Calls the DateNavigationService to move to the next month.\n     * @return {?}\n     */\n    function () {\n        this._dateNavigationService.moveToNextMonth();\n    };\n    /**\n     * Calls the DateNavigationService to move to the previous month.\n     */\n    /**\n     * Calls the DateNavigationService to move to the previous month.\n     * @return {?}\n     */\n    ClrDaypicker.prototype.previousMonth = /**\n     * Calls the DateNavigationService to move to the previous month.\n     * @return {?}\n     */\n    function () {\n        this._dateNavigationService.moveToPreviousMonth();\n    };\n    /**\n     * Calls the DateNavigationService to move to the current month.\n     */\n    /**\n     * Calls the DateNavigationService to move to the current month.\n     * @return {?}\n     */\n    ClrDaypicker.prototype.currentMonth = /**\n     * Calls the DateNavigationService to move to the current month.\n     * @return {?}\n     */\n    function () {\n        this._dateNavigationService.moveToCurrentMonth();\n    };\n    ClrDaypicker.decorators = [\n        { type: Component, args: [{ selector: 'clr-daypicker', template: \"<div class=\\\"calendar-header\\\">\\n    <div class=\\\"calendar-pickers\\\">\\n        <button class=\\\"calendar-btn monthpicker-trigger\\\" type=\\\"button\\\" (click)=\\\"changeToMonthView()\\\">\\n            {{calendarMonth}}\\n        </button>\\n        <button class=\\\"calendar-btn yearpicker-trigger\\\" type=\\\"button\\\" (click)=\\\"changeToYearView()\\\">\\n            {{calendarYear}}\\n        </button>\\n    </div>\\n    <div class=\\\"calendar-switchers\\\">\\n        <button class=\\\"calendar-btn switcher\\\" type=\\\"button\\\" (click)=\\\"previousMonth()\\\">\\n            <clr-icon shape=\\\"angle\\\" dir=\\\"left\\\" [attr.title]=\\\"commonStrings.previous\\\"></clr-icon>\\n        </button>\\n        <button class=\\\"calendar-btn switcher\\\" type=\\\"button\\\" (click)=\\\"currentMonth()\\\">\\n            <clr-icon shape=\\\"event\\\" [attr.title]=\\\"commonStrings.current\\\"></clr-icon>\\n        </button>\\n        <button class=\\\"calendar-btn switcher\\\" type=\\\"button\\\" (click)=\\\"nextMonth()\\\">\\n            <clr-icon shape=\\\"angle\\\" dir=\\\"right\\\" [attr.title]=\\\"commonStrings.next\\\"></clr-icon>\\n        </button>\\n    </div>\\n</div>\\n<clr-calendar></clr-calendar>\\n\", host: { '[class.daypicker]': 'true' } }] }\n    ];\n    /** @nocollapse */\n    ClrDaypicker.ctorParameters = function () { return [\n        { type: ViewManagerService },\n        { type: DateNavigationService },\n        { type: LocaleHelperService },\n        { type: ClrCommonStrings }\n    ]; };\n    return ClrDaypicker;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrMonthpicker = /** @class */ (function () {\n    function ClrMonthpicker(_viewManagerService, _localeHelperService, _dateNavigationService, _datepickerFocusService, _elRef) {\n        this._viewManagerService = _viewManagerService;\n        this._localeHelperService = _localeHelperService;\n        this._dateNavigationService = _dateNavigationService;\n        this._datepickerFocusService = _datepickerFocusService;\n        this._elRef = _elRef;\n        this._focusedMonthIndex = this.calendarMonthIndex;\n    }\n    Object.defineProperty(ClrMonthpicker.prototype, \"monthNames\", {\n        /**\n         * Gets the months array which is used to rendered the monthpicker view.\n         * Months are in the TranslationWidth.Wide format.\n         */\n        get: /**\n         * Gets the months array which is used to rendered the monthpicker view.\n         * Months are in the TranslationWidth.Wide format.\n         * @return {?}\n         */\n        function () {\n            return this._localeHelperService.localeMonthsWide;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrMonthpicker.prototype, \"calendarMonthIndex\", {\n        /**\n         * Gets the month value of the Calendar.\n         */\n        get: /**\n         * Gets the month value of the Calendar.\n         * @return {?}\n         */\n        function () {\n            return this._dateNavigationService.displayedCalendar.month;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Calls the DateNavigationService to update the month value of the calendar.\n     * Also changes the view to the daypicker.\n     */\n    /**\n     * Calls the DateNavigationService to update the month value of the calendar.\n     * Also changes the view to the daypicker.\n     * @param {?} monthIndex\n     * @return {?}\n     */\n    ClrMonthpicker.prototype.changeMonth = /**\n     * Calls the DateNavigationService to update the month value of the calendar.\n     * Also changes the view to the daypicker.\n     * @param {?} monthIndex\n     * @return {?}\n     */\n    function (monthIndex) {\n        this._dateNavigationService.changeMonth(monthIndex);\n        this._viewManagerService.changeToDayView();\n    };\n    /**\n     * Compares the month passed to the focused month and returns the tab index.\n     */\n    /**\n     * Compares the month passed to the focused month and returns the tab index.\n     * @param {?} monthIndex\n     * @return {?}\n     */\n    ClrMonthpicker.prototype.getTabIndex = /**\n     * Compares the month passed to the focused month and returns the tab index.\n     * @param {?} monthIndex\n     * @return {?}\n     */\n    function (monthIndex) {\n        return monthIndex === this._focusedMonthIndex ? 0 : -1;\n    };\n    /**\n     * Handles the Keyboard arrow navigation for the monthpicker.\n     */\n    /**\n     * Handles the Keyboard arrow navigation for the monthpicker.\n     * @param {?} event\n     * @return {?}\n     */\n    ClrMonthpicker.prototype.onKeyDown = /**\n     * Handles the Keyboard arrow navigation for the monthpicker.\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        // NOTE: Didn't move this to the date navigation service because\n        // the logic is fairly simple and it didn't make sense for me\n        // to create extra observables just to move this logic to the service.\n        if (event) {\n            /** @type {?} */\n            var keyCode = event.keyCode;\n            if (keyCode === UP_ARROW && this._focusedMonthIndex > 0) {\n                event.preventDefault();\n                this._focusedMonthIndex--;\n                this._datepickerFocusService.focusCell(this._elRef);\n            }\n            else if (keyCode === DOWN_ARROW && this._focusedMonthIndex < 11) {\n                event.preventDefault();\n                this._focusedMonthIndex++;\n                this._datepickerFocusService.focusCell(this._elRef);\n            }\n            else if (keyCode === RIGHT_ARROW && this._focusedMonthIndex < 6) {\n                event.preventDefault();\n                this._focusedMonthIndex = this._focusedMonthIndex + 6;\n                this._datepickerFocusService.focusCell(this._elRef);\n            }\n            else if (keyCode === LEFT_ARROW && this._focusedMonthIndex > 5) {\n                event.preventDefault();\n                this._focusedMonthIndex = this._focusedMonthIndex - 6;\n                this._datepickerFocusService.focusCell(this._elRef);\n            }\n        }\n    };\n    /**\n     * Focuses on the current calendar month when the View is initialized.\n     */\n    /**\n     * Focuses on the current calendar month when the View is initialized.\n     * @return {?}\n     */\n    ClrMonthpicker.prototype.ngAfterViewInit = /**\n     * Focuses on the current calendar month when the View is initialized.\n     * @return {?}\n     */\n    function () {\n        this._datepickerFocusService.focusCell(this._elRef);\n    };\n    ClrMonthpicker.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-monthpicker',\n                    template: \"\\n        <button\\n            type=\\\"button\\\"\\n            class=\\\"calendar-btn month\\\"\\n            *ngFor=\\\"let month of monthNames; let monthIndex = index\\\"\\n            (click)=\\\"changeMonth(monthIndex)\\\"\\n            [class.is-selected]=\\\"monthIndex === calendarMonthIndex\\\"\\n            [attr.tabindex]=\\\"getTabIndex(monthIndex)\\\">\\n            {{month}}\\n        </button>\\n    \",\n                    host: {\n                        '[class.monthpicker]': 'true',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrMonthpicker.ctorParameters = function () { return [\n        { type: ViewManagerService },\n        { type: LocaleHelperService },\n        { type: DateNavigationService },\n        { type: DatepickerFocusService },\n        { type: ElementRef }\n    ]; };\n    ClrMonthpicker.propDecorators = {\n        onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }]\n    };\n    return ClrMonthpicker;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/** @type {?} */\nvar YEARS_TO_DISPLAY = 10;\nvar YearRangeModel = /** @class */ (function () {\n    function YearRangeModel(year) {\n        this.year = year;\n        this.yearRange = [];\n        this.generateYearRange();\n    }\n    Object.defineProperty(YearRangeModel.prototype, \"middleYear\", {\n        /**\n         * Gets the number in the middle of the range.\n         */\n        get: /**\n         * Gets the number in the middle of the range.\n         * @return {?}\n         */\n        function () {\n            return this.yearRange[Math.floor(this.yearRange.length / 2)];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Generates the year range based on the year parameter.\n     * eg: If 2018 is passed the output will be [2010, 2011, ..., 2019]\n     */\n    /**\n     * Generates the year range based on the year parameter.\n     * eg: If 2018 is passed the output will be [2010, 2011, ..., 2019]\n     * @return {?}\n     */\n    YearRangeModel.prototype.generateYearRange = /**\n     * Generates the year range based on the year parameter.\n     * eg: If 2018 is passed the output will be [2010, 2011, ..., 2019]\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var remainder = this.year % YEARS_TO_DISPLAY;\n        /** @type {?} */\n        var floor = this.year - remainder;\n        /** @type {?} */\n        var ceil = floor + YEARS_TO_DISPLAY;\n        this.yearRange = this.generateRange(floor, ceil);\n    };\n    /**\n     * Function which generate a range of numbers from floor to ceil.\n     */\n    /**\n     * Function which generate a range of numbers from floor to ceil.\n     * @param {?} floor\n     * @param {?} ceil\n     * @return {?}\n     */\n    YearRangeModel.prototype.generateRange = /**\n     * Function which generate a range of numbers from floor to ceil.\n     * @param {?} floor\n     * @param {?} ceil\n     * @return {?}\n     */\n    function (floor, ceil) {\n        return Array.from({ length: ceil - floor }, function (v, k) { return k + floor; });\n    };\n    /**\n     * Generates the YearRangeModel for the next decade.\n     */\n    /**\n     * Generates the YearRangeModel for the next decade.\n     * @return {?}\n     */\n    YearRangeModel.prototype.nextDecade = /**\n     * Generates the YearRangeModel for the next decade.\n     * @return {?}\n     */\n    function () {\n        return new YearRangeModel(this.year + 10);\n    };\n    /**\n     * Generates the YearRangeModel for the previous decade.\n     */\n    /**\n     * Generates the YearRangeModel for the previous decade.\n     * @return {?}\n     */\n    YearRangeModel.prototype.previousDecade = /**\n     * Generates the YearRangeModel for the previous decade.\n     * @return {?}\n     */\n    function () {\n        return new YearRangeModel(this.year - 10);\n    };\n    /**\n     * Generates the YearRangeModel for the current decade.\n     */\n    /**\n     * Generates the YearRangeModel for the current decade.\n     * @return {?}\n     */\n    YearRangeModel.prototype.currentDecade = /**\n     * Generates the YearRangeModel for the current decade.\n     * @return {?}\n     */\n    function () {\n        return new YearRangeModel(new Date().getFullYear());\n    };\n    /**\n     * Checks if the value is in the YearRangeModel.\n     */\n    /**\n     * Checks if the value is in the YearRangeModel.\n     * @param {?} value\n     * @return {?}\n     */\n    YearRangeModel.prototype.inRange = /**\n     * Checks if the value is in the YearRangeModel.\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        return this.yearRange.indexOf(value) > -1;\n    };\n    return YearRangeModel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrYearpicker = /** @class */ (function () {\n    function ClrYearpicker(_dateNavigationService, _viewManagerService, _datepickerFocusService, _elRef, commonStrings) {\n        this._dateNavigationService = _dateNavigationService;\n        this._viewManagerService = _viewManagerService;\n        this._datepickerFocusService = _datepickerFocusService;\n        this._elRef = _elRef;\n        this.commonStrings = commonStrings;\n        this.yearRangeModel = new YearRangeModel(this.calendarYear);\n        this._focusedYear = this.calendarYear;\n    }\n    Object.defineProperty(ClrYearpicker.prototype, \"calendarYear\", {\n        /**\n         * Gets the year which the user is currently on.\n         */\n        get: /**\n         * Gets the year which the user is currently on.\n         * @return {?}\n         */\n        function () {\n            return this._dateNavigationService.displayedCalendar.year;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Increments the focus year by the value passed. Updates the YearRangeModel if the\n     * new value is not in the current decade.\n     */\n    /**\n     * Increments the focus year by the value passed. Updates the YearRangeModel if the\n     * new value is not in the current decade.\n     * @param {?} value\n     * @return {?}\n     */\n    ClrYearpicker.prototype.incrementFocusYearBy = /**\n     * Increments the focus year by the value passed. Updates the YearRangeModel if the\n     * new value is not in the current decade.\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        this._focusedYear = this._focusedYear + value;\n        if (!this.yearRangeModel.inRange(this._focusedYear)) {\n            if (value > 0) {\n                this.yearRangeModel = this.yearRangeModel.nextDecade();\n            }\n            else {\n                this.yearRangeModel = this.yearRangeModel.previousDecade();\n            }\n        }\n        this._datepickerFocusService.focusCell(this._elRef);\n    };\n    /**\n     * Calls the DateNavigationService to update the year value of the calendar.\n     * Also changes the view to the daypicker.\n     */\n    /**\n     * Calls the DateNavigationService to update the year value of the calendar.\n     * Also changes the view to the daypicker.\n     * @param {?} year\n     * @return {?}\n     */\n    ClrYearpicker.prototype.changeYear = /**\n     * Calls the DateNavigationService to update the year value of the calendar.\n     * Also changes the view to the daypicker.\n     * @param {?} year\n     * @return {?}\n     */\n    function (year) {\n        this._dateNavigationService.changeYear(year);\n        this._viewManagerService.changeToDayView();\n    };\n    /**\n     * Updates the YearRangeModel to the previous decade.\n     */\n    /**\n     * Updates the YearRangeModel to the previous decade.\n     * @return {?}\n     */\n    ClrYearpicker.prototype.previousDecade = /**\n     * Updates the YearRangeModel to the previous decade.\n     * @return {?}\n     */\n    function () {\n        this.yearRangeModel = this.yearRangeModel.previousDecade();\n        // Year in the yearpicker is not focused because while navigating to a different decade,\n        // you want the focus to remain on the decade switcher arrows.\n    };\n    /**\n     * Updates the YearRangeModel to the current decade.\n     */\n    /**\n     * Updates the YearRangeModel to the current decade.\n     * @return {?}\n     */\n    ClrYearpicker.prototype.currentDecade = /**\n     * Updates the YearRangeModel to the current decade.\n     * @return {?}\n     */\n    function () {\n        if (!this.yearRangeModel.inRange(this._dateNavigationService.today.year)) {\n            this.yearRangeModel = this.yearRangeModel.currentDecade();\n        }\n        this._datepickerFocusService.focusCell(this._elRef);\n    };\n    /**\n     * Updates the YearRangeModel to the next decade.\n     */\n    /**\n     * Updates the YearRangeModel to the next decade.\n     * @return {?}\n     */\n    ClrYearpicker.prototype.nextDecade = /**\n     * Updates the YearRangeModel to the next decade.\n     * @return {?}\n     */\n    function () {\n        this.yearRangeModel = this.yearRangeModel.nextDecade();\n        // Year in the yearpicker is not focused because while navigating to a different decade,\n        // you want the focus to remain on the decade switcher arrows.\n    };\n    /**\n     * Compares the year passed to the focused year and returns the tab index.\n     */\n    /**\n     * Compares the year passed to the focused year and returns the tab index.\n     * @param {?} year\n     * @return {?}\n     */\n    ClrYearpicker.prototype.getTabIndex = /**\n     * Compares the year passed to the focused year and returns the tab index.\n     * @param {?} year\n     * @return {?}\n     */\n    function (year) {\n        if (!this.yearRangeModel.inRange(this._focusedYear)) {\n            if (this.yearRangeModel.inRange(this.calendarYear)) {\n                this._focusedYear = this.calendarYear;\n            }\n            else {\n                this._focusedYear = this.yearRangeModel.middleYear;\n            }\n        }\n        return this._focusedYear === year ? 0 : -1;\n    };\n    /**\n     * Handles the Keyboard arrow navigation for the yearpicker.\n     */\n    /**\n     * Handles the Keyboard arrow navigation for the yearpicker.\n     * @param {?} event\n     * @return {?}\n     */\n    ClrYearpicker.prototype.onKeyDown = /**\n     * Handles the Keyboard arrow navigation for the yearpicker.\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        // NOTE: Didn't move this to the date navigation service because\n        // the logic is fairly simple and it didn't make sense for me\n        // to create extra observables just to move this logic to the service.\n        if (event) {\n            /** @type {?} */\n            var keyCode = event.keyCode;\n            if (keyCode === UP_ARROW) {\n                event.preventDefault();\n                this.incrementFocusYearBy(-1);\n            }\n            else if (keyCode === DOWN_ARROW) {\n                event.preventDefault();\n                this.incrementFocusYearBy(1);\n            }\n            else if (keyCode === RIGHT_ARROW) {\n                event.preventDefault();\n                this.incrementFocusYearBy(5);\n            }\n            else if (keyCode === LEFT_ARROW) {\n                event.preventDefault();\n                this.incrementFocusYearBy(-5);\n            }\n        }\n    };\n    /**\n     * Focuses on the current calendar year when the View is initialized.\n     */\n    /**\n     * Focuses on the current calendar year when the View is initialized.\n     * @return {?}\n     */\n    ClrYearpicker.prototype.ngAfterViewInit = /**\n     * Focuses on the current calendar year when the View is initialized.\n     * @return {?}\n     */\n    function () {\n        this._datepickerFocusService.focusCell(this._elRef);\n    };\n    ClrYearpicker.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-yearpicker',\n                    template: \"\\n        <div class=\\\"year-switchers\\\">\\n            <button class=\\\"calendar-btn switcher\\\" type=\\\"button\\\" (click)=\\\"previousDecade()\\\">\\n                <clr-icon shape=\\\"angle\\\" dir=\\\"left\\\" [attr.title]=\\\"commonStrings.previous\\\"></clr-icon>\\n            </button>\\n            <button class=\\\"calendar-btn switcher\\\" type=\\\"button\\\" (click)=\\\"currentDecade()\\\">\\n                <clr-icon shape=\\\"event\\\" [attr.title]=\\\"commonStrings.current\\\"></clr-icon>\\n            </button>\\n            <button class=\\\"calendar-btn switcher\\\" type=\\\"button\\\" (click)=\\\"nextDecade()\\\">\\n                <clr-icon shape=\\\"angle\\\" dir=\\\"right\\\" [attr.title]=\\\"commonStrings.next\\\"></clr-icon>\\n            </button>\\n        </div>\\n        <div class=\\\"years\\\">\\n            <button\\n                *ngFor=\\\"let year of yearRangeModel.yearRange\\\"\\n                type=\\\"button\\\"\\n                class=\\\"calendar-btn year\\\"\\n                [attr.tabindex]=\\\"getTabIndex(year)\\\"\\n                [class.is-selected]=\\\"year === calendarYear\\\"\\n                (click)=\\\"changeYear(year)\\\">\\n                {{year}}\\n            </button>\\n        </div>\\n    \",\n                    host: {\n                        '[class.yearpicker]': 'true',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrYearpicker.ctorParameters = function () { return [\n        { type: DateNavigationService },\n        { type: ViewManagerService },\n        { type: DatepickerFocusService },\n        { type: ElementRef },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrYearpicker.propDecorators = {\n        onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }]\n    };\n    return ClrYearpicker;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_DATEPICKER_DIRECTIVES = [\n    ClrDay,\n    ClrDateContainer,\n    ClrDateInput,\n    ClrDatepickerViewManager,\n    ClrMonthpicker,\n    ClrYearpicker,\n    ClrDaypicker,\n    ClrCalendar,\n];\nvar ClrDatepickerModule = /** @class */ (function () {\n    function ClrDatepickerModule() {\n    }\n    ClrDatepickerModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [\n                        CommonModule,\n                        ClrHostWrappingModule,\n                        ClrConditionalModule,\n                        ClrIconModule,\n                        ClrFocusTrapModule,\n                        ClrCommonFormsModule,\n                    ],\n                    declarations: [CLR_DATEPICKER_DIRECTIVES],\n                    exports: [CLR_DATEPICKER_DIRECTIVES],\n                    entryComponents: [ClrDateContainer],\n                },] }\n    ];\n    return ClrDatepickerModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrInputContainer = /** @class */ (function () {\n    function ClrInputContainer(ifErrorService, layoutService, controlClassService, ngControlService) {\n        var _this = this;\n        this.ifErrorService = ifErrorService;\n        this.layoutService = layoutService;\n        this.controlClassService = controlClassService;\n        this.ngControlService = ngControlService;\n        this.subscriptions = [];\n        this.invalid = false;\n        this._dynamic = false;\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            _this.invalid = invalid;\n        }));\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.control = control;\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrInputContainer.prototype.controlClass = /**\n     * @return {?}\n     */\n    function () {\n        return this.controlClassService.controlClass(this.invalid, this.addGrid());\n    };\n    /**\n     * @return {?}\n     */\n    ClrInputContainer.prototype.addGrid = /**\n     * @return {?}\n     */\n    function () {\n        if (this.layoutService && !this.layoutService.isVertical()) {\n            return true;\n        }\n        return false;\n    };\n    /**\n     * @return {?}\n     */\n    ClrInputContainer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.subscriptions) {\n            this.subscriptions.map(function (sub) { return sub.unsubscribe(); });\n        }\n    };\n    ClrInputContainer.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-input-container',\n                    template: \"\\n        <ng-content select=\\\"label\\\"></ng-content>\\n        <label *ngIf=\\\"!label && addGrid()\\\"></label>\\n        <div class=\\\"clr-control-container\\\" [ngClass]=\\\"controlClass()\\\">\\n            <div class=\\\"clr-input-wrapper\\\">\\n                <ng-content select=\\\"[clrInput]\\\"></ng-content>\\n                <clr-icon *ngIf=\\\"invalid\\\" class=\\\"clr-validate-icon\\\" shape=\\\"exclamation-circle\\\" aria-hidden=\\\"true\\\"></clr-icon>\\n            </div>\\n            <ng-content select=\\\"clr-control-helper\\\" *ngIf=\\\"!invalid\\\"></ng-content>\\n            <ng-content select=\\\"clr-control-error\\\" *ngIf=\\\"invalid\\\"></ng-content>\\n        </div>\\n    \",\n                    host: {\n                        '[class.clr-form-control]': 'true',\n                        '[class.clr-form-control-disabled]': 'control?.disabled',\n                        '[class.clr-row]': 'addGrid()',\n                    },\n                    providers: [IfErrorService, NgControlService, ControlIdService, ControlClassService]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrInputContainer.ctorParameters = function () { return [\n        { type: IfErrorService },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: ControlClassService },\n        { type: NgControlService }\n    ]; };\n    ClrInputContainer.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }]\n    };\n    return ClrInputContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrInput = /** @class */ (function (_super) {\n    __extends(ClrInput, _super);\n    function ClrInput(vcr, injector, control, renderer, el) {\n        var _this = _super.call(this, vcr, ClrInputContainer, injector, control, renderer, el) || this;\n        _this.index = 1;\n        return _this;\n    }\n    ClrInput.decorators = [\n        { type: Directive, args: [{ selector: '[clrInput]', host: { '[class.clr-input]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrInput.ctorParameters = function () { return [\n        { type: ViewContainerRef },\n        { type: Injector },\n        { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },\n        { type: Renderer2 },\n        { type: ElementRef }\n    ]; };\n    return ClrInput;\n}(WrappedFormControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrInputModule = /** @class */ (function () {\n    function ClrInputModule() {\n    }\n    ClrInputModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule],\n                    declarations: [ClrInput, ClrInputContainer],\n                    exports: [ClrCommonFormsModule, ClrInput, ClrInputContainer],\n                    entryComponents: [ClrInputContainer],\n                },] }\n    ];\n    return ClrInputModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/* tslint:disable-next-line:variable-name */\n/** @type {?} */\nvar ToggleService = new InjectionToken(undefined);\n/* tslint:disable-next-line:variable-name */\n/**\n * @return {?}\n */\nfunction ToggleServiceProvider() {\n    return new BehaviorSubject(false);\n}\nvar ClrPasswordContainer = /** @class */ (function () {\n    function ClrPasswordContainer(ifErrorService, layoutService, controlClassService, focusService, ngControlService, toggleService, commonStrings) {\n        var _this = this;\n        this.ifErrorService = ifErrorService;\n        this.layoutService = layoutService;\n        this.controlClassService = controlClassService;\n        this.focusService = focusService;\n        this.ngControlService = ngControlService;\n        this.toggleService = toggleService;\n        this.commonStrings = commonStrings;\n        this.subscriptions = [];\n        this.invalid = false;\n        this._dynamic = false;\n        this.show = false;\n        this.focus = false;\n        this._toggle = true;\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            _this.invalid = invalid;\n        }));\n        this.subscriptions.push(this.focusService.focusChange.subscribe(function (state$$1) {\n            _this.focus = state$$1;\n        }));\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.control = control;\n        }));\n    }\n    Object.defineProperty(ClrPasswordContainer.prototype, \"clrToggle\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._toggle;\n        },\n        set: /**\n         * @param {?} state\n         * @return {?}\n         */\n        function (state$$1) {\n            this._toggle = state$$1;\n            if (!state$$1) {\n                this.show = false;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrPasswordContainer.prototype.toggle = /**\n     * @return {?}\n     */\n    function () {\n        this.show = !this.show;\n        this.toggleService.next(this.show);\n    };\n    /**\n     * @return {?}\n     */\n    ClrPasswordContainer.prototype.controlClass = /**\n     * @return {?}\n     */\n    function () {\n        return this.controlClassService.controlClass(this.invalid, this.addGrid());\n    };\n    /**\n     * @return {?}\n     */\n    ClrPasswordContainer.prototype.addGrid = /**\n     * @return {?}\n     */\n    function () {\n        if (this.layoutService && !this.layoutService.isVertical()) {\n            return true;\n        }\n        return false;\n    };\n    /**\n     * @return {?}\n     */\n    ClrPasswordContainer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.subscriptions) {\n            this.subscriptions.map(function (sub) { return sub.unsubscribe(); });\n        }\n    };\n    ClrPasswordContainer.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-password-container',\n                    template: \"\\n    <ng-content select=\\\"label\\\"></ng-content>\\n    <label *ngIf=\\\"!label && addGrid()\\\"></label>\\n    <div class=\\\"clr-control-container\\\" [ngClass]=\\\"controlClass()\\\">\\n      <div class=\\\"clr-input-wrapper\\\">\\n        <div class=\\\"clr-input-group\\\" [class.clr-focus]=\\\"focus\\\">\\n          <ng-content select=\\\"[clrPassword]\\\"></ng-content>\\n          <clr-icon *ngIf=\\\"!show && clrToggle\\\"\\n            shape=\\\"eye\\\" \\n            class=\\\"clr-input-group-icon-action\\\"\\n            [attr.title]=\\\"commonStrings.show\\\"\\n            (click)=\\\"toggle()\\\"></clr-icon>\\n          <clr-icon *ngIf=\\\"show && clrToggle\\\" \\n            shape=\\\"eye-hide\\\"\\n            class=\\\"clr-input-group-icon-action\\\"\\n            [attr.title]=\\\"commonStrings.hide\\\"\\n            (click)=\\\"toggle()\\\"></clr-icon>\\n        </div>\\n        <clr-icon *ngIf=\\\"invalid\\\" class=\\\"clr-validate-icon\\\" shape=\\\"exclamation-circle\\\" aria-hidden=\\\"true\\\"></clr-icon>\\n      </div>\\n      <ng-content select=\\\"clr-control-helper\\\" *ngIf=\\\"!invalid\\\"></ng-content>\\n      <ng-content select=\\\"clr-control-error\\\" *ngIf=\\\"invalid\\\"></ng-content>\\n    </div>\\n    \",\n                    host: {\n                        '[class.clr-form-control]': 'true',\n                        '[class.clr-form-control-disabled]': 'control?.disabled',\n                        '[class.clr-row]': 'addGrid()',\n                    },\n                    providers: [\n                        IfErrorService,\n                        NgControlService,\n                        ControlIdService,\n                        ControlClassService,\n                        FocusService,\n                        { provide: ToggleService, useFactory: ToggleServiceProvider },\n                    ]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrPasswordContainer.ctorParameters = function () { return [\n        { type: IfErrorService },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: ControlClassService },\n        { type: FocusService },\n        { type: NgControlService },\n        { type: BehaviorSubject, decorators: [{ type: Inject, args: [ToggleService,] }] },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrPasswordContainer.propDecorators = {\n        clrToggle: [{ type: Input, args: ['clrToggle',] }],\n        label: [{ type: ContentChild, args: [ClrLabel,] }]\n    };\n    return ClrPasswordContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrPassword = /** @class */ (function (_super) {\n    __extends(ClrPassword, _super);\n    function ClrPassword(vcr, injector, control, renderer, el, focusService, toggleService) {\n        var _this = _super.call(this, vcr, ClrPasswordContainer, injector, control, renderer, el) || this;\n        _this.focusService = focusService;\n        _this.toggleService = toggleService;\n        _this.index = 1;\n        if (!_this.focusService) {\n            throw new Error('clrPassword requires being wrapped in <clr-password-container>');\n        }\n        _this.subscriptions.push(_this.toggleService.subscribe(function (toggle) {\n            renderer.setProperty(el.nativeElement, 'type', toggle ? 'text' : 'password');\n        }));\n        return _this;\n    }\n    /**\n     * @return {?}\n     */\n    ClrPassword.prototype.triggerFocus = /**\n     * @return {?}\n     */\n    function () {\n        if (this.focusService) {\n            this.focusService.focused = true;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrPassword.prototype.triggerValidation = /**\n     * @return {?}\n     */\n    function () {\n        _super.prototype.triggerValidation.call(this);\n        if (this.focusService) {\n            this.focusService.focused = false;\n        }\n    };\n    ClrPassword.decorators = [\n        { type: Directive, args: [{ selector: '[clrPassword]', host: { '[class.clr-input]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrPassword.ctorParameters = function () { return [\n        { type: ViewContainerRef },\n        { type: Injector },\n        { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },\n        { type: Renderer2 },\n        { type: ElementRef },\n        { type: FocusService, decorators: [{ type: Optional }] },\n        { type: BehaviorSubject, decorators: [{ type: Optional }, { type: Inject, args: [ToggleService,] }] }\n    ]; };\n    ClrPassword.propDecorators = {\n        triggerFocus: [{ type: HostListener, args: ['focus',] }],\n        triggerValidation: [{ type: HostListener, args: ['blur',] }]\n    };\n    return ClrPassword;\n}(WrappedFormControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrPasswordModule = /** @class */ (function () {\n    function ClrPasswordModule() {\n    }\n    ClrPasswordModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule],\n                    declarations: [ClrPassword, ClrPasswordContainer],\n                    exports: [ClrCommonFormsModule, ClrPassword, ClrPasswordContainer],\n                    entryComponents: [ClrPasswordContainer],\n                },] }\n    ];\n    return ClrPasswordModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrRadioWrapper = /** @class */ (function () {\n    function ClrRadioWrapper() {\n        // We need both _dynamic for HostWrapper and ContentChild(ClrLabel) in cases where\n        // the user puts a radio inside a wrapper without a label, host wrapping doesn't apply\n        // but we'd still need to insert a label\n        this._dynamic = false;\n    }\n    ClrRadioWrapper.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-radio-wrapper',\n                    template: \"\\n    <ng-content select=\\\"[clrRadio]\\\"></ng-content>\\n    <ng-content select=\\\"label\\\"></ng-content>\\n    <label *ngIf=\\\"!label\\\"></label>\\n  \",\n                    host: {\n                        '[class.clr-radio-wrapper]': 'true',\n                    },\n                    providers: [ControlIdService]\n                }] }\n    ];\n    ClrRadioWrapper.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }]\n    };\n    return ClrRadioWrapper;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrRadio = /** @class */ (function (_super) {\n    __extends(ClrRadio, _super);\n    function ClrRadio(vcr, injector, control, renderer, el) {\n        return _super.call(this, vcr, ClrRadioWrapper, injector, control, renderer, el) || this;\n    }\n    ClrRadio.decorators = [\n        { type: Directive, args: [{ selector: '[clrRadio]' },] }\n    ];\n    /** @nocollapse */\n    ClrRadio.ctorParameters = function () { return [\n        { type: ViewContainerRef },\n        { type: Injector },\n        { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },\n        { type: Renderer2 },\n        { type: ElementRef }\n    ]; };\n    return ClrRadio;\n}(WrappedFormControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrRadioContainer = /** @class */ (function () {\n    function ClrRadioContainer(ifErrorService, layoutService, controlClassService, ngControlService) {\n        var _this = this;\n        this.ifErrorService = ifErrorService;\n        this.layoutService = layoutService;\n        this.controlClassService = controlClassService;\n        this.ngControlService = ngControlService;\n        this.subscriptions = [];\n        this.invalid = false;\n        this.inline = false;\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            _this.invalid = invalid;\n        }));\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.control = control;\n        }));\n    }\n    Object.defineProperty(ClrRadioContainer.prototype, \"clrInline\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.inline;\n        },\n        /*\n         * Here we want to support the following cases\n         * clrInline - true by presence\n         * clrInline=\"true|false\" - unless it is explicitly false, strings are considered true\n         * [clrInline]=\"true|false\" - expect a boolean\n         */\n        set: /*\n           * Here we want to support the following cases\n           * clrInline - true by presence\n           * clrInline=\"true|false\" - unless it is explicitly false, strings are considered true\n           * [clrInline]=\"true|false\" - expect a boolean\n           */\n        /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (typeof value === 'string') {\n                this.inline = value === 'false' ? false : true;\n            }\n            else {\n                this.inline = !!value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrRadioContainer.prototype.controlClass = /**\n     * @return {?}\n     */\n    function () {\n        return this.controlClassService.controlClass(this.invalid, this.addGrid(), this.inline ? 'clr-control-inline' : '');\n    };\n    /**\n     * @return {?}\n     */\n    ClrRadioContainer.prototype.addGrid = /**\n     * @return {?}\n     */\n    function () {\n        if (this.layoutService && !this.layoutService.isVertical()) {\n            return true;\n        }\n        return false;\n    };\n    /**\n     * @return {?}\n     */\n    ClrRadioContainer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.map(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrRadioContainer.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-radio-container',\n                    template: \"\\n    <ng-content select=\\\"label\\\"></ng-content>\\n    <label *ngIf=\\\"!label && addGrid()\\\"></label>\\n    <div class=\\\"clr-control-container\\\" [class.clr-control-inline]=\\\"clrInline\\\" [ngClass]=\\\"controlClass()\\\">\\n      <ng-content select=\\\"clr-radio-wrapper\\\"></ng-content>\\n      <div class=\\\"clr-subtext-wrapper\\\">\\n        <ng-content select=\\\"clr-control-helper\\\" *ngIf=\\\"!invalid\\\"></ng-content>\\n        <clr-icon *ngIf=\\\"invalid\\\" class=\\\"clr-validate-icon\\\" shape=\\\"exclamation-circle\\\" aria-hidden=\\\"true\\\"></clr-icon>\\n        <ng-content select=\\\"clr-control-error\\\" *ngIf=\\\"invalid\\\"></ng-content>\\n      </div>\\n    </div>\\n    \",\n                    host: {\n                        '[class.clr-form-control]': 'true',\n                        '[class.clr-form-control-disabled]': 'control?.disabled',\n                        '[class.clr-row]': 'addGrid()',\n                    },\n                    providers: [NgControlService, ControlClassService, IfErrorService]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrRadioContainer.ctorParameters = function () { return [\n        { type: IfErrorService },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: ControlClassService },\n        { type: NgControlService }\n    ]; };\n    ClrRadioContainer.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }],\n        clrInline: [{ type: Input }]\n    };\n    return ClrRadioContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrRadioModule = /** @class */ (function () {\n    function ClrRadioModule() {\n    }\n    ClrRadioModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrCommonFormsModule, ClrHostWrappingModule, ClrIconModule],\n                    declarations: [ClrRadio, ClrRadioContainer, ClrRadioWrapper],\n                    exports: [ClrCommonFormsModule, ClrRadio, ClrRadioContainer, ClrRadioWrapper],\n                    entryComponents: [ClrRadioWrapper],\n                },] }\n    ];\n    return ClrRadioModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrSelectContainer = /** @class */ (function () {\n    function ClrSelectContainer(ifErrorService, layoutService, controlClassService, ngControlService) {\n        var _this = this;\n        this.ifErrorService = ifErrorService;\n        this.layoutService = layoutService;\n        this.controlClassService = controlClassService;\n        this.ngControlService = ngControlService;\n        this.subscriptions = [];\n        this.invalid = false;\n        this._dynamic = false;\n        this.multi = false;\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            _this.invalid = invalid;\n        }));\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.multi = control.valueAccessor instanceof SelectMultipleControlValueAccessor;\n            _this.control = control;\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrSelectContainer.prototype.wrapperClass = /**\n     * @return {?}\n     */\n    function () {\n        return this.multi ? 'clr-multiselect-wrapper' : 'clr-select-wrapper';\n    };\n    /**\n     * @return {?}\n     */\n    ClrSelectContainer.prototype.controlClass = /**\n     * @return {?}\n     */\n    function () {\n        return this.controlClassService.controlClass(this.invalid, this.addGrid());\n    };\n    /**\n     * @return {?}\n     */\n    ClrSelectContainer.prototype.addGrid = /**\n     * @return {?}\n     */\n    function () {\n        if (this.layoutService && !this.layoutService.isVertical()) {\n            return true;\n        }\n        return false;\n    };\n    /**\n     * @return {?}\n     */\n    ClrSelectContainer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.subscriptions) {\n            this.subscriptions.map(function (sub) { return sub.unsubscribe(); });\n        }\n    };\n    ClrSelectContainer.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-select-container',\n                    template: \"    \\n        <ng-content select=\\\"label\\\"></ng-content>\\n        <label *ngIf=\\\"!label && addGrid()\\\"></label>\\n        <div class=\\\"clr-control-container\\\" [ngClass]=\\\"controlClass()\\\">\\n            <div [ngClass]=\\\"wrapperClass()\\\">\\n                <ng-content select=\\\"[clrSelect]\\\"></ng-content>\\n                <clr-icon *ngIf=\\\"invalid\\\" class=\\\"clr-validate-icon\\\" shape=\\\"exclamation-circle\\\" aria-hidden=\\\"true\\\"></clr-icon>\\n            </div>\\n            <ng-content select=\\\"clr-control-helper\\\" *ngIf=\\\"!invalid\\\"></ng-content>\\n            <ng-content select=\\\"clr-control-error\\\" *ngIf=\\\"invalid\\\"></ng-content>\\n        </div>\\n    \",\n                    host: {\n                        '[class.clr-form-control]': 'true',\n                        '[class.clr-form-control-disabled]': 'control?.disabled',\n                        '[class.clr-row]': 'addGrid()',\n                    },\n                    providers: [IfErrorService, NgControlService, ControlIdService, ControlClassService]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrSelectContainer.ctorParameters = function () { return [\n        { type: IfErrorService },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: ControlClassService },\n        { type: NgControlService }\n    ]; };\n    ClrSelectContainer.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }],\n        multiple: [{ type: ContentChild, args: [SelectMultipleControlValueAccessor,] }]\n    };\n    return ClrSelectContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrSelect = /** @class */ (function (_super) {\n    __extends(ClrSelect, _super);\n    function ClrSelect(vcr, injector, control, renderer, el) {\n        var _this = _super.call(this, vcr, ClrSelectContainer, injector, control, renderer, el) || this;\n        _this.index = 1;\n        return _this;\n    }\n    ClrSelect.decorators = [\n        { type: Directive, args: [{ selector: '[clrSelect]', host: { '[class.clr-select]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrSelect.ctorParameters = function () { return [\n        { type: ViewContainerRef },\n        { type: Injector },\n        { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },\n        { type: Renderer2 },\n        { type: ElementRef }\n    ]; };\n    return ClrSelect;\n}(WrappedFormControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrSelectModule = /** @class */ (function () {\n    function ClrSelectModule() {\n    }\n    ClrSelectModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule],\n                    declarations: [ClrSelect, ClrSelectContainer],\n                    exports: [ClrCommonFormsModule, ClrSelect, ClrSelectContainer],\n                    entryComponents: [ClrSelectContainer],\n                },] }\n    ];\n    return ClrSelectModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTextareaContainer = /** @class */ (function () {\n    function ClrTextareaContainer(ifErrorService, layoutService, controlClassService, ngControlService) {\n        var _this = this;\n        this.ifErrorService = ifErrorService;\n        this.layoutService = layoutService;\n        this.controlClassService = controlClassService;\n        this.ngControlService = ngControlService;\n        this.subscriptions = [];\n        this.invalid = false;\n        this._dynamic = false;\n        this.subscriptions.push(this.ifErrorService.statusChanges.subscribe(function (invalid) {\n            _this.invalid = invalid;\n        }));\n        this.subscriptions.push(this.ngControlService.controlChanges.subscribe(function (control) {\n            _this.control = control;\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrTextareaContainer.prototype.controlClass = /**\n     * @return {?}\n     */\n    function () {\n        return this.controlClassService.controlClass(this.invalid, this.addGrid());\n    };\n    /**\n     * @return {?}\n     */\n    ClrTextareaContainer.prototype.addGrid = /**\n     * @return {?}\n     */\n    function () {\n        if (this.layoutService && !this.layoutService.isVertical()) {\n            return true;\n        }\n        return false;\n    };\n    /**\n     * @return {?}\n     */\n    ClrTextareaContainer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.subscriptions) {\n            this.subscriptions.map(function (sub) { return sub.unsubscribe(); });\n        }\n    };\n    ClrTextareaContainer.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-textarea-container',\n                    template: \"\\n        <ng-content select=\\\"label\\\"></ng-content>\\n        <label *ngIf=\\\"!label && addGrid()\\\"></label>\\n        <div class=\\\"clr-control-container\\\" [ngClass]=\\\"controlClass()\\\">\\n            <div class=\\\"clr-textarea-wrapper\\\">\\n                <ng-content select=\\\"[clrTextarea]\\\"></ng-content>\\n                <clr-icon *ngIf=\\\"invalid\\\" class=\\\"clr-validate-icon\\\" shape=\\\"exclamation-circle\\\" aria-hidden=\\\"true\\\"></clr-icon>\\n            </div>\\n            <ng-content select=\\\"clr-control-helper\\\" *ngIf=\\\"!invalid\\\"></ng-content>\\n            <ng-content select=\\\"clr-control-error\\\" *ngIf=\\\"invalid\\\"></ng-content>\\n        </div>\\n    \",\n                    host: {\n                        '[class.clr-form-control]': 'true',\n                        '[class.clr-form-control-disabled]': 'control?.disabled',\n                        '[class.clr-row]': 'addGrid()',\n                    },\n                    providers: [IfErrorService, NgControlService, ControlIdService, ControlClassService]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTextareaContainer.ctorParameters = function () { return [\n        { type: IfErrorService },\n        { type: LayoutService, decorators: [{ type: Optional }] },\n        { type: ControlClassService },\n        { type: NgControlService }\n    ]; };\n    ClrTextareaContainer.propDecorators = {\n        label: [{ type: ContentChild, args: [ClrLabel,] }]\n    };\n    return ClrTextareaContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTextarea = /** @class */ (function (_super) {\n    __extends(ClrTextarea, _super);\n    function ClrTextarea(vcr, injector, control, renderer, el) {\n        var _this = _super.call(this, vcr, ClrTextareaContainer, injector, control, renderer, el) || this;\n        _this.index = 1;\n        return _this;\n    }\n    ClrTextarea.decorators = [\n        { type: Directive, args: [{ selector: '[clrTextarea]', host: { '[class.clr-textarea]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrTextarea.ctorParameters = function () { return [\n        { type: ViewContainerRef },\n        { type: Injector },\n        { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },\n        { type: Renderer2 },\n        { type: ElementRef }\n    ]; };\n    return ClrTextarea;\n}(WrappedFormControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTextareaModule = /** @class */ (function () {\n    function ClrTextareaModule() {\n    }\n    ClrTextareaModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule],\n                    declarations: [ClrTextarea, ClrTextareaContainer],\n                    exports: [ClrCommonFormsModule, ClrTextarea, ClrTextareaContainer],\n                    entryComponents: [ClrTextareaContainer],\n                },] }\n    ];\n    return ClrTextareaModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrFormsModule = /** @class */ (function () {\n    function ClrFormsModule() {\n    }\n    ClrFormsModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule],\n                    exports: [\n                        ClrCommonFormsModule,\n                        ClrCheckboxModule,\n                        ClrDatepickerModule,\n                        ClrInputModule,\n                        ClrPasswordModule,\n                        ClrRadioModule,\n                        ClrSelectModule,\n                        ClrTextareaModule,\n                    ],\n                },] }\n    ];\n    return ClrFormsModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar Expand = /** @class */ (function () {\n    function Expand() {\n        this.expandable = 0;\n        // private _replace: boolean = false;\n        this._replace = new BehaviorSubject(false);\n        this._loading = false;\n        this._expanded = false;\n        // TODO: Move this to the datagrid RowExpand.\n        // I spent some time doing this but ran into a couple of issues\n        // Will take care of this later.\n        this._animate = new Subject();\n        this._expandChange = new Subject();\n    }\n    Object.defineProperty(Expand.prototype, \"replace\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._replace.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} replaceValue\n     * @return {?}\n     */\n    Expand.prototype.setReplace = /**\n     * @param {?} replaceValue\n     * @return {?}\n     */\n    function (replaceValue) {\n        this._replace.next(replaceValue);\n    };\n    Object.defineProperty(Expand.prototype, \"loading\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._loading;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            value = !!value;\n            if (value !== this._loading) {\n                this._loading = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Expand.prototype, \"expanded\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._expanded;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            value = !!value;\n            if (value !== this._expanded) {\n                this._expanded = value;\n                this._animate.next();\n                this._expandChange.next(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    Expand.prototype.toggle = /**\n     * @return {?}\n     */\n    function () {\n        this.expanded = !this._expanded;\n    };\n    Object.defineProperty(Expand.prototype, \"animate\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._animate.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Expand.prototype, \"expandChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._expandChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} state\n     * @return {?}\n     */\n    Expand.prototype.loadingStateChange = /**\n     * @param {?} state\n     * @return {?}\n     */\n    function (state$$1) {\n        switch (state$$1) {\n            case ClrLoadingState.LOADING:\n                this.loading = true;\n                break;\n            default:\n                this.loading = false;\n                this._animate.next();\n                break;\n        }\n    };\n    Expand.decorators = [\n        { type: Injectable }\n    ];\n    return Expand;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * TODO: make this a reusable directive outside of Datagrid, like [clrLoading].\n */\nvar ClrIfExpanded = /** @class */ (function () {\n    function ClrIfExpanded(template, container, el, renderer, expand) {\n        var _this = this;\n        this.template = template;\n        this.container = container;\n        this.el = el;\n        this.renderer = renderer;\n        this.expand = expand;\n        this._expanded = false;\n        this.expandedChange = new EventEmitter(true);\n        /**\n         * Subscriptions to all the services and queries changes\n         */\n        this._subscriptions = [];\n        expand.expandable++;\n        this._subscriptions.push(expand.expandChange.subscribe(function () {\n            _this.updateView();\n            _this.expandedChange.emit(_this.expand.expanded);\n        }));\n    }\n    Object.defineProperty(ClrIfExpanded.prototype, \"expanded\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._expanded;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (typeof value === 'boolean') {\n                this.expand.expanded = value;\n                this._expanded = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrIfExpanded.prototype.updateView = /**\n     * @return {?}\n     */\n    function () {\n        if (this.expand.expanded && this.container.length !== 0) {\n            return;\n        }\n        if (this.template) {\n            if (this.expand.expanded) {\n                // Should we pass a context? I don't see anything useful to pass right now,\n                // but we can come back to it in the future as a solution for additional features.\n                this.container.createEmbeddedView(this.template);\n            }\n            else {\n                // TODO: Move when we move the animation logic to Datagrid Row Expand\n                // We clear before the animation is over. Not ideal, but doing better would involve a much heavier\n                // process for very little gain. Once Angular animations are dynamic enough, we should be able to\n                // get the optimal behavior.\n                this.container.clear();\n            }\n        }\n        else {\n            try {\n                // If we don't have a template ref, we fallback to a crude display: none for now.\n                if (this.expand.expanded) {\n                    this.renderer.setStyle(this.el.nativeElement, 'display', null);\n                }\n                else {\n                    this.renderer.setStyle(this.el.nativeElement, 'display', 'none');\n                }\n            }\n            catch (e) {\n                // We catch the case where clrIfExpanded was put on a non-DOM element, and we just do nothing\n            }\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrIfExpanded.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        this.updateView();\n    };\n    /**\n     * @return {?}\n     */\n    ClrIfExpanded.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.expand.expandable--;\n        this._subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrIfExpanded.decorators = [\n        { type: Directive, args: [{ selector: '[clrIfExpanded]' },] }\n    ];\n    /** @nocollapse */\n    ClrIfExpanded.ctorParameters = function () { return [\n        { type: TemplateRef, decorators: [{ type: Optional }] },\n        { type: ViewContainerRef },\n        { type: ElementRef },\n        { type: Renderer2 },\n        { type: Expand }\n    ]; };\n    ClrIfExpanded.propDecorators = {\n        expanded: [{ type: Input, args: ['clrIfExpanded',] }],\n        expandedChange: [{ type: Output, args: ['clrIfExpandedChange',] }]\n    };\n    return ClrIfExpanded;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar EXPAND_DIRECTIVES = [ClrIfExpanded];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrIfExpandModule = /** @class */ (function () {\n    function ClrIfExpandModule() {\n    }\n    ClrIfExpandModule.decorators = [\n        { type: NgModule, args: [{ imports: [CommonModule], declarations: [EXPAND_DIRECTIVES], exports: [EXPAND_DIRECTIVES] },] }\n    ];\n    return ClrIfExpandModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_LOADING_DIRECTIVES = [ClrLoading];\nvar ClrLoadingModule = /** @class */ (function () {\n    function ClrLoadingModule() {\n    }\n    ClrLoadingModule.decorators = [\n        { type: NgModule, args: [{ imports: [CommonModule], declarations: [CLR_LOADING_DIRECTIVES], exports: [CLR_LOADING_DIRECTIVES] },] }\n    ];\n    return ClrLoadingModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar OutsideClick = /** @class */ (function () {\n    function OutsideClick(el) {\n        this.el = el;\n        this.strict = false;\n        this.outsideClick = new EventEmitter(false);\n    }\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    OutsideClick.prototype.documentClick = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        /** @type {?} */\n        var target = event.target;\n        // Get the element in the DOM on which the mouse was clicked\n        /** @type {?} */\n        var host = this.el.nativeElement;\n        if (target === host) {\n            return;\n        }\n        if (!this.strict && host.contains(target)) {\n            return;\n        }\n        this.outsideClick.emit(event);\n    };\n    OutsideClick.decorators = [\n        { type: Directive, args: [{ selector: '[clrOutsideClick]' },] }\n    ];\n    /** @nocollapse */\n    OutsideClick.ctorParameters = function () { return [\n        { type: ElementRef }\n    ]; };\n    OutsideClick.propDecorators = {\n        strict: [{ type: Input, args: ['clrStrict',] }],\n        outsideClick: [{ type: Output, args: ['clrOutsideClick',] }],\n        documentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]\n    };\n    return OutsideClick;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar OUSTIDE_CLICK_DIRECTIVES = [OutsideClick];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrOutsideClickModule = /** @class */ (function () {\n    function ClrOutsideClickModule() {\n    }\n    ClrOutsideClickModule.decorators = [\n        { type: NgModule, args: [{ imports: [CommonModule], declarations: [OUSTIDE_CLICK_DIRECTIVES], exports: [OUSTIDE_CLICK_DIRECTIVES] },] }\n    ];\n    return ClrOutsideClickModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DomAdapter = /** @class */ (function () {\n    function DomAdapter() {\n    }\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    DomAdapter.prototype.userDefinedWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        element.classList.add('datagrid-cell-width-zero');\n        /** @type {?} */\n        var userDefinedWidth = this.clientRect(element).width;\n        element.classList.remove('datagrid-cell-width-zero');\n        return userDefinedWidth;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    DomAdapter.prototype.scrollBarWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return element.offsetWidth - element.clientWidth;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    DomAdapter.prototype.scrollWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return element.scrollWidth || 0;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    DomAdapter.prototype.computedHeight = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return parseInt(getComputedStyle(element).getPropertyValue('height'), 10);\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    DomAdapter.prototype.clientRect = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        /** @type {?} */\n        var elementClientRect = element.getBoundingClientRect();\n        return {\n            top: parseInt(elementClientRect.top, 10),\n            bottom: parseInt(elementClientRect.bottom, 10),\n            left: parseInt(elementClientRect.left, 10),\n            right: parseInt(elementClientRect.right, 10),\n            width: parseInt(elementClientRect.width, 10),\n            height: parseInt(elementClientRect.height, 10),\n        };\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    DomAdapter.prototype.minWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return parseInt(getComputedStyle(element).getPropertyValue('min-width'), 10);\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    DomAdapter.prototype.focus = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        element.focus();\n    };\n    DomAdapter.decorators = [\n        { type: Injectable }\n    ];\n    return DomAdapter;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatagridRowExpandAnimation = /** @class */ (function () {\n    function DatagridRowExpandAnimation(el, domAdapter, renderer, expand) {\n        var _this = this;\n        this.el = el;\n        this.domAdapter = domAdapter;\n        this.renderer = renderer;\n        this.expand = expand;\n        if (expand && expand.animate) {\n            expand.animate.subscribe(function () {\n                // We already had an animation waiting, so we just have to run in, not prepare again\n                if (_this.oldHeight) {\n                    setTimeout(function () { return _this.run(); });\n                }\n                else {\n                    _this.animate();\n                }\n            });\n        }\n    }\n    /*\n       * Dirty manual animation handling, but we have no way to use dynamic heights in Angular's current API.\n       * They're working on it, but have no ETA.\n       */\n    /*\n         * Dirty manual animation handling, but we have no way to use dynamic heights in Angular's current API.\n         * They're working on it, but have no ETA.\n         */\n    /**\n     * @return {?}\n     */\n    DatagridRowExpandAnimation.prototype.animate = /*\n         * Dirty manual animation handling, but we have no way to use dynamic heights in Angular's current API.\n         * They're working on it, but have no ETA.\n         */\n    /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        // Check if we do have web-animations available. If not, just skip the animation.\n        if (!this.el.nativeElement.animate) {\n            return;\n        }\n        // We had an animation running, we skip to the end\n        if (this.running) {\n            this.running.finish();\n        }\n        this.oldHeight = this.domAdapter.computedHeight(this.el.nativeElement);\n        // In case height has not yet been set. When starting expanded, for example.\n        // See https://github.com/vmware/clarity/issues/2904\n        if (isNaN(this.oldHeight)) {\n            this.oldHeight = 0;\n        }\n        // We set the height of the element immediately to avoid a flicker before the animation starts.\n        this.renderer.setStyle(this.el.nativeElement, 'height', this.oldHeight + 'px');\n        this.renderer.setStyle(this.el.nativeElement, 'overflow-y', 'hidden');\n        setTimeout(function () {\n            if (_this.expand.loading) {\n                return;\n            }\n            _this.run();\n        });\n    };\n    /**\n     * @return {?}\n     */\n    DatagridRowExpandAnimation.prototype.run = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.renderer.setStyle(this.el.nativeElement, 'height', null);\n        /** @type {?} */\n        var newHeight = this.domAdapter.computedHeight(this.el.nativeElement);\n        this.running = this.el.nativeElement.animate({ height: [this.oldHeight + 'px', newHeight + 'px'], easing: 'ease-in-out' }, { duration: 200 });\n        this.running.onfinish = function () {\n            _this.renderer.setStyle(_this.el.nativeElement, 'overflow-y', null);\n            delete _this.running;\n        };\n        delete this.oldHeight;\n    };\n    DatagridRowExpandAnimation.decorators = [\n        { type: Directive, args: [{ selector: 'clr-dg-row' },] }\n    ];\n    /** @nocollapse */\n    DatagridRowExpandAnimation.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: DomAdapter },\n        { type: Renderer2 },\n        { type: Expand }\n    ]; };\n    return DatagridRowExpandAnimation;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * @abstract\n */\nvar  /*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * @abstract\n */\nCustomFilter = /** @class */ (function () {\n    function CustomFilter() {\n    }\n    return CustomFilter;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * This provider implements some form of synchronous debouncing through a lock pattern\n * to avoid emitting multiple state changes for a single user action.\n */\nvar StateDebouncer = /** @class */ (function () {\n    function StateDebouncer() {\n        /**\n         * The Observable that lets other classes subscribe to global state changes\n         */\n        this._change = new Subject();\n        /*\n             * This is the lock, to only emit once all the changes have finished processing\n             */\n        this.nbChanges = 0;\n    }\n    Object.defineProperty(StateDebouncer.prototype, \"change\", {\n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        get: \n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        /**\n         * @return {?}\n         */\n        function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    StateDebouncer.prototype.changeStart = /**\n     * @return {?}\n     */\n    function () {\n        this.nbChanges++;\n    };\n    /**\n     * @return {?}\n     */\n    StateDebouncer.prototype.changeDone = /**\n     * @return {?}\n     */\n    function () {\n        if (--this.nbChanges === 0) {\n            this._change.next();\n        }\n    };\n    StateDebouncer.decorators = [\n        { type: Injectable }\n    ];\n    return StateDebouncer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar Page = /** @class */ (function () {\n    function Page(stateDebouncer) {\n        this.stateDebouncer = stateDebouncer;\n        /**\n         * Page size, a value of 0 means no pagination\n         */\n        this._size = 0;\n        /**\n         * Total items (needed to guess the last page)\n         */\n        this._totalItems = 0;\n        /**\n         * The Observable that lets other classes subscribe to page changes\n         */\n        this._change = new Subject();\n        this._sizeChange = new Subject();\n        /**\n         * Current page\n         */\n        this._current = 1;\n    }\n    Object.defineProperty(Page.prototype, \"size\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._size;\n        },\n        set: /**\n         * @param {?} size\n         * @return {?}\n         */\n        function (size) {\n            /** @type {?} */\n            var oldSize = this._size;\n            if (size !== oldSize) {\n                this.stateDebouncer.changeStart();\n                this._size = size;\n                if (size === 0) {\n                    this._current = 1;\n                }\n                else {\n                    // Yeap. That's the formula to keep the first item from the old page still\n                    // displayed in the new one.\n                    this._current = Math.floor(oldSize / size * (this._current - 1)) + 1;\n                }\n                // We always emit an event even if the current page index didn't change, because\n                // the size changing means the items inside the page are different\n                this._change.next(this._current);\n                this._sizeChange.next(this._size);\n                this.stateDebouncer.changeDone();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Page.prototype, \"totalItems\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._totalItems;\n        },\n        set: /**\n         * @param {?} total\n         * @return {?}\n         */\n        function (total) {\n            this._totalItems = total;\n            // If we have less items than before, we might need to change the current page\n            if (this.current > this.last) {\n                this.current = this.last;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Page.prototype, \"last\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (this._last) {\n                return this._last;\n            }\n            // If the last page isn't known, we compute it from the last item's index\n            if (this.size > 0 && this.totalItems) {\n                return Math.ceil(this.totalItems / this.size);\n            }\n            return 1;\n        },\n        set: /**\n         * @param {?} page\n         * @return {?}\n         */\n        function (page) {\n            this._last = page;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Page.prototype, \"change\", {\n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        get: \n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        /**\n         * @return {?}\n         */\n        function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Page.prototype, \"sizeChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._sizeChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Page.prototype, \"current\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._current;\n        },\n        set: /**\n         * @param {?} page\n         * @return {?}\n         */\n        function (page) {\n            if (page !== this._current) {\n                this.stateDebouncer.changeStart();\n                this._current = page;\n                this._change.next(page);\n                this.stateDebouncer.changeDone();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Moves to the previous page if it exists\n     */\n    /**\n     * Moves to the previous page if it exists\n     * @return {?}\n     */\n    Page.prototype.previous = /**\n     * Moves to the previous page if it exists\n     * @return {?}\n     */\n    function () {\n        if (this.current > 1) {\n            this.current--;\n        }\n    };\n    /**\n     * Moves to the next page if it exists\n     */\n    /**\n     * Moves to the next page if it exists\n     * @return {?}\n     */\n    Page.prototype.next = /**\n     * Moves to the next page if it exists\n     * @return {?}\n     */\n    function () {\n        if (this.current < this.last) {\n            this.current++;\n        }\n    };\n    Object.defineProperty(Page.prototype, \"firstItem\", {\n        /**\n         * Index of the first item displayed on the current page, starting at 0\n         */\n        get: /**\n         * Index of the first item displayed on the current page, starting at 0\n         * @return {?}\n         */\n        function () {\n            if (this.size === 0) {\n                return 0;\n            }\n            return (this.current - 1) * this.size;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Page.prototype, \"lastItem\", {\n        /**\n         * Index of the last item displayed on the current page, starting at 0\n         */\n        get: /**\n         * Index of the last item displayed on the current page, starting at 0\n         * @return {?}\n         */\n        function () {\n            if (this.size === 0) {\n                return this.totalItems - 1;\n            }\n            /** @type {?} */\n            var lastInPage = this.current * this.size - 1;\n            if (this.totalItems) {\n                lastInPage = Math.min(lastInPage, this.totalItems - 1);\n            }\n            return lastInPage;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Resets the page size to 0\n     */\n    /**\n     * Resets the page size to 0\n     * @return {?}\n     */\n    Page.prototype.resetPageSize = /**\n     * Resets the page size to 0\n     * @return {?}\n     */\n    function () {\n        this.size = 0;\n    };\n    Page.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    Page.ctorParameters = function () { return [\n        { type: StateDebouncer }\n    ]; };\n    return Page;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar FiltersProvider = /** @class */ (function () {\n    function FiltersProvider(_page, stateDebouncer) {\n        this._page = _page;\n        this.stateDebouncer = stateDebouncer;\n        /**\n         * This subject is the list of filters that changed last, not the whole list.\n         * We emit a list rather than just one filter to allow batch changes to several at once.\n         */\n        this._change = new Subject();\n        /**\n         * List of all filters, whether they're active or not\n         */\n        this._all = [];\n    }\n    Object.defineProperty(FiltersProvider.prototype, \"change\", {\n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        get: \n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        /**\n         * @return {?}\n         */\n        function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Tests if at least one filter is currently active\n     */\n    /**\n     * Tests if at least one filter is currently active\n     * @return {?}\n     */\n    FiltersProvider.prototype.hasActiveFilters = /**\n     * Tests if at least one filter is currently active\n     * @return {?}\n     */\n    function () {\n        var e_1, _a;\n        try {\n            // We do not use getActiveFilters() because this function will be called much more often\n            // and stopping the loop early might be relevant.\n            for (var _b = __values(this._all), _c = _b.next(); !_c.done; _c = _b.next()) {\n                var filter$$1 = _c.value.filter;\n                if (filter$$1 && filter$$1.isActive()) {\n                    return true;\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        return false;\n    };\n    /**\n     * Returns a list of all currently active filters\n     */\n    /**\n     * Returns a list of all currently active filters\n     * @return {?}\n     */\n    FiltersProvider.prototype.getActiveFilters = /**\n     * Returns a list of all currently active filters\n     * @return {?}\n     */\n    function () {\n        var e_2, _a;\n        /** @type {?} */\n        var ret = [];\n        try {\n            for (var _b = __values(this._all), _c = _b.next(); !_c.done; _c = _b.next()) {\n                var filter$$1 = _c.value.filter;\n                if (filter$$1 && filter$$1.isActive()) {\n                    ret.push(filter$$1);\n                }\n            }\n        }\n        catch (e_2_1) { e_2 = { error: e_2_1 }; }\n        finally {\n            try {\n                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n            }\n            finally { if (e_2) throw e_2.error; }\n        }\n        return ret;\n    };\n    /**\n     * Registers a filter, and returns a deregistration function\n     */\n    /**\n     * Registers a filter, and returns a deregistration function\n     * @template F\n     * @param {?} filter\n     * @return {?}\n     */\n    FiltersProvider.prototype.add = /**\n     * Registers a filter, and returns a deregistration function\n     * @template F\n     * @param {?} filter\n     * @return {?}\n     */\n    function (filter$$1) {\n        var _this = this;\n        /** @type {?} */\n        var index = this._all.length;\n        /** @type {?} */\n        var subscription = filter$$1.changes.subscribe(function () { return _this.resetPageAndEmitFilterChange([filter$$1]); });\n        /** @type {?} */\n        var hasUnregistered = false;\n        /** @type {?} */\n        var registered = new RegisteredFilter(filter$$1, function () {\n            if (hasUnregistered) {\n                return;\n            }\n            subscription.unsubscribe();\n            _this._all.splice(index, 1);\n            if (filter$$1.isActive()) {\n                _this.resetPageAndEmitFilterChange([]);\n            }\n            hasUnregistered = true;\n        });\n        this._all.push(registered);\n        if (filter$$1.isActive()) {\n            this.resetPageAndEmitFilterChange([filter$$1]);\n        }\n        return registered;\n    };\n    /**\n     * Accepts an item if it is accepted by all currently active filters\n     */\n    /**\n     * Accepts an item if it is accepted by all currently active filters\n     * @param {?} item\n     * @return {?}\n     */\n    FiltersProvider.prototype.accepts = /**\n     * Accepts an item if it is accepted by all currently active filters\n     * @param {?} item\n     * @return {?}\n     */\n    function (item) {\n        var e_3, _a;\n        try {\n            for (var _b = __values(this._all), _c = _b.next(); !_c.done; _c = _b.next()) {\n                var filter$$1 = _c.value.filter;\n                if (filter$$1 && filter$$1.isActive() && !filter$$1.accepts(item)) {\n                    return false;\n                }\n            }\n        }\n        catch (e_3_1) { e_3 = { error: e_3_1 }; }\n        finally {\n            try {\n                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n            }\n            finally { if (e_3) throw e_3.error; }\n        }\n        return true;\n    };\n    /**\n     * @param {?} filters\n     * @return {?}\n     */\n    FiltersProvider.prototype.resetPageAndEmitFilterChange = /**\n     * @param {?} filters\n     * @return {?}\n     */\n    function (filters) {\n        this.stateDebouncer.changeStart();\n        // filtering may change the page number such that current page number doesn't exist in the filtered dataset.\n        // So here we always set the current page to 1 so that it'll fetch first page's data with the given filter.\n        this._page.current = 1;\n        this._change.next(filters);\n        this.stateDebouncer.changeDone();\n    };\n    FiltersProvider.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    FiltersProvider.ctorParameters = function () { return [\n        { type: Page },\n        { type: StateDebouncer }\n    ]; };\n    return FiltersProvider;\n}());\n/**\n * @template T, F\n */\nvar /**\n * @template T, F\n */\nRegisteredFilter = /** @class */ (function () {\n    function RegisteredFilter(filter$$1, unregister) {\n        this.filter = filter$$1;\n        this.unregister = unregister;\n    }\n    return RegisteredFilter;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @abstract\n * @template T, F\n */\nvar  /**\n * @abstract\n * @template T, F\n */\nDatagridFilterRegistrar = /** @class */ (function () {\n    function DatagridFilterRegistrar(filters) {\n        this.filters = filters;\n    }\n    Object.defineProperty(DatagridFilterRegistrar.prototype, \"filter\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.registered && this.registered.filter;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} filter\n     * @return {?}\n     */\n    DatagridFilterRegistrar.prototype.setFilter = /**\n     * @param {?} filter\n     * @return {?}\n     */\n    function (filter$$1) {\n        // If we previously had another filter, we unregister it\n        this.deleteFilter();\n        if (filter$$1 instanceof RegisteredFilter) {\n            this.registered = filter$$1;\n        }\n        else if (filter$$1) {\n            this.registered = this.filters.add(filter$$1);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    DatagridFilterRegistrar.prototype.deleteFilter = /**\n     * @return {?}\n     */\n    function () {\n        if (this.registered) {\n            this.registered.unregister();\n            delete this.registered;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    DatagridFilterRegistrar.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.deleteFilter();\n    };\n    return DatagridFilterRegistrar;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * Custom filter that can be added in any column to override the default object property string filter.\n * The reason this is not just an input on DatagridColumn is because we need the filter's template to be projected,\n * since it can be anything (not just a text input).\n * @template T\n */\nvar ClrDatagridFilter = /** @class */ (function (_super) {\n    __extends(ClrDatagridFilter, _super);\n    function ClrDatagridFilter(_filters, commonStrings) {\n        var _this = _super.call(this, _filters) || this;\n        _this.commonStrings = commonStrings;\n        _this.anchorPoint = Point.RIGHT_BOTTOM;\n        _this.popoverPoint = Point.RIGHT_TOP;\n        _this.popoverOptions = { allowMultipleOpen: true };\n        /**\n         * Tracks whether the filter dropdown is open or not\n         */\n        _this._open = false;\n        _this.openChanged = new EventEmitter(false);\n        return _this;\n    }\n    Object.defineProperty(ClrDatagridFilter.prototype, \"open\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._open;\n        },\n        set: /**\n         * @param {?} open\n         * @return {?}\n         */\n        function (open) {\n            /** @type {?} */\n            var boolOpen = !!open;\n            if (boolOpen !== this._open) {\n                this._open = boolOpen;\n                this.openChanged.emit(boolOpen);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridFilter.prototype, \"customFilter\", {\n        set: /**\n         * @param {?} filter\n         * @return {?}\n         */\n        function (filter$$1) {\n            this.setFilter(filter$$1);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridFilter.prototype, \"active\", {\n        /**\n         * Indicates if the filter is currently active\n         */\n        get: /**\n         * Indicates if the filter is currently active\n         * @return {?}\n         */\n        function () {\n            return !!this.filter && this.filter.isActive();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Shows/hides the filter dropdown\n     */\n    /**\n     * Shows/hides the filter dropdown\n     * @return {?}\n     */\n    ClrDatagridFilter.prototype.toggle = /**\n     * Shows/hides the filter dropdown\n     * @return {?}\n     */\n    function () {\n        this.open = !this.open;\n    };\n    ClrDatagridFilter.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-filter',\n                    // We register this component as a CustomFilter, for the parent column to detect it.\n                    providers: [{ provide: CustomFilter, useExisting: ClrDatagridFilter }],\n                    template: \"\\n        <button #anchor class=\\\"datagrid-filter-toggle\\\" (click)=\\\"toggle()\\\"\\n            [class.datagrid-filter-open]=\\\"open\\\" [class.datagrid-filtered]=\\\"active\\\"\\n            type=\\\"button\\\"></button>\\n\\n        <ng-template [(clrPopoverOld)]=\\\"open\\\" [clrPopoverOldAnchor]=\\\"anchor\\\" [clrPopoverOldAnchorPoint]=\\\"anchorPoint\\\"\\n             [clrPopoverOldPopoverPoint]=\\\"popoverPoint\\\" [clrPopoverOldOptions]=\\\"popoverOptions\\\">\\n            <div class=\\\"datagrid-filter\\\">\\n                <!-- FIXME: this whole filter part needs a final design before we can try to have a cleaner DOM -->\\n                <div class=\\\"datagrid-filter-close-wrapper\\\">\\n                    <button type=\\\"button\\\" class=\\\"close\\\" (click)=\\\"open = false\\\">\\n                        <clr-icon shape=\\\"close\\\" [attr.title]=\\\"commonStrings.close\\\"></clr-icon>\\n                    </button>\\n                </div>\\n    \\n                <ng-content></ng-content>\\n            </div>\\n        </ng-template>\\n    \"\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridFilter.ctorParameters = function () { return [\n        { type: FiltersProvider },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrDatagridFilter.propDecorators = {\n        open: [{ type: Input, args: ['clrDgFilterOpen',] }],\n        openChanged: [{ type: Output, args: ['clrDgFilterOpenChange',] }],\n        customFilter: [{ type: Input, args: ['clrDgFilter',] }]\n    };\n    return ClrDatagridFilter;\n}(DatagridFilterRegistrar));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar /**\n * @template T\n */\nDatagridStringFilterImpl = /** @class */ (function () {\n    function DatagridStringFilterImpl(filterFn) {\n        this.filterFn = filterFn;\n        /**\n         * The Observable required as part of the Filter interface\n         */\n        this._changes = new Subject();\n        /**\n         * Raw input value\n         */\n        this._rawValue = '';\n        /**\n         * Input value converted to lowercase\n         */\n        this._lowerCaseValue = '';\n    }\n    Object.defineProperty(DatagridStringFilterImpl.prototype, \"changes\", {\n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        get: \n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        /**\n         * @return {?}\n         */\n        function () {\n            return this._changes.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DatagridStringFilterImpl.prototype, \"value\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._rawValue;\n        },\n        /**\n         * Common setter for the input value\n         */\n        set: /**\n         * Common setter for the input value\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (!value) {\n                value = '';\n            }\n            if (value !== this._rawValue) {\n                this._rawValue = value;\n                this._lowerCaseValue = value.toLowerCase().trim();\n                this._changes.next(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DatagridStringFilterImpl.prototype, \"lowerCaseValue\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._lowerCaseValue;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Indicates if the filter is currently active, meaning the input is not empty\n     */\n    /**\n     * Indicates if the filter is currently active, meaning the input is not empty\n     * @return {?}\n     */\n    DatagridStringFilterImpl.prototype.isActive = /**\n     * Indicates if the filter is currently active, meaning the input is not empty\n     * @return {?}\n     */\n    function () {\n        return !!this.value;\n    };\n    /**\n     * Tests if an item matches a search text\n     */\n    /**\n     * Tests if an item matches a search text\n     * @param {?} item\n     * @return {?}\n     */\n    DatagridStringFilterImpl.prototype.accepts = /**\n     * Tests if an item matches a search text\n     * @param {?} item\n     * @return {?}\n     */\n    function (item) {\n        // We always test with the lowercase value of the input, to stay case insensitive\n        return this.filterFn.accepts(item, this.lowerCaseValue);\n    };\n    return DatagridStringFilterImpl;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar DatagridStringFilter = /** @class */ (function (_super) {\n    __extends(DatagridStringFilter, _super);\n    function DatagridStringFilter(filters, domAdapter) {\n        var _this = _super.call(this, filters) || this;\n        _this.domAdapter = domAdapter;\n        /**\n         * Indicates if the filter dropdown is open\n         */\n        _this.open = false;\n        _this.filterValueChange = new EventEmitter();\n        return _this;\n    }\n    Object.defineProperty(DatagridStringFilter.prototype, \"customStringFilter\", {\n        /**\n         * Customizable filter logic based on a search text\n         */\n        set: /**\n         * Customizable filter logic based on a search text\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value instanceof RegisteredFilter) {\n                this.setFilter(value);\n            }\n            else {\n                this.setFilter(new DatagridStringFilterImpl(value));\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    DatagridStringFilter.prototype.ngAfterViewInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.filterContainer.openChanged.subscribe(function (open) {\n            if (open) {\n                // We need the timeout because at the time this executes, the input isn't\n                // displayed yet.\n                setTimeout(function () {\n                    _this.domAdapter.focus(_this.input.nativeElement);\n                });\n            }\n        });\n    };\n    Object.defineProperty(DatagridStringFilter.prototype, \"value\", {\n        /**\n         * Common setter for the input value\n         */\n        get: /**\n         * Common setter for the input value\n         * @return {?}\n         */\n        function () {\n            return this.filter.value;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (!this.filter) {\n                return;\n            }\n            if (!value) {\n                value = '';\n            }\n            if (value !== this.filter.value) {\n                this.filter.value = value;\n                this.filterValueChange.emit(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    DatagridStringFilter.prototype.close = /**\n     * @return {?}\n     */\n    function () {\n        this.open = false;\n    };\n    DatagridStringFilter.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-string-filter',\n                    providers: [{ provide: CustomFilter, useExisting: DatagridStringFilter }],\n                    template: \"\\n        <clr-dg-filter [clrDgFilter]=\\\"registered\\\" [(clrDgFilterOpen)]=\\\"open\\\">\\n            <!--\\n                Even though this *ngIf looks useless because the filter container already has one,\\n                it prevents NgControlStatus and other directives automatically added by Angular\\n                on inputs with NgModel from freaking out because of their host binding changing\\n                mid-change detection when the input is destroyed.\\n            -->\\n            <input #input type=\\\"text\\\" name=\\\"search\\\" [(ngModel)]=\\\"value\\\" *ngIf=\\\"open\\\"\\n                (keyup.enter)=\\\"close()\\\" (keyup.escape)=\\\"close()\\\"/>\\n        </clr-dg-filter>\\n    \"\n                }] }\n    ];\n    /** @nocollapse */\n    DatagridStringFilter.ctorParameters = function () { return [\n        { type: FiltersProvider },\n        { type: DomAdapter }\n    ]; };\n    DatagridStringFilter.propDecorators = {\n        customStringFilter: [{ type: Input, args: ['clrDgStringFilter',] }],\n        input: [{ type: ViewChild, args: ['input',] }],\n        filterContainer: [{ type: ViewChild, args: [ClrDatagridFilter,] }],\n        value: [{ type: Input, args: ['clrFilterValue',] }],\n        filterValueChange: [{ type: Output, args: ['clrFilterValueChange',] }]\n    };\n    return DatagridStringFilter;\n}(DatagridFilterRegistrar));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @abstract\n */\nvar  /**\n * @abstract\n */\nOompaLoompa = /** @class */ (function () {\n    // FIXME: Request Injector once we move to Angular 4.2+, it'll allow easier refactors\n    function OompaLoompa(cdr, willyWonka) {\n        var _this = this;\n        this.subscription = willyWonka.chocolate.subscribe(function () {\n            if (_this.latestFlavor !== _this.flavor) {\n                cdr.detectChanges();\n            }\n        });\n    }\n    /**\n     * @return {?}\n     */\n    OompaLoompa.prototype.ngAfterContentChecked = /**\n     * @return {?}\n     */\n    function () {\n        this.latestFlavor = this.flavor;\n    };\n    /**\n     * @return {?}\n     */\n    OompaLoompa.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscription.unsubscribe();\n    };\n    return OompaLoompa;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar RowActionService = /** @class */ (function () {\n    function RowActionService() {\n        this.actionableCount = 0;\n    }\n    /**\n     * @return {?}\n     */\n    RowActionService.prototype.register = /**\n     * @return {?}\n     */\n    function () {\n        this.actionableCount++;\n    };\n    /**\n     * @return {?}\n     */\n    RowActionService.prototype.unregister = /**\n     * @return {?}\n     */\n    function () {\n        this.actionableCount--;\n    };\n    Object.defineProperty(RowActionService.prototype, \"hasActionableRow\", {\n        /**\n         * false means no rows with action\n         */\n        get: /**\n         * false means no rows with action\n         * @return {?}\n         */\n        function () {\n            return this.actionableCount > 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    RowActionService.decorators = [\n        { type: Injectable }\n    ];\n    return RowActionService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * After a conversation with the Angular core team, it turns out we don't have much of a choice for our\n * declarative API, we need to fight against change detection and its one-way flow. This is\n * currently the least dirty solution to do what we want.\n *\n * Do not modify or even use this class unless you know exactly what you're doing.\n * It has the potential to trigger change detection loops or kill app performances.\n */\nvar  /*\n * After a conversation with the Angular core team, it turns out we don't have much of a choice for our\n * declarative API, we need to fight against change detection and its one-way flow. This is\n * currently the least dirty solution to do what we want.\n *\n * Do not modify or even use this class unless you know exactly what you're doing.\n * It has the potential to trigger change detection loops or kill app performances.\n */\nWillyWonka = /** @class */ (function () {\n    function WillyWonka() {\n        this._chocolate = new Subject();\n    }\n    Object.defineProperty(WillyWonka.prototype, \"chocolate\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._chocolate.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    WillyWonka.prototype.ngAfterViewChecked = /**\n     * @return {?}\n     */\n    function () {\n        this._chocolate.next();\n    };\n    return WillyWonka;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatagridWillyWonka = /** @class */ (function (_super) {\n    __extends(DatagridWillyWonka, _super);\n    function DatagridWillyWonka() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    DatagridWillyWonka.decorators = [\n        { type: Directive, args: [{ selector: 'clr-datagrid' },] }\n    ];\n    return DatagridWillyWonka;\n}(WillyWonka));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ActionableOompaLoompa = /** @class */ (function (_super) {\n    __extends(ActionableOompaLoompa, _super);\n    function ActionableOompaLoompa(cdr, willyWonka, rowActions) {\n        var _this = this;\n        if (!willyWonka) {\n            throw new Error('clr-dg-row should only be used inside of a clr-datagrid');\n        }\n        _this = _super.call(this, cdr, willyWonka) || this;\n        _this.rowActions = rowActions;\n        return _this;\n    }\n    Object.defineProperty(ActionableOompaLoompa.prototype, \"flavor\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.rowActions.hasActionableRow;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ActionableOompaLoompa.decorators = [\n        { type: Directive, args: [{ selector: 'clr-datagrid, clr-dg-row' },] }\n    ];\n    /** @nocollapse */\n    ActionableOompaLoompa.ctorParameters = function () { return [\n        { type: ChangeDetectorRef },\n        { type: DatagridWillyWonka, decorators: [{ type: Optional }] },\n        { type: RowActionService }\n    ]; };\n    return ActionableOompaLoompa;\n}(OompaLoompa));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ExpandableRowsCount = /** @class */ (function () {\n    function ExpandableRowsCount() {\n        this.expandableCount = 0;\n    }\n    /**\n     * @return {?}\n     */\n    ExpandableRowsCount.prototype.register = /**\n     * @return {?}\n     */\n    function () {\n        this.expandableCount++;\n    };\n    /**\n     * @return {?}\n     */\n    ExpandableRowsCount.prototype.unregister = /**\n     * @return {?}\n     */\n    function () {\n        this.expandableCount--;\n    };\n    Object.defineProperty(ExpandableRowsCount.prototype, \"hasExpandableRow\", {\n        /**\n         * false means no rows with action\n         */\n        get: /**\n         * false means no rows with action\n         * @return {?}\n         */\n        function () {\n            return this.expandableCount > 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ExpandableRowsCount.decorators = [\n        { type: Injectable }\n    ];\n    return ExpandableRowsCount;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ExpandableOompaLoompa = /** @class */ (function (_super) {\n    __extends(ExpandableOompaLoompa, _super);\n    function ExpandableOompaLoompa(cdr, willyWonka, expandableCount) {\n        var _this = this;\n        if (!willyWonka) {\n            throw new Error('clr-dg-row should only be used inside of a clr-datagrid');\n        }\n        _this = _super.call(this, cdr, willyWonka) || this;\n        _this.expandableCount = expandableCount;\n        return _this;\n    }\n    Object.defineProperty(ExpandableOompaLoompa.prototype, \"flavor\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.expandableCount.hasExpandableRow;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ExpandableOompaLoompa.decorators = [\n        { type: Directive, args: [{ selector: 'clr-datagrid, clr-dg-row' },] }\n    ];\n    /** @nocollapse */\n    ExpandableOompaLoompa.ctorParameters = function () { return [\n        { type: ChangeDetectorRef },\n        { type: DatagridWillyWonka, decorators: [{ type: Optional }] },\n        { type: ExpandableRowsCount }\n    ]; };\n    return ExpandableOompaLoompa;\n}(OompaLoompa));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * Generic accessor for deep object properties\n * that can be specified as simple dot-separated strings.\n * @template T\n */\nvar /*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * Generic accessor for deep object properties\n * that can be specified as simple dot-separated strings.\n * @template T\n */\nNestedProperty = /** @class */ (function () {\n    function NestedProperty(prop) {\n        this.prop = prop;\n        if (prop.indexOf('.') >= 0) {\n            this.splitProp = prop.split('.');\n        }\n    }\n    // Safe getter for a deep object property, will not throw an error but return\n    // undefined if one of the intermediate properties is null or undefined.\n    // Safe getter for a deep object property, will not throw an error but return\n    // undefined if one of the intermediate properties is null or undefined.\n    /**\n     * @param {?} item\n     * @return {?}\n     */\n    NestedProperty.prototype.getPropValue = \n    // Safe getter for a deep object property, will not throw an error but return\n    // undefined if one of the intermediate properties is null or undefined.\n    /**\n     * @param {?} item\n     * @return {?}\n     */\n    function (item) {\n        var e_1, _a;\n        if (this.splitProp) {\n            /** @type {?} */\n            var value = item;\n            try {\n                for (var _b = __values(this.splitProp), _c = _b.next(); !_c.done; _c = _b.next()) {\n                    var nestedProp = _c.value;\n                    if (value == null || typeof value === 'undefined' || typeof value[nestedProp] === 'undefined') {\n                        return undefined;\n                    }\n                    value = value[nestedProp];\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n            return value;\n        }\n        else {\n            return item[this.prop];\n        }\n    };\n    return NestedProperty;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar  /**\n * @template T\n */\nDatagridPropertyComparator = /** @class */ (function () {\n    function DatagridPropertyComparator(prop) {\n        this.prop = prop;\n        this.nestedProp = new NestedProperty(prop);\n    }\n    /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    DatagridPropertyComparator.prototype.compare = /**\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function (a, b) {\n        /** @type {?} */\n        var propA = this.nestedProp.getPropValue(a);\n        /** @type {?} */\n        var propB = this.nestedProp.getPropValue(b);\n        if (typeof propA === 'string') {\n            propA = propA.toLowerCase();\n        }\n        if (typeof propB === 'string') {\n            propB = propB.toLowerCase();\n        }\n        if (typeof propA === 'undefined' || propA === null) {\n            if (typeof propB === 'undefined' || propB === null) {\n                return 0;\n            }\n            else {\n                return 1;\n            }\n        }\n        else {\n            if (typeof propB === 'undefined' || propB === null) {\n                return -1;\n            }\n            else if (propA < propB) {\n                return -1;\n            }\n            else if (propA > propB) {\n                return 1;\n            }\n            else {\n                return 0;\n            }\n        }\n    };\n    return DatagridPropertyComparator;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar  /**\n * @template T\n */\nDatagridPropertyStringFilter = /** @class */ (function () {\n    function DatagridPropertyStringFilter(prop, exact) {\n        if (exact === void 0) { exact = false; }\n        this.prop = prop;\n        this.exact = exact;\n        this.nestedProp = new NestedProperty(prop);\n    }\n    /**\n     * @param {?} item\n     * @param {?} search\n     * @return {?}\n     */\n    DatagridPropertyStringFilter.prototype.accepts = /**\n     * @param {?} item\n     * @param {?} search\n     * @return {?}\n     */\n    function (item, search) {\n        /** @type {?} */\n        var propValue = this.nestedProp.getPropValue(item);\n        if (typeof propValue === 'undefined') {\n            return false;\n        }\n        else if (this.exact) {\n            return ('' + propValue).toLowerCase() === search;\n        }\n        else {\n            return ('' + propValue).toLowerCase().indexOf(search) >= 0;\n        }\n    };\n    return DatagridPropertyStringFilter;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/** @enum {number} */\nvar ClrDatagridSortOrder = {\n    UNSORTED: 0,\n    ASC: 1,\n    DESC: -1,\n};\nClrDatagridSortOrder[ClrDatagridSortOrder.UNSORTED] = 'UNSORTED';\nClrDatagridSortOrder[ClrDatagridSortOrder.ASC] = 'ASC';\nClrDatagridSortOrder[ClrDatagridSortOrder.DESC] = 'DESC';\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DragDispatcher = /** @class */ (function () {\n    function DragDispatcher(_ngZone, _renderer) {\n        this._ngZone = _ngZone;\n        this._renderer = _renderer;\n        this._onDragStart = new Subject();\n        this._onDragMove = new Subject();\n        this._onDragEnd = new Subject();\n    }\n    Object.defineProperty(DragDispatcher.prototype, \"onDragStart\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._onDragStart;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DragDispatcher.prototype, \"onDragMove\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._onDragMove;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DragDispatcher.prototype, \"onDragEnd\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._onDragEnd;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    DragDispatcher.prototype.addDragListener = /**\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var handleEl = this.handleRef.nativeElement;\n        this._listeners = [\n            this.customDragEvent(handleEl, 'mousedown', 'mousemove', 'mouseup'),\n            this.customDragEvent(handleEl, 'touchstart', 'touchmove', 'touchend'),\n        ];\n    };\n    /**\n     * @param {?} element\n     * @param {?} startOnEvent\n     * @param {?} moveOnEvent\n     * @param {?} endOnEvent\n     * @return {?}\n     */\n    DragDispatcher.prototype.customDragEvent = /**\n     * @param {?} element\n     * @param {?} startOnEvent\n     * @param {?} moveOnEvent\n     * @param {?} endOnEvent\n     * @return {?}\n     */\n    function (element, startOnEvent, moveOnEvent, endOnEvent) {\n        var _this = this;\n        /** @type {?} */\n        var dragMoveListener;\n        /** @type {?} */\n        var dragEndListener;\n        return this._renderer.listen(element, startOnEvent, function (startEvent) {\n            _this.notifyDragStart(startEvent);\n            dragMoveListener = _this._ngZone.runOutsideAngular(function () {\n                return _this._renderer.listen('document', moveOnEvent, function (moveEvent) {\n                    _this.notifyDragMove(moveEvent);\n                });\n            });\n            dragEndListener = _this._renderer.listen('document', endOnEvent, function (endEvent) {\n                // Unsubscribing from mouseMoveListener\n                dragMoveListener();\n                _this.notifyDragEnd(endEvent);\n                // Unsubscribing from itself\n                dragEndListener();\n            });\n        });\n    };\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    DragDispatcher.prototype.notifyDragStart = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        return this._onDragStart.next(event);\n    };\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    DragDispatcher.prototype.notifyDragMove = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        return this._onDragMove.next(event);\n    };\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    DragDispatcher.prototype.notifyDragEnd = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        return this._onDragEnd.next(event);\n    };\n    /**\n     * @return {?}\n     */\n    DragDispatcher.prototype.destroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this._listeners) {\n            this._listeners.map(function (event) { return event(); });\n        }\n    };\n    DragDispatcher.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DragDispatcher.ctorParameters = function () { return [\n        { type: NgZone },\n        { type: Renderer2 }\n    ]; };\n    return DragDispatcher;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar Sort = /** @class */ (function () {\n    function Sort(stateDebouncer) {\n        this.stateDebouncer = stateDebouncer;\n        /**\n         * Ascending order if false, descending if true\n         */\n        this._reverse = false;\n        /**\n         * The Observable that lets other classes subscribe to sort changes\n         */\n        this._change = new Subject();\n    }\n    Object.defineProperty(Sort.prototype, \"comparator\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._comparator;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.stateDebouncer.changeStart();\n            this._comparator = value;\n            this.emitChange();\n            this.stateDebouncer.changeDone();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Sort.prototype, \"reverse\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._reverse;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.stateDebouncer.changeStart();\n            this._reverse = value;\n            this.emitChange();\n            this.stateDebouncer.changeDone();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    Sort.prototype.emitChange = /**\n     * @return {?}\n     */\n    function () {\n        this._change.next(this);\n    };\n    Object.defineProperty(Sort.prototype, \"change\", {\n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        get: \n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        /**\n         * @return {?}\n         */\n        function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Sets a comparator as the current one, or toggles reverse if the comparator is already used. The\n     * optional forceReverse input parameter allows to override that toggling behavior by sorting in\n     * reverse order if `true`.\n     *\n     * @memberof Sort\n     */\n    /**\n     * Sets a comparator as the current one, or toggles reverse if the comparator is already used. The\n     * optional forceReverse input parameter allows to override that toggling behavior by sorting in\n     * reverse order if `true`.\n     *\n     * \\@memberof Sort\n     * @param {?} sortBy\n     * @param {?=} forceReverse\n     * @return {?}\n     */\n    Sort.prototype.toggle = /**\n     * Sets a comparator as the current one, or toggles reverse if the comparator is already used. The\n     * optional forceReverse input parameter allows to override that toggling behavior by sorting in\n     * reverse order if `true`.\n     *\n     * \\@memberof Sort\n     * @param {?} sortBy\n     * @param {?=} forceReverse\n     * @return {?}\n     */\n    function (sortBy, forceReverse) {\n        this.stateDebouncer.changeStart();\n        // We modify private properties directly, to batch the change event\n        if (this.comparator === sortBy) {\n            this._reverse = typeof forceReverse !== 'undefined' ? forceReverse || !this._reverse : !this._reverse;\n        }\n        else {\n            this._comparator = sortBy;\n            this._reverse = typeof forceReverse !== 'undefined' ? forceReverse : false;\n        }\n        this.emitChange();\n        this.stateDebouncer.changeDone();\n    };\n    /**\n     * Clears the current sorting order\n     */\n    /**\n     * Clears the current sorting order\n     * @return {?}\n     */\n    Sort.prototype.clear = /**\n     * Clears the current sorting order\n     * @return {?}\n     */\n    function () {\n        this.comparator = null;\n    };\n    /**\n     * Compares two objects according to the current comparator\n     */\n    /**\n     * Compares two objects according to the current comparator\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    Sort.prototype.compare = /**\n     * Compares two objects according to the current comparator\n     * @param {?} a\n     * @param {?} b\n     * @return {?}\n     */\n    function (a, b) {\n        return (this.reverse ? -1 : 1) * this.comparator.compare(a, b);\n    };\n    Sort.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    Sort.ctorParameters = function () { return [\n        { type: StateDebouncer }\n    ]; };\n    return Sort;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar WrappedColumn = /** @class */ (function () {\n    function WrappedColumn() {\n        this._dynamic = false;\n    }\n    // the columns projected view (in memory)\n    /**\n     * @return {?}\n     */\n    WrappedColumn.prototype.ngAfterViewInit = \n    // the columns projected view (in memory)\n    /**\n     * @return {?}\n     */\n    function () {\n        // Create the cells view in memory, not the DOM.\n        this.columnView = this.templateRef.createEmbeddedView(null);\n    };\n    WrappedColumn.decorators = [\n        { type: Component, args: [{\n                    selector: 'dg-wrapped-column',\n                    template: \"        \\n        <ng-template #columnPortal>\\n            <ng-content></ng-content>\\n        </ng-template>\\n    \"\n                }] }\n    ];\n    WrappedColumn.propDecorators = {\n        templateRef: [{ type: ViewChild, args: ['columnPortal',] }]\n    };\n    return WrappedColumn;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar nbCount = 0;\n/**\n * @template T\n */\nvar ClrDatagridColumn = /** @class */ (function (_super) {\n    __extends(ClrDatagridColumn, _super);\n    function ClrDatagridColumn(_sort, filters, _dragDispatcher, vcr) {\n        var _this = _super.call(this, filters) || this;\n        _this._sort = _sort;\n        _this._dragDispatcher = _dragDispatcher;\n        _this.vcr = vcr;\n        // deprecated: to be removed - START\n        /**\n         * Indicates if the column is currently sorted\n         *\n         * @deprecated This will be removed soon, in favor of the sortOrder mechanism\n         */\n        _this._sorted = false;\n        /**\n         * @deprecated This will be removed soon, in favor of the sortOrder mechanism\n         */\n        _this.sortedChange = new EventEmitter();\n        // deprecated: to be removed - END\n        /**\n         * Indicates how the column is currently sorted\n         */\n        _this._sortOrder = ClrDatagridSortOrder.UNSORTED;\n        _this.sortOrderChange = new EventEmitter();\n        /**\n         * A custom filter for this column that can be provided in the projected content\n         */\n        _this.customFilter = false;\n        _this.filterValueChange = new EventEmitter();\n        _this._sortSubscription = _sort.change.subscribe(function (sort) {\n            // We're only listening to make sure we emit an event when the column goes from sorted to unsorted\n            if (_this.sortOrder !== ClrDatagridSortOrder.UNSORTED && sort.comparator !== _this._sortBy) {\n                _this._sortOrder = ClrDatagridSortOrder.UNSORTED;\n                _this.sortOrderChange.emit(_this._sortOrder);\n            }\n            // deprecated: to be removed - START\n            if (_this.sorted && sort.comparator !== _this._sortBy) {\n                _this._sorted = false;\n                _this.sortedChange.emit(false);\n            }\n            // deprecated: to be removed - END\n        });\n        _this.columnId = 'dg-col-' + nbCount.toString(); // Approximate a GUID\n        nbCount++;\n        return _this;\n    }\n    Object.defineProperty(ClrDatagridColumn.prototype, \"hidden\", {\n        /**\n         * @property hidden\n         *\n         * @description\n         * A property that allows the column to be hidden / shown with css\n         * Note the default allows the ClrDatagridColumn to have an *ngIf on it. (EHCAIWC - will occur if its not\n         * initialized)\n         *\n         * @default false\n         *\n         */\n        get: /**\n         * \\@property hidden\n         *\n         * \\@description\n         * A property that allows the column to be hidden / shown with css\n         * Note the default allows the ClrDatagridColumn to have an *ngIf on it. (EHCAIWC - will occur if its not\n         * initialized)\n         *\n         * \\@default false\n         *\n         * @return {?}\n         */\n        function () {\n            return !!this.hideable && this.hideable.hidden;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"handleElRef\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._dragDispatcher.handleRef = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"handleTrackerElRef\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._dragDispatcher.handleTrackerRef = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrDatagridColumn.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._sortSubscription.unsubscribe();\n    };\n    Object.defineProperty(ClrDatagridColumn.prototype, \"field\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._field;\n        },\n        set: /**\n         * @param {?} field\n         * @return {?}\n         */\n        function (field) {\n            if (typeof field === 'string') {\n                this._field = field;\n                if (!this.customFilter) {\n                    this.setFilter(new DatagridStringFilterImpl(new DatagridPropertyStringFilter(field)));\n                }\n                if (!this._sortBy) {\n                    this._sortBy = new DatagridPropertyComparator(field);\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"sortBy\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._sortBy;\n        },\n        set: /**\n         * @param {?} comparator\n         * @return {?}\n         */\n        function (comparator) {\n            if (typeof comparator === 'string') {\n                this._sortBy = new DatagridPropertyComparator(comparator);\n            }\n            else {\n                if (comparator) {\n                    this._sortBy = comparator;\n                }\n                else {\n                    if (this._field) {\n                        this._sortBy = new DatagridPropertyComparator(this._field);\n                    }\n                    else {\n                        delete this._sortBy;\n                    }\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"sortable\", {\n        /**\n         * Indicates if the column is sortable\n         */\n        get: /**\n         * Indicates if the column is sortable\n         * @return {?}\n         */\n        function () {\n            return !!this._sortBy;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"sorted\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._sorted;\n        },\n        /**\n         * @deprecated This will be removed soon, in favor of the sortOrder mechanism\n         */\n        set: /**\n         * @deprecated This will be removed soon, in favor of the sortOrder mechanism\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (!value && this.sorted) {\n                this._sorted = false;\n                this._sort.clear();\n            }\n            else if (value && !this.sorted) {\n                this.sort();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"sortOrder\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._sortOrder;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (typeof value === 'undefined') {\n                return;\n            }\n            // only if the incoming order is different from the current one\n            if (this._sortOrder === value) {\n                return;\n            }\n            switch (value) {\n                // the Unsorted case happens when the current state is either Asc or Desc\n                default:\n                case ClrDatagridSortOrder.UNSORTED:\n                    this._sort.clear();\n                    break;\n                case ClrDatagridSortOrder.ASC:\n                    this.sort(false);\n                    break;\n                case ClrDatagridSortOrder.DESC:\n                    this.sort(true);\n                    break;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"ariaSort\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            switch (this._sortOrder) {\n                default:\n                case ClrDatagridSortOrder.UNSORTED:\n                    return 'none';\n                case ClrDatagridSortOrder.ASC:\n                    return 'ascending';\n                case ClrDatagridSortOrder.DESC:\n                    return 'descending';\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Sorts the datagrid based on this column\n     */\n    /**\n     * Sorts the datagrid based on this column\n     * @param {?=} reverse\n     * @return {?}\n     */\n    ClrDatagridColumn.prototype.sort = /**\n     * Sorts the datagrid based on this column\n     * @param {?=} reverse\n     * @return {?}\n     */\n    function (reverse) {\n        if (!this.sortable) {\n            return;\n        }\n        this._sort.toggle(this._sortBy, reverse);\n        // setting the private variable to not retrigger the setter logic\n        this._sortOrder = this._sort.reverse ? ClrDatagridSortOrder.DESC : ClrDatagridSortOrder.ASC;\n        this.sortOrderChange.emit(this._sortOrder);\n        // deprecated: to be removed - START\n        this._sorted = true;\n        this.sortedChange.emit(true);\n        // deprecated: to be removed - END\n    };\n    Object.defineProperty(ClrDatagridColumn.prototype, \"asc\", {\n        /**\n         * Indicates if the column is currently sorted in ascending order\n         */\n        get: /**\n         * Indicates if the column is currently sorted in ascending order\n         * @return {?}\n         */\n        function () {\n            // deprecated: if condition to be removed - START\n            if (typeof this.sortOrder === 'undefined') {\n                return this.sorted && !this._sort.reverse;\n            }\n            else {\n                return this.sortOrder === ClrDatagridSortOrder.ASC;\n            }\n            // deprecated: if condition to be removed - END\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"desc\", {\n        /**\n         * Indicates if the column is currently sorted in descending order\n         */\n        get: /**\n         * Indicates if the column is currently sorted in descending order\n         * @return {?}\n         */\n        function () {\n            // deprecated: if condition to be removed - START\n            if (typeof this.sortOrder === 'undefined') {\n                return this.sorted && this._sort.reverse;\n            }\n            else {\n                return this.sortOrder === ClrDatagridSortOrder.DESC;\n            }\n            // deprecated: if condition to be removed - END\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"projectedFilter\", {\n        set: /**\n         * @param {?} custom\n         * @return {?}\n         */\n        function (custom) {\n            if (custom) {\n                this.deleteFilter();\n                this.customFilter = true;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"filterValue\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.filter.value;\n        },\n        set: /**\n         * @param {?} newValue\n         * @return {?}\n         */\n        function (newValue) {\n            this.updateFilterValue = newValue;\n            this.filterValueChange.emit(this.filter.value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridColumn.prototype, \"updateFilterValue\", {\n        set: /**\n         * @param {?} newValue\n         * @return {?}\n         */\n        function (newValue) {\n            if (!this.filter) {\n                return;\n            }\n            if (!newValue) {\n                newValue = '';\n            }\n            if (newValue !== this.filter.value) {\n                this.filter.value = newValue;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrDatagridColumn.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        this.wrappedInjector = new HostWrapper(WrappedColumn, this.vcr);\n    };\n    Object.defineProperty(ClrDatagridColumn.prototype, \"_view\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.wrappedInjector.get(WrappedColumn, this.vcr).columnView;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDatagridColumn.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-column',\n                    template: \"\\n        <div class=\\\"datagrid-column-flex\\\">\\n            <!-- I'm really not happy with that select since it's not very scalable -->\\n            <ng-content select=\\\"clr-dg-filter, clr-dg-string-filter\\\"></ng-content>\\n\\n            <clr-dg-string-filter\\n                    *ngIf=\\\"field && !customFilter\\\"\\n                    [clrDgStringFilter]=\\\"registered\\\"\\n                    [(clrFilterValue)]=\\\"filterValue\\\"></clr-dg-string-filter>\\n\\n            <ng-template #columnTitle>\\n                <ng-content></ng-content>\\n            </ng-template>\\n\\n            <button class=\\\"datagrid-column-title\\\" *ngIf=\\\"sortable\\\" (click)=\\\"sort()\\\" type=\\\"button\\\">\\n                <ng-container *ngTemplateOutlet=\\\"columnTitle\\\"></ng-container>\\n            </button>\\n\\n            <span class=\\\"datagrid-column-title\\\" *ngIf=\\\"!sortable\\\">\\n               <ng-container *ngTemplateOutlet=\\\"columnTitle\\\"></ng-container>\\n            </span>\\n\\n            <div class=\\\"datagrid-column-separator\\\">\\n                <button #columnHandle class=\\\"datagrid-column-handle\\\" tabindex=\\\"-1\\\" type=\\\"button\\\"></button>\\n                <div #columnHandleTracker class=\\\"datagrid-column-handle-tracker\\\"></div>\\n            </div>\\n        </div>\\n    \",\n                    host: {\n                        '[class.datagrid-column]': 'true',\n                        '[class.datagrid-column--hidden]': 'hidden',\n                        '[attr.aria-sort]': 'ariaSort',\n                        role: 'columnheader',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridColumn.ctorParameters = function () { return [\n        { type: Sort },\n        { type: FiltersProvider },\n        { type: DragDispatcher },\n        { type: ViewContainerRef }\n    ]; };\n    ClrDatagridColumn.propDecorators = {\n        handleElRef: [{ type: ViewChild, args: ['columnHandle',] }],\n        handleTrackerElRef: [{ type: ViewChild, args: ['columnHandleTracker',] }],\n        field: [{ type: Input, args: ['clrDgField',] }],\n        sortBy: [{ type: Input, args: ['clrDgSortBy',] }],\n        sorted: [{ type: Input, args: ['clrDgSorted',] }],\n        sortedChange: [{ type: Output, args: ['clrDgSortedChange',] }],\n        sortOrder: [{ type: Input, args: ['clrDgSortOrder',] }],\n        sortOrderChange: [{ type: Output, args: ['clrDgSortOrderChange',] }],\n        asc: [{ type: HostBinding, args: ['class.asc',] }],\n        desc: [{ type: HostBinding, args: ['class.desc',] }],\n        projectedFilter: [{ type: ContentChild, args: [CustomFilter,] }],\n        updateFilterValue: [{ type: Input, args: ['clrFilterValue',] }],\n        filterValueChange: [{ type: Output, args: ['clrFilterValueChange',] }]\n    };\n    return ClrDatagridColumn;\n}(DatagridFilterRegistrar));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar Items = /** @class */ (function () {\n    function Items(_filters, _sort, _page) {\n        this._filters = _filters;\n        this._sort = _sort;\n        this._page = _page;\n        /**\n         * Indicates if the data is currently loading\n         */\n        this.loading = false;\n        // TODO: Verify that trackBy is registered for the *ngFor case too\n        /**\n         * Tracking function to identify objects. Default is reference equality.\n         */\n        this.trackBy = function (index, item) { return item; };\n        /**\n         * Whether we should use smart items for this datagrid or let the user handle\n         * everything.\n         */\n        this._smart = false;\n        /**\n         * List of items currently displayed\n         */\n        this._displayed = [];\n        /**\n         * The Observable that lets other classes subscribe to items changes\n         */\n        this._change = new Subject();\n        this._allChanges = new Subject();\n    }\n    /**\n     * Cleans up our subscriptions to other providers\n     */\n    /**\n     * Cleans up our subscriptions to other providers\n     * @return {?}\n     */\n    Items.prototype.destroy = /**\n     * Cleans up our subscriptions to other providers\n     * @return {?}\n     */\n    function () {\n        if (this._filtersSub) {\n            this._filtersSub.unsubscribe();\n        }\n        if (this._sortSub) {\n            this._sortSub.unsubscribe();\n        }\n        if (this._pageSub) {\n            this._pageSub.unsubscribe();\n        }\n    };\n    Object.defineProperty(Items.prototype, \"smart\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._smart;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    Items.prototype.smartenUp = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this._smart = true;\n        /*\n             * These observers trigger a chain of function: filter -> sort -> paginate\n             * An observer up the chain re-triggers all the operations that follow it.\n             */\n        this._filtersSub = this._filters.change.subscribe(function () { return _this._filterItems(); });\n        this._sortSub = this._sort.change.subscribe(function () {\n            // Special case, if the datagrid went from sorted to unsorted, we have to re-filter\n            // to get the original order back\n            if (!_this._sort.comparator) {\n                _this._filterItems();\n            }\n            else {\n                _this._sortItems();\n            }\n        });\n        this._pageSub = this._page.change.subscribe(function () { return _this._changePage(); });\n    };\n    Object.defineProperty(Items.prototype, \"all\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._all;\n        },\n        set: /**\n         * @param {?} items\n         * @return {?}\n         */\n        function (items) {\n            this._all = items;\n            this.emitAllChanges(items);\n            if (this.smart) {\n                this._filterItems();\n            }\n            else {\n                this._displayed = items;\n                this.emitChange();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Manually recompute the list of displayed items\n     */\n    /**\n     * Manually recompute the list of displayed items\n     * @return {?}\n     */\n    Items.prototype.refresh = /**\n     * Manually recompute the list of displayed items\n     * @return {?}\n     */\n    function () {\n        if (this.smart) {\n            this._filterItems();\n        }\n    };\n    Object.defineProperty(Items.prototype, \"displayed\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            // Ideally we could return an immutable array, but we don't have it in Clarity yet.\n            return this._displayed;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    Items.prototype.emitChange = /**\n     * @return {?}\n     */\n    function () {\n        this._change.next(this.displayed);\n    };\n    Object.defineProperty(Items.prototype, \"change\", {\n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        get: \n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        /**\n         * @return {?}\n         */\n        function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} items\n     * @return {?}\n     */\n    Items.prototype.emitAllChanges = /**\n     * @param {?} items\n     * @return {?}\n     */\n    function (items) {\n        this._allChanges.next(items);\n    };\n    Object.defineProperty(Items.prototype, \"allChanges\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._allChanges.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Items.prototype, \"uninitialized\", {\n        /**\n         * Checks if we don't have data to process yet, to abort early operations\n         */\n        get: /**\n         * Checks if we don't have data to process yet, to abort early operations\n         * @return {?}\n         */\n        function () {\n            return !this._all;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * FiltersProvider items from the raw list\n     */\n    /**\n     * FiltersProvider items from the raw list\n     * @return {?}\n     */\n    Items.prototype._filterItems = /**\n     * FiltersProvider items from the raw list\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this.uninitialized) {\n            return;\n        }\n        if (this._filters.hasActiveFilters()) {\n            this._filtered = this._all.filter(function (item) { return _this._filters.accepts(item); });\n        }\n        else {\n            // Work on a shallow copy of the array, to not modify the user's model\n            this._filtered = this._all.slice();\n        }\n        this._page.totalItems = this._filtered.length;\n        this._sortItems();\n    };\n    /**\n     * Sorts items in the filtered list\n     */\n    /**\n     * Sorts items in the filtered list\n     * @return {?}\n     */\n    Items.prototype._sortItems = /**\n     * Sorts items in the filtered list\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this.uninitialized) {\n            return;\n        }\n        if (this._sort.comparator) {\n            this._filtered.sort(function (a, b) { return _this._sort.compare(a, b); });\n        }\n        this._changePage();\n    };\n    /**\n     * Extracts the current page from the sorted list\n     */\n    /**\n     * Extracts the current page from the sorted list\n     * @return {?}\n     */\n    Items.prototype._changePage = /**\n     * Extracts the current page from the sorted list\n     * @return {?}\n     */\n    function () {\n        if (this.uninitialized) {\n            return;\n        }\n        if (this._page.size > 0) {\n            this._displayed = this._filtered.slice(this._page.firstItem, this._page.lastItem + 1);\n        }\n        else {\n            this._displayed = this._filtered;\n        }\n        this.emitChange();\n    };\n    Items.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    Items.ctorParameters = function () { return [\n        { type: FiltersProvider },\n        { type: Sort },\n        { type: Page }\n    ]; };\n    return Items;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDatagridItems = /** @class */ (function () {\n    function ClrDatagridItems(template, differs, items, vcr) {\n        var _this = this;\n        this.template = template;\n        this.differs = differs;\n        this.items = items;\n        this.vcr = vcr;\n        this.differ = null;\n        this.subscriptions = [];\n        items.smartenUp();\n        this.iterableProxy = new NgForOf(this.vcr, this.template, this.differs);\n        this.subscriptions.push(items.change.subscribe(function (newItems) {\n            _this.iterableProxy.ngForOf = newItems;\n            _this.iterableProxy.ngDoCheck();\n        }));\n    }\n    Object.defineProperty(ClrDatagridItems.prototype, \"rawItems\", {\n        set: /**\n         * @param {?} items\n         * @return {?}\n         */\n        function (items) {\n            this._rawItems = items ? items : []; // local copy for ngOnChange diffing\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridItems.prototype, \"trackBy\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.iterableProxy.ngForTrackBy = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrDatagridItems.prototype.ngDoCheck = /**\n     * @return {?}\n     */\n    function () {\n        if (!this.differ) {\n            this.differ = this.differs.find(this._rawItems).create(this.iterableProxy.ngForTrackBy);\n        }\n        if (this.differ) {\n            /** @type {?} */\n            var changes = this.differ.diff(this._rawItems);\n            if (changes) {\n                // TODO: not very efficient right now,\n                // but premature optimization is the root of all evil.\n                this.items.all = this._rawItems;\n            }\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridItems.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrDatagridItems.decorators = [\n        { type: Directive, args: [{\n                    selector: '[clrDgItems][clrDgItemsOf]',\n                },] }\n    ];\n    /** @nocollapse */\n    ClrDatagridItems.ctorParameters = function () { return [\n        { type: TemplateRef },\n        { type: IterableDiffers },\n        { type: Items },\n        { type: ViewContainerRef }\n    ]; };\n    ClrDatagridItems.propDecorators = {\n        rawItems: [{ type: Input, args: ['clrDgItemsOf',] }],\n        trackBy: [{ type: Input, args: ['clrDgItemsTrackBy',] }]\n    };\n    return ClrDatagridItems;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDatagridPlaceholder = /** @class */ (function () {\n    function ClrDatagridPlaceholder(items) {\n        this.items = items;\n    }\n    Object.defineProperty(ClrDatagridPlaceholder.prototype, \"emptyDatagrid\", {\n        /**\n         * Tests if the datagrid is empty, meaning it doesn't contain any items\n         */\n        get: /**\n         * Tests if the datagrid is empty, meaning it doesn't contain any items\n         * @return {?}\n         */\n        function () {\n            return !this.items.loading && (!this.items.displayed || this.items.displayed.length === 0);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDatagridPlaceholder.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-placeholder',\n                    template: \"\\n        <div\\n            class=\\\"datagrid-placeholder\\\"\\n            [class.datagrid-empty]=\\\"emptyDatagrid\\\">\\n                <div class=\\\"datagrid-placeholder-image\\\" *ngIf=\\\"emptyDatagrid\\\"></div>\\n                <ng-content *ngIf=\\\"emptyDatagrid\\\"></ng-content>\\n        </div>\\n    \",\n                    host: { '[class.datagrid-placeholder-container]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridPlaceholder.ctorParameters = function () { return [\n        { type: Items }\n    ]; };\n    return ClrDatagridPlaceholder;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar POPOVER_HOST_ANCHOR = new InjectionToken('POPOVER_HOST_ANCHOR');\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrSignpostTrigger = /** @class */ (function () {\n    function ClrSignpostTrigger(ifOpenService, renderer, el) {\n        var _this = this;\n        this.ifOpenService = ifOpenService;\n        this.renderer = renderer;\n        this.el = el;\n        this.subscriptions = [];\n        this.subscriptions.push(this.ifOpenService.openChange.subscribe(function (isOpen) {\n            if (isOpen) {\n                _this.renderer.addClass(_this.el.nativeElement, 'active');\n            }\n            else {\n                _this.renderer.removeClass(_this.el.nativeElement, 'active');\n            }\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrSignpostTrigger.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**********\n     *\n     * @description\n     * click handler for the ClrSignpost trigger button used to hide/show ClrSignpostContent.\n     */\n    /**\n     * *******\n     *\n     * \\@description\n     * click handler for the ClrSignpost trigger button used to hide/show ClrSignpostContent.\n     * @param {?} event\n     * @return {?}\n     */\n    ClrSignpostTrigger.prototype.onSignpostTriggerClick = /**\n     * *******\n     *\n     * \\@description\n     * click handler for the ClrSignpost trigger button used to hide/show ClrSignpostContent.\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        this.ifOpenService.toggleWithEvent(event);\n    };\n    ClrSignpostTrigger.decorators = [\n        { type: Directive, args: [{ selector: '[clrSignpostTrigger]', host: { class: 'signpost-trigger' } },] }\n    ];\n    /** @nocollapse */\n    ClrSignpostTrigger.ctorParameters = function () { return [\n        { type: IfOpenService },\n        { type: Renderer2 },\n        { type: ElementRef }\n    ]; };\n    ClrSignpostTrigger.propDecorators = {\n        onSignpostTriggerClick: [{ type: HostListener, args: ['click', ['$event'],] }]\n    };\n    return ClrSignpostTrigger;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrSignpost = /** @class */ (function () {\n    function ClrSignpost(commonStrings) {\n        this.commonStrings = commonStrings;\n        /**\n         * *******\n         * \\@property useCustomTrigger\n         *\n         * \\@description\n         * Flag used to determine if we need to use the default trigger or a user supplied trigger element.\n         *\n         */\n        this.useCustomTrigger = false;\n    }\n    Object.defineProperty(ClrSignpost.prototype, \"customTrigger\", {\n        /**********\n         * @property signPostTrigger\n         *\n         * @description\n         * Uses ContentChild to check for a user supplied element with the ClrSignpostTrigger on it.\n         *\n         */\n        set: /**\n         * *******\n         * \\@property signPostTrigger\n         *\n         * \\@description\n         * Uses ContentChild to check for a user supplied element with the ClrSignpostTrigger on it.\n         *\n         * @param {?} trigger\n         * @return {?}\n         */\n        function (trigger$$1) {\n            this.useCustomTrigger = !!trigger$$1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrSignpost.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-signpost',\n                    template: \"\\n        <ng-container *ngIf=\\\"!useCustomTrigger\\\">\\n            <button\\n                type=\\\"button\\\"\\n                class=\\\"signpost-action btn btn-small btn-link\\\"\\n                clrSignpostTrigger>\\n                <clr-icon shape=\\\"info\\\" [attr.title]=\\\"commonStrings.info\\\"></clr-icon>\\n            </button>\\n        </ng-container>\\n        \\n        <ng-content></ng-content>\\n    \",\n                    host: { '[class.signpost]': 'true' },\n                    providers: [IfOpenService, { provide: POPOVER_HOST_ANCHOR, useExisting: ElementRef }]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrSignpost.ctorParameters = function () { return [\n        { type: ClrCommonStrings }\n    ]; };\n    ClrSignpost.propDecorators = {\n        customTrigger: [{ type: ContentChild, args: [ClrSignpostTrigger,] }]\n    };\n    return ClrSignpost;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n *\n * \\@description\n * An \\@Injectable provider class that enables\n *\n * 1. Managing, track hideability of DatagridColumns\n *\n */\nvar HideableColumnService = /** @class */ (function () {\n    function HideableColumnService() {\n        /**\n         * *******\n         * \\@property dgHiddenColumnMap\n         *\n         * \\@description\n         * An array of DatagridHideableColumn.\n         * NOTE: because we can have columns w/o the *clrDgHideableColumn directive\n         * this array will have empty spaces a.k.a nulls. This is needed to be able to map\n         * DatagridCells to DatagridColumns in the RowRenderer.\n         *\n         */\n        this._columnList = [];\n        /**\n         * *******\n         *\n         * \\@property dgHiddenColumnMapChange\n         *\n         * \\@description\n         * A behavior subject that can broadcast updates to the column list.\n         * NOTE: I am using BehaviorSubject because <clr-dg-column-toggle> is not getting the latest _columnListChange\n         * on page load.\n         *\n         */\n        this._columnListChange = new BehaviorSubject(this._columnList);\n    }\n    Object.defineProperty(HideableColumnService.prototype, \"canHideNextColumn\", {\n        /**********\n         *\n         * @property canHideNextColumn\n         *\n         * @description\n         * Service function that is called by clr-dg-column-toggle component. Use this if you need to ask if you can hide\n         * a column. It acts as a guard against hiding all the columns making sure there is at least one column displayed.\n         *\n         */\n        get: /**\n         * *******\n         *\n         * \\@property canHideNextColumn\n         *\n         * \\@description\n         * Service function that is called by clr-dg-column-toggle component. Use this if you need to ask if you can hide\n         * a column. It acts as a guard against hiding all the columns making sure there is at least one column displayed.\n         *\n         * @return {?}\n         */\n        function () {\n            /** @type {?} */\n            var hiddenColumns = this._columnList.filter(function (column) { return column !== undefined; }).filter(function (column) { return column.hidden; });\n            return this._columnList.length - hiddenColumns.length > 1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(HideableColumnService.prototype, \"checkForAllColumnsVisible\", {\n        /**********\n         *\n         * @property checkForAllColumnsVisible\n         *\n         * @description\n         * For when you need to know if the datagrid's columns are all showing.\n         *\n         */\n        get: /**\n         * *******\n         *\n         * \\@property checkForAllColumnsVisible\n         *\n         * \\@description\n         * For when you need to know if the datagrid's columns are all showing.\n         *\n         * @return {?}\n         */\n        function () {\n            return !this._columnList.some(function (column) { return column && column.hidden; });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(HideableColumnService.prototype, \"columnListChange\", {\n        /***********\n         * @property columnListChange\n         *\n         * @description\n         * A public property that enables subscribers to hear updates to the column map.\n         * Use this if you need to do something whenever the Datagrid's column list is changed (i.e *ngIf on a column).\n         *\n         */\n        get: /**\n         * ********\n         * \\@property columnListChange\n         *\n         * \\@description\n         * A public property that enables subscribers to hear updates to the column map.\n         * Use this if you need to do something whenever the Datagrid's column list is changed (i.e *ngIf on a column).\n         *\n         * @return {?}\n         */\n        function () {\n            return this._columnListChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**********\n     *\n     * @description\n     * Public function that returns the current list of columns. I needed an array of to iterate on in the RowRenderer\n     * but subscribing to the _columnListChange changes did not seem like the correct way to get it.\n     *\n     */\n    /**\n     * *******\n     *\n     * \\@description\n     * Public function that returns the current list of columns. I needed an array of to iterate on in the RowRenderer\n     * but subscribing to the _columnListChange changes did not seem like the correct way to get it.\n     *\n     * @return {?}\n     */\n    HideableColumnService.prototype.getColumns = /**\n     * *******\n     *\n     * \\@description\n     * Public function that returns the current list of columns. I needed an array of to iterate on in the RowRenderer\n     * but subscribing to the _columnListChange changes did not seem like the correct way to get it.\n     *\n     * @return {?}\n     */\n    function () {\n        return this._columnList;\n    };\n    /**********\n     *\n     * @description\n     * Iterate through the current _columnList:\n     * - if it has a DatagridHideableColumn and is hidden then show it.\n     * - if it's DatagridHideableColumn was previously the last column visible, turn that flag off.\n     *\n     */\n    /**\n     * *******\n     *\n     * \\@description\n     * Iterate through the current _columnList:\n     * - if it has a DatagridHideableColumn and is hidden then show it.\n     * - if it's DatagridHideableColumn was previously the last column visible, turn that flag off.\n     *\n     * @return {?}\n     */\n    HideableColumnService.prototype.showHiddenColumns = /**\n     * *******\n     *\n     * \\@description\n     * Iterate through the current _columnList:\n     * - if it has a DatagridHideableColumn and is hidden then show it.\n     * - if it's DatagridHideableColumn was previously the last column visible, turn that flag off.\n     *\n     * @return {?}\n     */\n    function () {\n        this._columnList.forEach(function (column) {\n            if (column && column.hidden === true) {\n                column.hidden = false;\n            }\n            if (column && column.lastVisibleColumn) {\n                column.lastVisibleColumn = false;\n            }\n        });\n    };\n    /**\n     *\n     * @param columns: DatagridColumn[]\n     *\n     * @description\n     * Creates an array of DatagridHideableColumn's || null based column array passed as param.\n     * Is dependent on the order in @ContentChildren in Datagrid.\n     *\n     */\n    /**\n     *\n     * \\@description\n     * Creates an array of DatagridHideableColumn's || null based column array passed as param.\n     * Is dependent on the order in \\@ContentChildren in Datagrid.\n     *\n     * @param {?} columns\n     * @return {?}\n     */\n    HideableColumnService.prototype.updateColumnList = /**\n     *\n     * \\@description\n     * Creates an array of DatagridHideableColumn's || null based column array passed as param.\n     * Is dependent on the order in \\@ContentChildren in Datagrid.\n     *\n     * @param {?} columns\n     * @return {?}\n     */\n    function (columns) {\n        this._columnList = columns; // clear the list\n        this.updateForLastVisibleColumn(); // Update our visibility state for UI\n        this._columnListChange.next(this._columnList); // Broadcast it\n    };\n    /**********\n     *\n     * @description\n     * Gets the current visible count for all columns.\n     * When it is greater than 1 it marks everything as false for the lastVisibleColumn.\n     * When visible count is not > 1 (i.e) 1. , it finds the only column that is not hidden and marks it as the\n     * lastVisibleColumn.\n     *\n     */\n    /**\n     * *******\n     *\n     * \\@description\n     * Gets the current visible count for all columns.\n     * When it is greater than 1 it marks everything as false for the lastVisibleColumn.\n     * When visible count is not > 1 (i.e) 1. , it finds the only column that is not hidden and marks it as the\n     * lastVisibleColumn.\n     *\n     * @return {?}\n     */\n    HideableColumnService.prototype.updateForLastVisibleColumn = /**\n     * *******\n     *\n     * \\@description\n     * Gets the current visible count for all columns.\n     * When it is greater than 1 it marks everything as false for the lastVisibleColumn.\n     * When visible count is not > 1 (i.e) 1. , it finds the only column that is not hidden and marks it as the\n     * lastVisibleColumn.\n     *\n     * @return {?}\n     */\n    function () {\n        // There is more than one column showing, make sure nothing is marked lastVisibleColumn\n        if (this.canHideNextColumn) {\n            this._columnList.map(function (column) {\n                if (column && column.lastVisibleColumn) {\n                    column.lastVisibleColumn = false;\n                }\n            });\n        }\n        else {\n            // The visibleCount is down to only one column showing. Find it and flag it as the lastVisibleColumn\n            this._columnList.map(function (column) {\n                if (column && !column.hidden) {\n                    column.lastVisibleColumn = true;\n                }\n            });\n        }\n    };\n    /**********\n     *\n     * @description\n     * Return a HideableColumn in this._columnList for the given id.\n     *\n     *\n     */\n    /**\n     * *******\n     *\n     * \\@description\n     * Return a HideableColumn in this._columnList for the given id.\n     *\n     *\n     * @param {?} id\n     * @return {?}\n     */\n    HideableColumnService.prototype.getColumnById = /**\n     * *******\n     *\n     * \\@description\n     * Return a HideableColumn in this._columnList for the given id.\n     *\n     *\n     * @param {?} id\n     * @return {?}\n     */\n    function (id) {\n        if (id) {\n            return this._columnList.find(function (column) { return column && column.id === id; });\n        }\n        return;\n    };\n    HideableColumnService.decorators = [\n        { type: Injectable }\n    ];\n    return HideableColumnService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar WrappedCell = /** @class */ (function () {\n    function WrappedCell() {\n        this._dynamic = false;\n    }\n    // the cells projected view\n    /**\n     * @return {?}\n     */\n    WrappedCell.prototype.ngAfterViewInit = \n    // the cells projected view\n    /**\n     * @return {?}\n     */\n    function () {\n        this.cellView = this.templateRef.createEmbeddedView(null);\n    };\n    WrappedCell.decorators = [\n        { type: Component, args: [{\n                    selector: 'dg-wrapped-cell',\n                    template: \"        \\n        <ng-template #cellPortal>\\n            <ng-content></ng-content>\\n        </ng-template>\\n    \"\n                }] }\n    ];\n    WrappedCell.propDecorators = {\n        templateRef: [{ type: ViewChild, args: ['cellPortal',] }]\n    };\n    return WrappedCell;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridCell = /** @class */ (function () {\n    function ClrDatagridCell(hideableColumnService, _el, _renderer, vcr) {\n        this.hideableColumnService = hideableColumnService;\n        this._el = _el;\n        this._renderer = _renderer;\n        this.vcr = vcr;\n    }\n    Object.defineProperty(ClrDatagridCell.prototype, \"id\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._id = value;\n            this.mapHideableColumn(this._id);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} columnId\n     * @return {?}\n     */\n    ClrDatagridCell.prototype.mapHideableColumn = /**\n     * @param {?} columnId\n     * @return {?}\n     */\n    function (columnId) {\n        var _this = this;\n        if (!columnId) {\n            return;\n        }\n        /** @type {?} */\n        var hideableColumn = this.hideableColumnService.getColumnById(this._id);\n        this.setHiddenClass(hideableColumn.hidden);\n        this.hiddenStateSubscription = hideableColumn.hiddenChangeState.subscribe(function () {\n            _this.setHiddenClass(hideableColumn.hidden);\n        });\n    };\n    /**\n     * @param {?} hideableColumnValue\n     * @return {?}\n     */\n    ClrDatagridCell.prototype.setHiddenClass = /**\n     * @param {?} hideableColumnValue\n     * @return {?}\n     */\n    function (hideableColumnValue) {\n        if (hideableColumnValue) {\n            this._renderer.addClass(this._el.nativeElement, 'datagrid-cell--hidden');\n        }\n        else {\n            this._renderer.removeClass(this._el.nativeElement, 'datagrid-cell--hidden');\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridCell.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        this.wrappedInjector = new HostWrapper(WrappedCell, this.vcr);\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridCell.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.hiddenStateSubscription) {\n            this.hiddenStateSubscription.unsubscribe();\n        }\n    };\n    Object.defineProperty(ClrDatagridCell.prototype, \"_view\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.wrappedInjector.get(WrappedCell, this.vcr).cellView;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDatagridCell.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-cell',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    host: {\n                        '[class.datagrid-cell]': 'true',\n                        '[class.datagrid-signpost-trigger]': 'signpost.length > 0',\n                        role: 'cell',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridCell.ctorParameters = function () { return [\n        { type: HideableColumnService },\n        { type: ElementRef },\n        { type: Renderer2 },\n        { type: ViewContainerRef }\n    ]; };\n    ClrDatagridCell.propDecorators = {\n        signpost: [{ type: ContentChildren, args: [ClrSignpost,] }]\n    };\n    return ClrDatagridCell;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/** @enum {number} */\nvar DatagridDisplayMode = {\n    DISPLAY: 0,\n    CALCULATE: 1,\n};\nDatagridDisplayMode[DatagridDisplayMode.DISPLAY] = 'DISPLAY';\nDatagridDisplayMode[DatagridDisplayMode.CALCULATE] = 'CALCULATE';\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/** @enum {number} */\nvar DatagridRenderStep = {\n    ALIGN_COLUMNS: 0,\n    CALCULATE_MODE_ON: 1,\n    CALCULATE_MODE_OFF: 2,\n    CLEAR_WIDTHS: 3,\n    COMPUTE_COLUMN_WIDTHS: 4,\n    DETECT_STRICT_WIDTHS: 5,\n};\nDatagridRenderStep[DatagridRenderStep.ALIGN_COLUMNS] = 'ALIGN_COLUMNS';\nDatagridRenderStep[DatagridRenderStep.CALCULATE_MODE_ON] = 'CALCULATE_MODE_ON';\nDatagridRenderStep[DatagridRenderStep.CALCULATE_MODE_OFF] = 'CALCULATE_MODE_OFF';\nDatagridRenderStep[DatagridRenderStep.CLEAR_WIDTHS] = 'CLEAR_WIDTHS';\nDatagridRenderStep[DatagridRenderStep.COMPUTE_COLUMN_WIDTHS] = 'COMPUTE_COLUMN_WIDTHS';\nDatagridRenderStep[DatagridRenderStep.DETECT_STRICT_WIDTHS] = 'DETECT_STRICT_WIDTHS';\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatagridRenderOrganizer = /** @class */ (function () {\n    function DatagridRenderOrganizer() {\n        this._renderStep = new Subject();\n        this.alreadySized = false;\n        this.widths = [];\n    }\n    Object.defineProperty(DatagridRenderOrganizer.prototype, \"renderStep\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._renderStep.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} step\n     * @return {?}\n     */\n    DatagridRenderOrganizer.prototype.filterRenderSteps = /**\n     * @param {?} step\n     * @return {?}\n     */\n    function (step) {\n        return this.renderStep.pipe(filter(function (testStep) { return step === testStep; }));\n    };\n    /**\n     * @return {?}\n     */\n    DatagridRenderOrganizer.prototype.resize = /**\n     * @return {?}\n     */\n    function () {\n        this.widths.length = 0;\n        this._renderStep.next(DatagridRenderStep.CALCULATE_MODE_ON);\n        if (this.alreadySized) {\n            this._renderStep.next(DatagridRenderStep.CLEAR_WIDTHS);\n        }\n        this._renderStep.next(DatagridRenderStep.DETECT_STRICT_WIDTHS);\n        this._renderStep.next(DatagridRenderStep.COMPUTE_COLUMN_WIDTHS);\n        this._renderStep.next(DatagridRenderStep.ALIGN_COLUMNS);\n        this.alreadySized = true;\n        this._renderStep.next(DatagridRenderStep.CALCULATE_MODE_OFF);\n    };\n    DatagridRenderOrganizer.decorators = [\n        { type: Injectable }\n    ];\n    return DatagridRenderOrganizer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DisplayModeService = /** @class */ (function () {\n    function DisplayModeService(renderOrganizer) {\n        var _this = this;\n        this.subscriptions = [];\n        this._view = new BehaviorSubject(DatagridDisplayMode.DISPLAY);\n        this.subscriptions.push(renderOrganizer\n            .filterRenderSteps(DatagridRenderStep.CALCULATE_MODE_ON)\n            .subscribe(function () { return _this._view.next(DatagridDisplayMode.CALCULATE); }));\n        this.subscriptions.push(renderOrganizer\n            .filterRenderSteps(DatagridRenderStep.CALCULATE_MODE_OFF)\n            .subscribe(function () { return _this._view.next(DatagridDisplayMode.DISPLAY); }));\n    }\n    Object.defineProperty(DisplayModeService.prototype, \"view\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._view.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    DisplayModeService.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    DisplayModeService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DisplayModeService.ctorParameters = function () { return [\n        { type: DatagridRenderOrganizer }\n    ]; };\n    return DisplayModeService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar nbSelection = 0;\n/** @enum {number} */\nvar SelectionType = {\n    None: 0,\n    Single: 1,\n    Multi: 2,\n};\nSelectionType[SelectionType.None] = 'None';\nSelectionType[SelectionType.Single] = 'Single';\nSelectionType[SelectionType.Multi] = 'Multi';\n/**\n * @template T\n */\nvar Selection = /** @class */ (function () {\n    function Selection(_items, _filters) {\n        var _this = this;\n        this._items = _items;\n        this._filters = _filters;\n        this.prevSelectionRefs = []; // Refs of selected items\n        this._selectionType = SelectionType.None;\n        this.rowSelectionMode = false;\n        /**\n         * Ignore items changes in the same change detection cycle.\n         */\n        // tslint:disable-next-line\n        this.debounce = false;\n        /**\n         * Subscriptions to the other providers changes.\n         */\n        this.subscriptions = [];\n        /**\n         * The Observable that lets other classes subscribe to selection changes\n         */\n        this._change = new Subject();\n        this.id = 'clr-dg-selection' + nbSelection++;\n        this.subscriptions.push(this._filters.change.subscribe(function () {\n            if (!_this._selectable) {\n                return;\n            }\n            _this.clearSelection();\n        }));\n        this.subscriptions.push(this._items.allChanges.subscribe(function (updatedItems) {\n            switch (_this.selectionType) {\n                case SelectionType.None: {\n                    break;\n                }\n                case SelectionType.Single: {\n                    /** @type {?} */\n                    var newSingle_1;\n                    /** @type {?} */\n                    var trackBy_1 = _this._items.trackBy;\n                    /** @type {?} */\n                    var selectionUpdated_1 = false;\n                    // if the currentSingle has been set before data was loaded, we look up and save the ref from current data set\n                    if (_this.currentSingle && !_this.prevSingleSelectionRef) {\n                        if (_this._items.all && _this._items.trackBy) {\n                            /** @type {?} */\n                            var lookup = _this._items.all.findIndex(function (maybe) { return maybe === _this.currentSingle; });\n                            _this.prevSingleSelectionRef = _this._items.trackBy(lookup, _this.currentSingle);\n                        }\n                    }\n                    updatedItems.forEach(function (item, index) {\n                        /** @type {?} */\n                        var ref = trackBy_1(index, item);\n                        // If one of the updated items is the previously selectedSingle, set it as the new one\n                        if (_this.prevSingleSelectionRef === ref) {\n                            newSingle_1 = item;\n                            selectionUpdated_1 = true;\n                        }\n                    });\n                    // If we're using smart datagrids, we expect all items to be present in the updatedItems array.\n                    // Therefore, we should delete the currentSingle if it used to be defined but doesn't exist anymore.\n                    // No explicit \"delete\" is required, since newSingle would be undefined at this point.\n                    // Marking it as selectionUpdated here will set currentSingle to undefined below in the setTimeout.\n                    if (_this._items.smart && !newSingle_1) {\n                        selectionUpdated_1 = true;\n                    }\n                    // TODO: Discussed this with Eudes and this is fine for now.\n                    // But we need to figure out a different pattern for the\n                    // child triggering the parent change detection problem.\n                    // Using setTimeout for now to fix this.\n                    setTimeout(function () {\n                        if (selectionUpdated_1) {\n                            _this.currentSingle = newSingle_1;\n                        }\n                    }, 0);\n                    break;\n                }\n                case SelectionType.Multi: {\n                    /** @type {?} */\n                    var leftOver_1 = _this.current.slice();\n                    /** @type {?} */\n                    var trackBy_2 = _this._items.trackBy;\n                    /** @type {?} */\n                    var selectionUpdated_2 = false;\n                    // if the current has been set before data was loaded, we look up and save the ref from current data set\n                    if (_this.current.length > 0 && _this.prevSelectionRefs.length !== _this.current.length) {\n                        if (_this._items.all && _this._items.trackBy) {\n                            _this.prevSelectionRefs = [];\n                            _this.current.forEach(function (item) {\n                                /** @type {?} */\n                                var lookup = _this._items.all.findIndex(function (maybe) { return maybe === item; });\n                                _this.prevSelectionRefs.push(_this._items.trackBy(lookup, item));\n                            });\n                        }\n                    }\n                    // TODO: revisit this when we work on https://github.com/vmware/clarity/issues/2342\n                    // currently, the selection is cleared when filter is applied, so the logic inside\n                    // the if statement below results in broken behavior.\n                    if (leftOver_1.length > 0) {\n                        updatedItems.forEach(function (item, index) {\n                            /** @type {?} */\n                            var ref = trackBy_2(index, item);\n                            // Look in current selected refs array if item is selected, and update actual value\n                            /** @type {?} */\n                            var selectedIndex = _this.prevSelectionRefs.indexOf(ref);\n                            if (selectedIndex > -1) {\n                                leftOver_1[selectedIndex] = item;\n                                selectionUpdated_2 = true;\n                            }\n                        });\n                        // Filter out any unmatched items if we're using smart datagrids where we expect all items to be\n                        // present\n                        if (_this._items.smart) {\n                            leftOver_1 = leftOver_1.filter(function (selected) { return updatedItems.indexOf(selected) > -1; });\n                            if (_this.current.length !== leftOver_1.length) {\n                                selectionUpdated_2 = true;\n                            }\n                        }\n                        // TODO: Discussed this with Eudes and this is fine for now.\n                        // But we need to figure out a different pattern for the\n                        // child triggering the parent change detection problem.\n                        // Using setTimeout for now to fix this.\n                        setTimeout(function () {\n                            if (selectionUpdated_2) {\n                                _this.current = leftOver_1;\n                            }\n                        }, 0);\n                    }\n                    break;\n                }\n                default: {\n                    break;\n                }\n            }\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    Selection.prototype.clearSelection = /**\n     * @return {?}\n     */\n    function () {\n        this.current.length = 0;\n        this.prevSelectionRefs = [];\n        this.emitChange();\n    };\n    Object.defineProperty(Selection.prototype, \"selectionType\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._selectionType;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value === this.selectionType) {\n                return;\n            }\n            this._selectionType = value;\n            if (value === SelectionType.None) {\n                delete this.current;\n            }\n            else {\n                this.updateCurrent([], false);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Selection.prototype, \"_selectable\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._selectionType === SelectionType.Multi || this._selectionType === SelectionType.Single;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Cleans up our subscriptions to other providers\n     */\n    /**\n     * Cleans up our subscriptions to other providers\n     * @return {?}\n     */\n    Selection.prototype.destroy = /**\n     * Cleans up our subscriptions to other providers\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    Object.defineProperty(Selection.prototype, \"currentSingle\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._currentSingle;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            var _this = this;\n            if (value === this._currentSingle) {\n                return;\n            }\n            this._currentSingle = value;\n            if (this._items.all && this._items.trackBy && value) {\n                /** @type {?} */\n                var lookup = this._items.all.findIndex(function (maybe) { return maybe === value; });\n                this.prevSingleSelectionRef = this._items.trackBy(lookup, value);\n            }\n            this.emitChange();\n            // Ignore items changes in the same change detection cycle.\n            // @TODO This can likely be removed!\n            this.debounce = true;\n            setTimeout(function () { return (_this.debounce = false); });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Selection.prototype, \"current\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._current;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.updateCurrent(value, true);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} value\n     * @param {?} emit\n     * @return {?}\n     */\n    Selection.prototype.updateCurrent = /**\n     * @param {?} value\n     * @param {?} emit\n     * @return {?}\n     */\n    function (value, emit) {\n        var _this = this;\n        this._current = value;\n        if (emit) {\n            this.emitChange();\n            // Ignore items changes in the same change detection cycle.\n            // @TODO This can likely be removed!\n            this.debounce = true;\n            setTimeout(function () { return (_this.debounce = false); });\n        }\n    };\n    /**\n     * @return {?}\n     */\n    Selection.prototype.emitChange = /**\n     * @return {?}\n     */\n    function () {\n        if (this._selectionType === SelectionType.Single) {\n            this._change.next(this.currentSingle);\n        }\n        else if (this._selectionType === SelectionType.Multi) {\n            this._change.next(this.current);\n        }\n    };\n    Object.defineProperty(Selection.prototype, \"change\", {\n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        get: \n        // We do not want to expose the Subject itself, but the Observable which is read-only\n        /**\n         * @return {?}\n         */\n        function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Checks if an item is currently selected\n     */\n    /**\n     * Checks if an item is currently selected\n     * @param {?} item\n     * @return {?}\n     */\n    Selection.prototype.isSelected = /**\n     * Checks if an item is currently selected\n     * @param {?} item\n     * @return {?}\n     */\n    function (item) {\n        if (this._selectionType === SelectionType.Single) {\n            return this.currentSingle === item;\n        }\n        else if (this._selectionType === SelectionType.Multi) {\n            return this.current.indexOf(item) >= 0;\n        }\n        return false;\n    };\n    /**\n     * Selects an item\n     */\n    /**\n     * Selects an item\n     * @param {?} item\n     * @return {?}\n     */\n    Selection.prototype.selectItem = /**\n     * Selects an item\n     * @param {?} item\n     * @return {?}\n     */\n    function (item) {\n        this.current.push(item);\n        if (this._items.trackBy) {\n            // Push selected ref onto array\n            /** @type {?} */\n            var lookup = this._items.all.findIndex(function (maybe) { return maybe === item; });\n            this.prevSelectionRefs.push(this._items.trackBy(lookup, item));\n        }\n    };\n    /**\n     * Deselects an item\n     */\n    /**\n     * Deselects an item\n     * @param {?} indexOfItem\n     * @return {?}\n     */\n    Selection.prototype.deselectItem = /**\n     * Deselects an item\n     * @param {?} indexOfItem\n     * @return {?}\n     */\n    function (indexOfItem) {\n        this.current.splice(indexOfItem, 1);\n        if (this._items.trackBy && indexOfItem < this.prevSelectionRefs.length) {\n            // Keep selected refs array in sync\n            this.prevSelectionRefs.splice(indexOfItem, 1);\n        }\n    };\n    /**\n     * Selects or deselects an item\n     */\n    /**\n     * Selects or deselects an item\n     * @param {?} item\n     * @param {?} selected\n     * @return {?}\n     */\n    Selection.prototype.setSelected = /**\n     * Selects or deselects an item\n     * @param {?} item\n     * @param {?} selected\n     * @return {?}\n     */\n    function (item, selected) {\n        switch (this._selectionType) {\n            case SelectionType.None:\n                break;\n            case SelectionType.Single:\n                // in single selection, set currentSingle method should be used\n                break;\n            case SelectionType.Multi:\n                /** @type {?} */\n                var index = this.current.indexOf(item);\n                if (index >= 0 && !selected) {\n                    this.deselectItem(index);\n                    this.emitChange();\n                }\n                else if (index < 0 && selected) {\n                    this.selectItem(item);\n                    this.emitChange();\n                }\n                break;\n            default:\n                break;\n        }\n    };\n    /**\n     * Checks if all currently displayed items are selected\n     */\n    /**\n     * Checks if all currently displayed items are selected\n     * @return {?}\n     */\n    Selection.prototype.isAllSelected = /**\n     * Checks if all currently displayed items are selected\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this._selectionType !== SelectionType.Multi || !this._items.displayed) {\n            return false;\n        }\n        /** @type {?} */\n        var displayedItems = this._items.displayed;\n        /** @type {?} */\n        var nbDisplayed = this._items.displayed.length;\n        if (nbDisplayed < 1) {\n            return false;\n        }\n        /** @type {?} */\n        var temp = displayedItems.filter(function (item) { return _this.current.indexOf(item) > -1; });\n        return temp.length === displayedItems.length;\n    };\n    /**\n     * Selects or deselects all currently displayed items\n     */\n    /**\n     * Selects or deselects all currently displayed items\n     * @return {?}\n     */\n    Selection.prototype.toggleAll = /**\n     * Selects or deselects all currently displayed items\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this._selectionType === SelectionType.None || this._selectionType === SelectionType.Single) {\n            return;\n        }\n        /*\n             * If every currently displayed item is already selected, we clear them.\n             * If at least one item isn't selected, we select every currently displayed item.\n             */\n        if (this.isAllSelected()) {\n            this._items.displayed.forEach(function (item) {\n                /** @type {?} */\n                var currentIndex = _this.current.indexOf(item);\n                if (currentIndex > -1) {\n                    _this.deselectItem(currentIndex);\n                }\n            });\n        }\n        else {\n            this._items.displayed.forEach(function (item) {\n                if (_this.current.indexOf(item) < 0) {\n                    _this.selectItem(item);\n                }\n            });\n        }\n        this.emitChange();\n    };\n    Selection.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    Selection.ctorParameters = function () { return [\n        { type: Items },\n        { type: FiltersProvider }\n    ]; };\n    return Selection;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar WrappedRow = /** @class */ (function () {\n    function WrappedRow() {\n        this._dynamic = false;\n    }\n    // the rows projected view (in memory)\n    /**\n     * @return {?}\n     */\n    WrappedRow.prototype.ngAfterViewInit = \n    // the rows projected view (in memory)\n    /**\n     * @return {?}\n     */\n    function () {\n        // Create the cells view in memory, not the DOM.\n        this.rowView = this.templateRef.createEmbeddedView(null);\n    };\n    WrappedRow.decorators = [\n        { type: Component, args: [{\n                    selector: 'dg-wrapped-row',\n                    template: \"        \\n        <ng-template #rowPortal>\\n            <ng-content></ng-content>\\n        </ng-template>\\n    \"\n                }] }\n    ];\n    WrappedRow.propDecorators = {\n        templateRef: [{ type: ViewChild, args: ['rowPortal',] }]\n    };\n    return WrappedRow;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar nbRow = 0;\n/**\n * @template T\n */\nvar ClrDatagridRow = /** @class */ (function () {\n    function ClrDatagridRow(selection, rowActionService, globalExpandable, expand, hideableColumnService, displayMode, vcr, renderer, el, commonStrings) {\n        var _this = this;\n        this.selection = selection;\n        this.rowActionService = rowActionService;\n        this.globalExpandable = globalExpandable;\n        this.expand = expand;\n        this.hideableColumnService = hideableColumnService;\n        this.displayMode = displayMode;\n        this.vcr = vcr;\n        this.renderer = renderer;\n        this.el = el;\n        this.commonStrings = commonStrings;\n        /* reference to the enum so that template can access */\n        this.SELECTION_TYPE = SelectionType;\n        this._selected = false;\n        this.selectedChanged = new EventEmitter(false);\n        this.expandedChange = new EventEmitter(false);\n        this.subscriptions = [];\n        this.displayCells = false;\n        nbRow++;\n        this.id = 'clr-dg-row' + nbRow;\n        this.radioId = 'clr-dg-row-rd' + nbRow;\n        this.checkboxId = 'clr-dg-row-cb' + nbRow;\n        this.subscriptions.push(combineLatest(this.expand.replace, this.expand.expandChange).subscribe(function (_a) {\n            var _b = __read(_a, 2), expandReplaceValue = _b[0], expandChangeValue = _b[1];\n            if (expandReplaceValue && expandChangeValue) {\n                // replaced and expanding\n                _this.replaced = true;\n                _this.renderer.addClass(_this.el.nativeElement, 'datagrid-row-replaced');\n            }\n            else {\n                _this.replaced = false;\n                // Handles these cases: not replaced and collapsing & replaced and\n                // collapsing and not replaced and expanding.\n                _this.renderer.removeClass(_this.el.nativeElement, 'datagrid-row-replaced');\n            }\n        }));\n    }\n    Object.defineProperty(ClrDatagridRow.prototype, \"selected\", {\n        /**\n         * Indicates if the row is selected\n         */\n        get: /**\n         * Indicates if the row is selected\n         * @return {?}\n         */\n        function () {\n            if (this.selection.selectionType === SelectionType.None) {\n                return this._selected;\n            }\n            else {\n                return this.selection.isSelected(this.item);\n            }\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this.selection.selectionType === SelectionType.None) {\n                this._selected = value;\n            }\n            else {\n                this.selection.setSelected(this.item, value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?=} selected\n     * @return {?}\n     */\n    ClrDatagridRow.prototype.toggle = /**\n     * @param {?=} selected\n     * @return {?}\n     */\n    function (selected) {\n        if (selected === void 0) { selected = !this.selected; }\n        if (selected !== this.selected) {\n            this.selected = selected;\n            this.selectedChanged.emit(selected);\n        }\n    };\n    Object.defineProperty(ClrDatagridRow.prototype, \"expanded\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.expand.expanded;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.expand.expanded = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrDatagridRow.prototype.toggleExpand = /**\n     * @return {?}\n     */\n    function () {\n        if (this.expand.expandable) {\n            this.expanded = !this.expanded;\n            this.expandedChange.emit(this.expanded);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridRow.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        // Make sure things get started\n        /** @type {?} */\n        var columnsList = this.hideableColumnService.getColumns();\n        this.updateCellsForColumns(columnsList);\n        // Triggered when the Cells list changes per row-renderer\n        this.dgCells.changes.subscribe(function (cellList) {\n            /** @type {?} */\n            var columnList = _this.hideableColumnService.getColumns();\n            if (cellList.length === columnList.length) {\n                _this.updateCellsForColumns(columnList);\n            }\n        });\n        // Used to set things up the first time but only after all the columns are ready.\n        this.subscriptions.push(this.hideableColumnService.columnListChange.subscribe(function (columnList) {\n            // Prevents cell updates when cols and cells array are not aligned - only seems to run on init / first time.\n            if (columnList.length === _this.dgCells.length) {\n                _this.updateCellsForColumns(columnList);\n            }\n        }));\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridRow.prototype.ngAfterViewInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.subscriptions.push(this.displayMode.view.subscribe(function (viewChange) {\n            // Listen for view changes and move cells around depending on the current displayType\n            // remove cell views from display view\n            for (var i = _this._scrollableCells.length; i > 0; i--) {\n                _this._scrollableCells.detach();\n            }\n            // remove cell views from calculated view\n            for (var i = _this._calculatedCells.length; i > 0; i--) {\n                _this._calculatedCells.detach();\n            }\n            if (viewChange === DatagridDisplayMode.CALCULATE) {\n                _this.displayCells = false;\n                _this.dgCells.forEach(function (cell) {\n                    _this._calculatedCells.insert(cell._view);\n                });\n            }\n            else {\n                _this.displayCells = true;\n                _this.dgCells.forEach(function (cell) {\n                    _this._scrollableCells.insert(cell._view);\n                });\n            }\n        }));\n    };\n    /**********\n     *\n     * @description\n     * 1. Maps the new columnListChange to the dgCells list by index\n     * 2. Sets the hidden state on the cell\n     * Take a Column list and use index to access the columns for hideable properties.\n     *\n     */\n    /**\n     * *******\n     *\n     * \\@description\n     * 1. Maps the new columnListChange to the dgCells list by index\n     * 2. Sets the hidden state on the cell\n     * Take a Column list and use index to access the columns for hideable properties.\n     *\n     * @param {?} columnList\n     * @return {?}\n     */\n    ClrDatagridRow.prototype.updateCellsForColumns = /**\n     * *******\n     *\n     * \\@description\n     * 1. Maps the new columnListChange to the dgCells list by index\n     * 2. Sets the hidden state on the cell\n     * Take a Column list and use index to access the columns for hideable properties.\n     *\n     * @param {?} columnList\n     * @return {?}\n     */\n    function (columnList) {\n        // Map cells to columns with Array.index\n        this.dgCells.forEach(function (cell, index) {\n            /** @type {?} */\n            var currentColumn = columnList[index];\n            if (currentColumn) {\n                cell.id = currentColumn.id;\n            }\n        });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridRow.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridRow.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        this.wrappedInjector = new HostWrapper(WrappedRow, this.vcr);\n    };\n    Object.defineProperty(ClrDatagridRow.prototype, \"_view\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.wrappedInjector.get(WrappedRow, this.vcr).rowView;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDatagridRow.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-row',\n                    template: \"<!--\\n  We need to wrap the #rowContent in label element if we are in rowSelectionMode.\\n  Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\\n-->\\n<label class=\\\"datagrid-row-clickable\\\" *ngIf=\\\"selection.rowSelectionMode\\\">\\n  <ng-template [ngTemplateOutlet]=\\\"rowContent\\\"></ng-template>\\n</label>\\n\\n<ng-template *ngIf=\\\"!selection.rowSelectionMode\\\" [ngTemplateOutlet]=\\\"rowContent\\\"></ng-template>\\n\\n<!--\\n    We need the \\\"project into template\\\" hacks because we need this in 2 different places\\n    depending on whether the details replace the row or not.\\n-->\\n<ng-template #detail>\\n  <ng-content select=\\\"clr-dg-row-detail\\\"></ng-content>\\n</ng-template>\\n\\n<ng-template #rowContent>\\n  <div role=\\\"row\\\" [id]=\\\"id\\\" class=\\\"datagrid-row-master datagrid-row-flex\\\">\\n    <div class=\\\"datagrid-row-sticky\\\">\\n      <!-- Sticky elements here -->\\n      <ng-container #stickyCells></ng-container> <!-- placeholder for projecting other sticky cells as pinned-->\\n    </div>\\n    <div class=\\\"datagrid-row-scrollable\\\" [ngClass]=\\\"{'is-replaced': replaced && expanded}\\\">\\n      <div class=\\\"datagrid-scrolling-cells\\\">\\n        <div *ngIf=\\\"selection.selectionType === SELECTION_TYPE.Multi\\\"\\n             class=\\\"datagrid-select datagrid-fixed-column datagrid-cell\\\">\\n          <input clrCheckbox type=\\\"checkbox\\\" [ngModel]=\\\"selected\\\" (ngModelChange)=\\\"toggle($event)\\\" [id]=\\\"checkboxId\\\"\\n                 [attr.aria-label]=\\\"commonStrings.select\\\">\\n        </div>\\n        <div *ngIf=\\\"selection.selectionType === SELECTION_TYPE.Single\\\"\\n             class=\\\"datagrid-select datagrid-fixed-column datagrid-cell\\\">\\n            <!-- TODO: it would be better if in addition to the generic \\\"Select\\\" label, we could add aria-labelledby\\n            to label the radio by the first cell in the row (typically an id or name).\\n            It's pretty easy to label it with the whole row since we already have an id for it, but in most\\n            cases the row is far too long to serve as a label, the screenreader reads every single cell content. -->\\n            <input type=\\\"radio\\\" clrRadio [id]=\\\"radioId\\\" [name]=\\\"selection.id + '-radio'\\\" [value]=\\\"item\\\"\\n                   [(ngModel)]=\\\"selection.currentSingle\\\" [checked]=\\\"selection.currentSingle === item\\\"\\n                   [attr.aria-label]=\\\"commonStrings.select\\\">\\n        </div>\\n        <div *ngIf=\\\"rowActionService.hasActionableRow\\\"\\n             class=\\\"datagrid-row-actions datagrid-fixed-column datagrid-cell\\\">\\n          <ng-content select=\\\"clr-dg-action-overflow\\\"></ng-content>\\n        </div>\\n        <div *ngIf=\\\"globalExpandable.hasExpandableRow\\\"\\n             class=\\\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\\\">\\n          <ng-container *ngIf=\\\"expand.expandable\\\">\\n            <button (click)=\\\"toggleExpand()\\\" *ngIf=\\\"!expand.loading\\\" type=\\\"button\\\" class=\\\"datagrid-expandable-caret-button\\\">\\n              <clr-icon shape=\\\"caret\\\"\\n                        class=\\\"datagrid-expandable-caret-icon\\\"\\n                        [attr.dir]=\\\"expand.expanded ? 'down' : 'right'\\\"\\n                        [attr.title]=\\\"expand.expanded ? commonStrings.collapse : commonStrings.expand\\\"></clr-icon>\\n            </button>\\n            <div class=\\\"spinner spinner-sm\\\" *ngIf=\\\"expand.loading\\\"></div>\\n          </ng-container>\\n        </div>\\n        <ng-container #scrollableCells></ng-container>\\n      </div>\\n      <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\\n      <ng-template *ngIf=\\\"replaced && !expand.loading\\\"\\n                   [ngTemplateOutlet]=\\\"detail\\\"></ng-template>\\n    </div>\\n    <ng-template *ngIf=\\\"!replaced && !expand.loading\\\"\\n                 [ngTemplateOutlet]=\\\"detail\\\"></ng-template>\\n  </div>\\n</ng-template>\\n\\n<ng-container #calculatedCells></ng-container>\\n\",\n                    host: {\n                        '[class.datagrid-row]': 'true',\n                        '[class.datagrid-selected]': 'selected',\n                        '[attr.aria-owns]': 'id',\n                        role: 'rowgroup',\n                    },\n                    providers: [Expand, { provide: LoadingListener, useExisting: Expand }]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridRow.ctorParameters = function () { return [\n        { type: Selection },\n        { type: RowActionService },\n        { type: ExpandableRowsCount },\n        { type: Expand },\n        { type: HideableColumnService },\n        { type: DisplayModeService },\n        { type: ViewContainerRef },\n        { type: Renderer2 },\n        { type: ElementRef },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrDatagridRow.propDecorators = {\n        item: [{ type: Input, args: ['clrDgItem',] }],\n        selected: [{ type: Input, args: ['clrDgSelected',] }],\n        selectedChanged: [{ type: Output, args: ['clrDgSelectedChange',] }],\n        expanded: [{ type: Input, args: ['clrDgExpanded',] }],\n        expandedChange: [{ type: Output, args: ['clrDgExpandedChange',] }],\n        dgCells: [{ type: ContentChildren, args: [ClrDatagridCell,] }],\n        _stickyCells: [{ type: ViewChild, args: ['stickyCells', { read: ViewContainerRef },] }],\n        _scrollableCells: [{ type: ViewChild, args: ['scrollableCells', { read: ViewContainerRef },] }],\n        _calculatedCells: [{ type: ViewChild, args: ['calculatedCells', { read: ViewContainerRef },] }]\n    };\n    return ClrDatagridRow;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ColumnToggleButtonsService = /** @class */ (function () {\n    function ColumnToggleButtonsService() {\n        this.buttons = null;\n        this.selectAllDisabled = false;\n        this._selectAllButtonClicked = new Subject();\n    }\n    Object.defineProperty(ColumnToggleButtonsService.prototype, \"selectAllButtonClicked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._selectAllButtonClicked.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ColumnToggleButtonsService.prototype.buttonClicked = /**\n     * @return {?}\n     */\n    function () {\n        this._selectAllButtonClicked.next();\n    };\n    ColumnToggleButtonsService.decorators = [\n        { type: Injectable }\n    ];\n    return ColumnToggleButtonsService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * This provider aggregates state changes from the various providers of the Datagrid\n * @template T\n */\nvar StateProvider = /** @class */ (function () {\n    function StateProvider(filters, sort, page, debouncer) {\n        var _this = this;\n        this.filters = filters;\n        this.sort = sort;\n        this.page = page;\n        this.debouncer = debouncer;\n        /**\n         * The Observable that lets other classes subscribe to global state changes\n         */\n        this.change = this.debouncer.change.pipe(map(function () { return _this.state; }));\n    }\n    Object.defineProperty(StateProvider.prototype, \"state\", {\n        /*\n           * By making this a getter, we open the possibility for a setter in the future.\n           * It's been requested a couple times.\n           */\n        get: /*\n             * By making this a getter, we open the possibility for a setter in the future.\n             * It's been requested a couple times.\n             */\n        /**\n         * @return {?}\n         */\n        function () {\n            var e_1, _a;\n            /** @type {?} */\n            var state$$1 = {};\n            if (this.page.size > 0) {\n                state$$1.page = { from: this.page.firstItem, to: this.page.lastItem, size: this.page.size };\n            }\n            if (this.sort.comparator) {\n                if (this.sort.comparator instanceof DatagridPropertyComparator) {\n                    /*\n                             * Special case for the default object property comparator,\n                             * we give the property name instead of the actual comparator.\n                             */\n                    state$$1.sort = { by: ((/** @type {?} */ (this.sort.comparator))).prop, reverse: this.sort.reverse };\n                }\n                else {\n                    state$$1.sort = { by: this.sort.comparator, reverse: this.sort.reverse };\n                }\n            }\n            /** @type {?} */\n            var activeFilters = this.filters.getActiveFilters();\n            if (activeFilters.length > 0) {\n                state$$1.filters = [];\n                try {\n                    for (var activeFilters_1 = __values(activeFilters), activeFilters_1_1 = activeFilters_1.next(); !activeFilters_1_1.done; activeFilters_1_1 = activeFilters_1.next()) {\n                        var filter$$1 = activeFilters_1_1.value;\n                        if (filter$$1 instanceof DatagridStringFilterImpl) {\n                            /** @type {?} */\n                            var stringFilter = filter$$1.filterFn;\n                            if (stringFilter instanceof DatagridPropertyStringFilter) {\n                                /*\n                                             * Special case again for the default object property filter,\n                                             * we give the property name instead of the full filter object.\n                                             */\n                                state$$1.filters.push({\n                                    property: stringFilter.prop,\n                                    value: filter$$1.value,\n                                });\n                                continue;\n                            }\n                        }\n                        state$$1.filters.push(filter$$1);\n                    }\n                }\n                catch (e_1_1) { e_1 = { error: e_1_1 }; }\n                finally {\n                    try {\n                        if (activeFilters_1_1 && !activeFilters_1_1.done && (_a = activeFilters_1.return)) _a.call(activeFilters_1);\n                    }\n                    finally { if (e_1) throw e_1.error; }\n                }\n            }\n            return state$$1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    StateProvider.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    StateProvider.ctorParameters = function () { return [\n        { type: FiltersProvider },\n        { type: Sort },\n        { type: Page },\n        { type: StateDebouncer }\n    ]; };\n    return StateProvider;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * \\@description\n * Internal datagrid service that holds a reference to the clr-dg-table element and exposes a method to get height.\n */\nvar TableSizeService = /** @class */ (function () {\n    function TableSizeService(platformId) {\n        this.platformId = platformId;\n    }\n    Object.defineProperty(TableSizeService.prototype, \"tableRef\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._tableRef;\n        },\n        set: /**\n         * @param {?} element\n         * @return {?}\n         */\n        function (element) {\n            this._tableRef = element;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(TableSizeService.prototype, \"table\", {\n        set: /**\n         * @param {?} table\n         * @return {?}\n         */\n        function (table) {\n            if (isPlatformBrowser(this.platformId) && table.nativeElement) {\n                this.tableRef = table.nativeElement.querySelector('.datagrid-table');\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // Used when resizing columns to show the column border being dragged.\n    // Used when resizing columns to show the column border being dragged.\n    /**\n     * @return {?}\n     */\n    TableSizeService.prototype.getColumnDragHeight = \n    // Used when resizing columns to show the column border being dragged.\n    /**\n     * @return {?}\n     */\n    function () {\n        if (!this.tableRef) {\n            return;\n        }\n        return this.tableRef.clientHeight + \"px\";\n    };\n    TableSizeService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    TableSizeService.ctorParameters = function () { return [\n        { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }\n    ]; };\n    return TableSizeService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDatagrid = /** @class */ (function () {\n    function ClrDatagrid(columnService, organizer, items, expandableRows, selection, rowActionService, stateProvider, displayMode, renderer, el, commonStrings) {\n        this.columnService = columnService;\n        this.organizer = organizer;\n        this.items = items;\n        this.expandableRows = expandableRows;\n        this.selection = selection;\n        this.rowActionService = rowActionService;\n        this.stateProvider = stateProvider;\n        this.displayMode = displayMode;\n        this.renderer = renderer;\n        this.el = el;\n        this.commonStrings = commonStrings;\n        /* reference to the enum so that template can access */\n        this.SELECTION_TYPE = SelectionType;\n        /**\n         * Output emitted whenever the data needs to be refreshed, based on user action or external ones\n         */\n        this.refresh = new EventEmitter(false);\n        this.selectedChanged = new EventEmitter(false);\n        this.singleSelectedChanged = new EventEmitter(false);\n        /**\n         * Subscriptions to all the services and queries changes\n         */\n        this._subscriptions = [];\n    }\n    Object.defineProperty(ClrDatagrid.prototype, \"loading\", {\n        /**\n         * Freezes the datagrid while data is loading\n         */\n        get: /**\n         * Freezes the datagrid while data is loading\n         * @return {?}\n         */\n        function () {\n            return this.items.loading;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.items.loading = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Public method to re-trigger the computation of displayed items manually\n     */\n    /**\n     * Public method to re-trigger the computation of displayed items manually\n     * @return {?}\n     */\n    ClrDatagrid.prototype.dataChanged = /**\n     * Public method to re-trigger the computation of displayed items manually\n     * @return {?}\n     */\n    function () {\n        this.items.refresh();\n    };\n    Object.defineProperty(ClrDatagrid.prototype, \"selected\", {\n        /**\n         * Array of all selected items\n         */\n        set: /**\n         * Array of all selected items\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value) {\n                this.selection.selectionType = SelectionType.Multi;\n            }\n            else {\n                this.selection.selectionType = SelectionType.None;\n            }\n            this.selection.updateCurrent(value, false);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagrid.prototype, \"singleSelected\", {\n        /**\n         * Selected item in single-select mode\n         */\n        set: /**\n         * Selected item in single-select mode\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.selection.selectionType = SelectionType.Single;\n            // the clrDgSingleSelected is updated in one of two cases:\n            // 1. an explicit value is passed\n            // 2. is being set to null or undefined, where previously it had a value\n            if (value) {\n                this.selection.currentSingle = value;\n            }\n            else if (this.selection.currentSingle) {\n                this.selection.currentSingle = null;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagrid.prototype, \"rowSelectionMode\", {\n        /**\n         * Selection/Deselection on row click mode\n         */\n        set: /**\n         * Selection/Deselection on row click mode\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.selection.rowSelectionMode = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagrid.prototype, \"allSelected\", {\n        /**\n         * Indicates if all currently displayed items are selected\n         */\n        get: /**\n         * Indicates if all currently displayed items are selected\n         * @return {?}\n         */\n        function () {\n            return this.selection.isAllSelected();\n        },\n        /**\n         * Selects/deselects all currently displayed items\n         * @param value\n         */\n        set: /**\n         * Selects/deselects all currently displayed items\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            /*\n                 * This is a setter but we ignore the value.\n                 * It's strange, but it lets us have an indeterminate state where only\n                 * some of the items are selected.\n                 */\n            this.selection.toggleAll();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrDatagrid.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (!this.items.smart) {\n            this.items.all = this.rows.map(function (row) { return row.item; });\n        }\n        this._subscriptions.push(this.rows.changes.subscribe(function () {\n            if (!_this.items.smart) {\n                _this.items.all = _this.rows.map(function (row) { return row.item; });\n            }\n            _this.rows.forEach(function (row) {\n                _this._displayedRows.insert(row._view);\n            });\n        }));\n        this._subscriptions.push(this.columns.changes.subscribe(function (columns) {\n            _this.columnService.updateColumnList(_this.columns.map(function (col) { return col.hideable; }));\n        }));\n        // Get ColumnService ready for HideableColumns.\n        this.columnService.updateColumnList(this.columns.map(function (col) { return col.hideable; }));\n    };\n    /**\n     * Our setup happens in the view of some of our components, so we wait for it to be done before starting\n     */\n    /**\n     * Our setup happens in the view of some of our components, so we wait for it to be done before starting\n     * @return {?}\n     */\n    ClrDatagrid.prototype.ngAfterViewInit = /**\n     * Our setup happens in the view of some of our components, so we wait for it to be done before starting\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        // TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier\n        this.refresh.emit(this.stateProvider.state);\n        this._subscriptions.push(this.stateProvider.change.subscribe(function (state$$1) { return _this.refresh.emit(state$$1); }));\n        this._subscriptions.push(this.selection.change.subscribe(function (s) {\n            if (_this.selection.selectionType === SelectionType.Single) {\n                _this.singleSelectedChanged.emit((/** @type {?} */ (s)));\n            }\n            else if (_this.selection.selectionType === SelectionType.Multi) {\n                _this.selectedChanged.emit((/** @type {?} */ (s)));\n            }\n        }));\n        // A subscription that listens for displayMode changes on the datagrid\n        this.displayMode.view.subscribe(function (viewChange) {\n            // Remove any projected columns from the projectedDisplayColumns container\n            for (var i = _this._projectedDisplayColumns.length; i > 0; i--) {\n                _this._projectedDisplayColumns.detach();\n            }\n            // Remove any projected columns from the projectedCalculationColumns container\n            for (var i = _this._projectedCalculationColumns.length; i > 0; i--) {\n                _this._projectedCalculationColumns.detach();\n            }\n            // Remove any projected rows from the calculationRows container\n            for (var i = _this._calculationRows.length; i > 0; i--) {\n                _this._calculationRows.detach();\n            }\n            // Remove any projected rows from the displayedRows container\n            for (var i = _this._displayedRows.length; i > 0; i--) {\n                _this._displayedRows.detach();\n            }\n            if (viewChange === DatagridDisplayMode.DISPLAY) {\n                // Set state, style for the datagrid to DISPLAY and insert row & columns into containers\n                _this.renderer.removeClass(_this.el.nativeElement, 'datagrid-calculate-mode');\n                _this.columns.forEach(function (column) {\n                    _this._projectedDisplayColumns.insert(column._view);\n                });\n                _this.rows.forEach(function (row) {\n                    _this._displayedRows.insert(row._view);\n                });\n            }\n            else {\n                // Set state, style for the datagrid to CALCULATE and insert row & columns into containers\n                _this.renderer.addClass(_this.el.nativeElement, 'datagrid-calculate-mode');\n                _this.columns.forEach(function (column) {\n                    _this._projectedCalculationColumns.insert(column._view);\n                });\n                _this.rows.forEach(function (row) {\n                    _this._calculationRows.insert(row._view);\n                });\n            }\n        });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagrid.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagrid.prototype.resize = /**\n     * @return {?}\n     */\n    function () {\n        this.organizer.resize();\n    };\n    ClrDatagrid.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-datagrid',\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<ng-content select=\\\"clr-dg-action-bar\\\"></ng-content>\\n<div class=\\\"datagrid\\\" #datagrid>\\n    <div class=\\\"datagrid-table-wrapper\\\">\\n      <div role=\\\"grid\\\" class=\\\"datagrid-table\\\">\\n        <div role=\\\"rowgroup\\\" class=\\\"datagrid-header\\\">\\n          <div role=\\\"row\\\" class=\\\"datagrid-row\\\">\\n            <div class=\\\"datagrid-row-master datagrid-row-flex\\\">\\n              <div class=\\\"datagrid-row-sticky\\\">\\n                <!-- Sticky elements here -->\\n              </div>\\n              <div class=\\\"datagrid-row-scrollable\\\">\\n                <!--header for datagrid where you can select multiple rows -->\\n                <div role=\\\"columnheader\\\" class=\\\"datagrid-column datagrid-select datagrid-fixed-column\\\"\\n                     *ngIf=\\\"selection.selectionType === SELECTION_TYPE.Multi\\\">\\n                            <span class=\\\"datagrid-column-title\\\">\\n                                <input clrCheckbox type=\\\"checkbox\\\" [(ngModel)]=\\\"allSelected\\\"\\n                                       [attr.aria-label]=\\\"commonStrings.selectAll\\\">\\n                            </span>\\n                  <div class=\\\"datagrid-column-separator\\\"></div>\\n                </div>\\n                <!-- header for datagrid where you can select one row only -->\\n                <div role=\\\"columnheader\\\" class=\\\"datagrid-column datagrid-select datagrid-fixed-column\\\"\\n                     *ngIf=\\\"selection.selectionType === SELECTION_TYPE.Single\\\">\\n                  <div class=\\\"datagrid-column-separator\\\"></div>\\n                </div>\\n                <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\\n                <div role=\\\"columnheader\\\" class=\\\"datagrid-column datagrid-row-actions datagrid-fixed-column\\\"\\n                     *ngIf=\\\"rowActionService.hasActionableRow\\\">\\n                  <div class=\\\"datagrid-column-separator\\\"></div>\\n                </div>\\n                <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\\n                <div role=\\\"columnheader\\\" class=\\\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\\\"\\n                     *ngIf=\\\"expandableRows.hasExpandableRow\\\">\\n                  <div class=\\\"datagrid-column-separator\\\"></div>\\n                </div>\\n                <ng-container #projectedDisplayColumns></ng-container>\\n              </div>\\n            </div>\\n          </div>\\n        </div>\\n        <ng-container #displayedRows></ng-container>\\n        <!-- Custom placeholder overrides the default empty one -->\\n        <ng-content select=\\\"clr-dg-placeholder\\\"></ng-content>\\n        <clr-dg-placeholder *ngIf=\\\"!placeholder\\\"></clr-dg-placeholder>\\n      </div>\\n    </div>\\n</div>\\n<ng-content select=\\\"clr-dg-footer\\\"></ng-content>\\n<div class=\\\"datagrid-spinner\\\" *ngIf=\\\"loading\\\">\\n    <div class=\\\"spinner spinner-md\\\">Loading...</div>\\n</div>\\n\\n<div class=\\\"datagrid-calculation-table\\\">\\n    <div class=\\\"datagrid-calculation-header\\\">\\n        <ng-container #projectedCalculationColumns></ng-container>\\n    </div>\\n    <ng-container #calculationRows></ng-container>\\n</div>\\n\",\n                    providers: [\n                        Selection,\n                        Sort,\n                        FiltersProvider,\n                        Page,\n                        Items,\n                        DatagridRenderOrganizer,\n                        RowActionService,\n                        ExpandableRowsCount,\n                        HideableColumnService,\n                        StateDebouncer,\n                        StateProvider,\n                        ColumnToggleButtonsService,\n                        TableSizeService,\n                        DisplayModeService,\n                    ],\n                    host: { '[class.datagrid-host]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagrid.ctorParameters = function () { return [\n        { type: HideableColumnService },\n        { type: DatagridRenderOrganizer },\n        { type: Items },\n        { type: ExpandableRowsCount },\n        { type: Selection },\n        { type: RowActionService },\n        { type: StateProvider },\n        { type: DisplayModeService },\n        { type: Renderer2 },\n        { type: ElementRef },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrDatagrid.propDecorators = {\n        loading: [{ type: Input, args: ['clrDgLoading',] }],\n        refresh: [{ type: Output, args: ['clrDgRefresh',] }],\n        iterator: [{ type: ContentChild, args: [ClrDatagridItems,] }],\n        selected: [{ type: Input, args: ['clrDgSelected',] }],\n        selectedChanged: [{ type: Output, args: ['clrDgSelectedChange',] }],\n        singleSelected: [{ type: Input, args: ['clrDgSingleSelected',] }],\n        singleSelectedChanged: [{ type: Output, args: ['clrDgSingleSelectedChange',] }],\n        rowSelectionMode: [{ type: Input, args: ['clrDgRowSelection',] }],\n        placeholder: [{ type: ContentChild, args: [ClrDatagridPlaceholder,] }],\n        columns: [{ type: ContentChildren, args: [ClrDatagridColumn,] }],\n        rows: [{ type: ContentChildren, args: [ClrDatagridRow,] }],\n        scrollableColumns: [{ type: ViewChild, args: ['scrollableColumns', { read: ViewContainerRef },] }],\n        _projectedDisplayColumns: [{ type: ViewChild, args: ['projectedDisplayColumns', { read: ViewContainerRef },] }],\n        _projectedCalculationColumns: [{ type: ViewChild, args: ['projectedCalculationColumns', { read: ViewContainerRef },] }],\n        _displayedRows: [{ type: ViewChild, args: ['displayedRows', { read: ViewContainerRef },] }],\n        _calculationRows: [{ type: ViewChild, args: ['calculationRows', { read: ViewContainerRef },] }]\n    };\n    return ClrDatagrid;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridActionBar = /** @class */ (function () {\n    function ClrDatagridActionBar() {\n    }\n    ClrDatagridActionBar.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-action-bar',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    host: { '[class.datagrid-action-bar]': 'true' }\n                }] }\n    ];\n    return ClrDatagridActionBar;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridActionOverflow = /** @class */ (function () {\n    function ClrDatagridActionOverflow(rowActionService, commonStrings) {\n        this.rowActionService = rowActionService;\n        this.commonStrings = commonStrings;\n        this.anchorPoint = Point.RIGHT_CENTER;\n        this.popoverPoint = Point.LEFT_CENTER;\n        /**\n         * Tracks whether the action overflow menu is open or not\n         */\n        this._open = false;\n        this.openChanged = new EventEmitter(false);\n        this.rowActionService.register();\n    }\n    /**\n     * @return {?}\n     */\n    ClrDatagridActionOverflow.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.rowActionService.unregister();\n    };\n    Object.defineProperty(ClrDatagridActionOverflow.prototype, \"open\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._open;\n        },\n        set: /**\n         * @param {?} open\n         * @return {?}\n         */\n        function (open) {\n            /** @type {?} */\n            var boolOpen = !!open;\n            if (boolOpen !== this._open) {\n                this._open = boolOpen;\n                this.openChanged.emit(boolOpen);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Shows/hides the action overflow menu\n     */\n    /**\n     * Shows/hides the action overflow menu\n     * @param {?} event\n     * @return {?}\n     */\n    ClrDatagridActionOverflow.prototype.toggle = /**\n     * Shows/hides the action overflow menu\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        this.openingEvent = event;\n        this.open = !this.open;\n    };\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    ClrDatagridActionOverflow.prototype.close = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        /*\n             * Because this listener is added synchonously, before the event finishes bubbling up the DOM,\n             * we end up firing on the very click that just opened the menu, p\n             * otentially closing it immediately every time. So we just ignore it.\n             */\n        if (event === this.openingEvent) {\n            delete this.openingEvent;\n            return;\n        }\n        this.open = false;\n    };\n    ClrDatagridActionOverflow.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-action-overflow',\n                    template: \"\\n        <button (click)=\\\"toggle($event)\\\" type=\\\"button\\\" class=\\\"datagrid-action-toggle\\\" #anchor>\\n            <clr-icon shape=\\\"ellipsis-vertical\\\" [attr.title]=\\\"commonStrings.rowActions\\\"></clr-icon>\\n        </button>\\n        <ng-template [(clrPopoverOld)]=\\\"open\\\" [clrPopoverOldAnchor]=\\\"anchor\\\" [clrPopoverOldAnchorPoint]=\\\"anchorPoint\\\"\\n                     [clrPopoverOldPopoverPoint]=\\\"popoverPoint\\\">\\n            <div #menu class=\\\"datagrid-action-overflow\\\" (clrOutsideClick)=\\\"close($event)\\\" [clrStrict]=\\\"true\\\">\\n                <ng-content></ng-content>\\n            </div>\\n        </ng-template>\\n    \"\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridActionOverflow.ctorParameters = function () { return [\n        { type: RowActionService },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrDatagridActionOverflow.propDecorators = {\n        open: [{ type: Input, args: ['clrDgActionOverflowOpen',] }],\n        openChanged: [{ type: Output, args: ['clrDgActionOverflowOpenChange',] }]\n    };\n    return ClrDatagridActionOverflow;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridColumnToggleButton = /** @class */ (function () {\n    function ClrDatagridColumnToggleButton(toggleButtons) {\n        this.toggleButtons = toggleButtons;\n    }\n    ClrDatagridColumnToggleButton.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-column-toggle-button',\n                    template: \"\\n        <button class=\\\"btn btn-sm btn-link\\\"\\n            (click)=\\\"toggleButtons.buttonClicked()\\\"\\n            [disabled]=\\\"toggleButtons.selectAllDisabled\\\"\\n            type=\\\"button\\\">\\n            <ng-content></ng-content>\\n        </button>\\n    \"\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridColumnToggleButton.ctorParameters = function () { return [\n        { type: ColumnToggleButtonsService }\n    ]; };\n    return ClrDatagridColumnToggleButton;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridColumnToggleTitle = /** @class */ (function () {\n    function ClrDatagridColumnToggleTitle() {\n    }\n    ClrDatagridColumnToggleTitle.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-column-toggle-title',\n                    template: \"<ng-content></ng-content>\"\n                }] }\n    ];\n    return ClrDatagridColumnToggleTitle;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridColumnToggle = /** @class */ (function () {\n    function ClrDatagridColumnToggle(hideableColumnService, columnToggleButtons, commonStrings) {\n        this.hideableColumnService = hideableColumnService;\n        this.columnToggleButtons = columnToggleButtons;\n        this.commonStrings = commonStrings;\n        this.subscriptions = [];\n        /**\n         *\n         * Popover init\n         */\n        this.anchorPoint = Point.TOP_LEFT;\n        this.popoverPoint = Point.LEFT_BOTTOM;\n        this.open = false;\n        /**\n         * *\n         * DatagridHideableColumnModel init\n         */\n        this.columns = [];\n    }\n    Object.defineProperty(ClrDatagridColumnToggle.prototype, \"allColumnsVisible\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._allColumnsVisible;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._allColumnsVisible = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrDatagridColumnToggle.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.subscriptions.push(this.hideableColumnService.columnListChange.subscribe(function (columnList) {\n            // Reset the list of columns\n            _this.columns.length = 0;\n            _this.hideableColumnService.updateForLastVisibleColumn();\n            _this.allColumnsVisible = _this.hideableColumnService.checkForAllColumnsVisible;\n            _this.columnToggleButtons.selectAllDisabled = _this.allColumnsVisible;\n            // Add only the hidden columns to the toggler.\n            columnList.forEach(function (col) {\n                if (col) {\n                    _this.columns.push(col);\n                }\n            });\n        }));\n        this.subscriptions.push(this.columnToggleButtons.selectAllButtonClicked.subscribe(function () {\n            _this.selectAll();\n        }));\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridColumnToggle.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridColumnToggle.prototype.selectAll = /**\n     * @return {?}\n     */\n    function () {\n        this.hideableColumnService.showHiddenColumns();\n        this.allColumnsVisible = this.hideableColumnService.checkForAllColumnsVisible;\n        this.columnToggleButtons.selectAllDisabled = this.allColumnsVisible;\n    };\n    /**\n     * @param {?} event\n     * @param {?} column\n     * @return {?}\n     */\n    ClrDatagridColumnToggle.prototype.toggleColumn = /**\n     * @param {?} event\n     * @param {?} column\n     * @return {?}\n     */\n    function (event, column) {\n        column.hidden = !event;\n        this.allColumnsVisible = this.hideableColumnService.checkForAllColumnsVisible;\n        this.columnToggleButtons.selectAllDisabled = this.allColumnsVisible;\n        this.hideableColumnService.updateForLastVisibleColumn();\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridColumnToggle.prototype.toggleUI = /**\n     * @return {?}\n     */\n    function () {\n        this.open = !this.open;\n    };\n    ClrDatagridColumnToggle.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-column-toggle',\n                    template: \"\\n        <button\\n                #anchor\\n                (click)=\\\"toggleUI()\\\"\\n                class=\\\"btn btn-sm btn-link column-toggle--action\\\"\\n                type=\\\"button\\\">\\n            <clr-icon shape=\\\"view-columns\\\" [attr.title]=\\\"commonStrings.pickColumns\\\"></clr-icon>\\n        </button>\\n        <div class=\\\"column-switch\\\"\\n             *clrPopoverOld=\\\"open; anchor: anchor; anchorPoint: anchorPoint; popoverPoint: popoverPoint\\\">\\n            <div class=\\\"switch-header\\\">\\n                <ng-container *ngIf=\\\"!title\\\">Show Columns</ng-container>\\n                <ng-content select=\\\"clr-dg-column-toggle-title\\\"></ng-content>\\n                <button\\n                    class=\\\"btn btn-sm btn-link\\\"\\n                    (click)=\\\"toggleUI()\\\"\\n                    type=\\\"button\\\">\\n                    <clr-icon shape=\\\"close\\\" [attr.title]=\\\"commonStrings.close\\\"></clr-icon>\\n                </button>\\n            </div>\\n            <ul class=\\\"switch-content list-unstyled\\\">\\n                <li *ngFor=\\\"let column of columns\\\">\\n                    <clr-checkbox-wrapper>\\n                        <input clrCheckbox type=\\\"checkbox\\\"\\n                          [disabled]=\\\"column.lastVisibleColumn\\\"\\n                          [ngModel]=\\\"!column.hidden\\\"\\n                          (ngModelChange)=\\\"toggleColumn($event, column)\\\">\\n                        <label><ng-template [ngTemplateOutlet]=\\\"column.template\\\"></ng-template></label>\\n                    </clr-checkbox-wrapper>\\n                </li>\\n            </ul>\\n            <div class=\\\"switch-footer\\\" *ngIf=\\\"buttons.length > 0\\\">\\n                <ng-content select=\\\"clr-dg-column-toggle-button\\\"></ng-content>\\n            </div>\\n            <div class=\\\"switch-footer\\\" *ngIf=\\\"buttons.length === 0\\\">\\n                <div>\\n                    <button\\n                            class=\\\"btn btn-sm btn-link p6 text-uppercase\\\"\\n                            [disabled]=\\\"allColumnsVisible\\\"\\n                            (click)=\\\"selectAll()\\\"\\n                            type=\\\"button\\\">Select All\\n                    </button>\\n                </div>\\n            </div>\\n        </div>\\n    \",\n                    host: { '[class.column-switch-wrapper]': 'true', '[class.active]': 'open' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridColumnToggle.ctorParameters = function () { return [\n        { type: HideableColumnService },\n        { type: ColumnToggleButtonsService },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrDatagridColumnToggle.propDecorators = {\n        title: [{ type: ContentChild, args: [ClrDatagridColumnToggleTitle,] }],\n        buttons: [{ type: ContentChildren, args: [ClrDatagridColumnToggleButton,] }]\n    };\n    return ClrDatagridColumnToggle;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * I don't think this deserves to be in IfExpanded itself,\n * so I'm adding a second directive on the same selector for now just for the datagrid\n */\nvar DatagridDetailRegisterer = /** @class */ (function () {\n    function DatagridDetailRegisterer(expandableRowsCount) {\n        this.expandableRowsCount = expandableRowsCount;\n        if (this.expandableRowsCount) {\n            this.expandableRowsCount.register();\n        }\n    }\n    /**\n     * @return {?}\n     */\n    DatagridDetailRegisterer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.expandableRowsCount) {\n            this.expandableRowsCount.unregister();\n        }\n    };\n    DatagridDetailRegisterer.decorators = [\n        { type: Directive, args: [{ selector: '[clrIfExpanded]' },] }\n    ];\n    /** @nocollapse */\n    DatagridDetailRegisterer.ctorParameters = function () { return [\n        { type: ExpandableRowsCount, decorators: [{ type: Optional }] }\n    ]; };\n    return DatagridDetailRegisterer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDatagridFooter = /** @class */ (function () {\n    function ClrDatagridFooter(selection, hideableColumnService, cdr) {\n        this.selection = selection;\n        this.hideableColumnService = hideableColumnService;\n        this.cdr = cdr;\n        this.subscriptions = [];\n        /* reference to the enum so that template can access */\n        this.SELECTION_TYPE = SelectionType;\n    }\n    /**\n     * @return {?}\n     */\n    ClrDatagridFooter.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.subscriptions.push(this.hideableColumnService.columnListChange.subscribe(function (change) {\n            /** @type {?} */\n            var hiddenColumnsInSub = change.filter(function (col) { return col; });\n            if (hiddenColumnsInSub.length > 0) {\n                _this.activeToggler = true;\n            }\n        }));\n        /** @type {?} */\n        var hiddenColumns = this.hideableColumnService.getColumns().filter(function (col) { return col; });\n        if (hiddenColumns.length > 0) {\n            this.activeToggler = true;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridFooter.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) {\n            sub.unsubscribe();\n        });\n    };\n    ClrDatagridFooter.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-footer',\n                    template: \"\\n        <ng-container\\n            *ngIf=\\\"(selection.selectionType === SELECTION_TYPE.Multi) && (selection.current.length > 0)\\\">\\n          <div class=\\\"clr-form-control-disabled\\\">\\n              <clr-checkbox-wrapper class=\\\"datagrid-footer-select\\\">\\n                <input clrCheckbox type=\\\"checkbox\\\" checked=\\\"checked\\\" disabled>\\n                <label>{{selection.current.length}}</label>\\n            </clr-checkbox-wrapper>\\n          </div>\\n        </ng-container>\\n        <ng-content select=\\\"clr-dg-column-toggle\\\"></ng-content>\\n        <clr-dg-column-toggle *ngIf=\\\"!toggle && activeToggler\\\"></clr-dg-column-toggle>\\n        <div class=\\\"datagrid-footer-description\\\">\\n            <ng-content></ng-content>\\n        </div>\\n        <ng-content select=\\\"clr-dg-pagination\\\"></ng-content>\\n    \",\n                    host: {\n                        '[class.datagrid-footer]': 'true',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridFooter.ctorParameters = function () { return [\n        { type: Selection },\n        { type: HideableColumnService },\n        { type: ChangeDetectorRef }\n    ]; };\n    ClrDatagridFooter.propDecorators = {\n        toggle: [{ type: ContentChild, args: [ClrDatagridColumnToggle,] }]\n    };\n    return ClrDatagridFooter;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n *\n * \\@description\n * A utility class for that adds hide/show functionality to a column, its cells and enables a toggler in the\n * DatagridColumnToggle Component.\n *\n */\nvar /**\n *\n * \\@description\n * A utility class for that adds hide/show functionality to a column, its cells and enables a toggler in the\n * DatagridColumnToggle Component.\n *\n */\nDatagridHideableColumnModel = /** @class */ (function () {\n    /**\n     *\n     * @description\n     * The init function for DatagridHideableColumnModel instances that does the following:\n     *\n     * 1. Set values for the private variables that enable a hideable column\n     * 2. Broadcast the next hidden change for anyone (already) subscribed to this DatagridHideableColumnModel\n     *\n     */\n    function DatagridHideableColumnModel(_template, _id, _hidden) {\n        if (_hidden === void 0) { _hidden = false; }\n        this._template = _template;\n        this._id = _id;\n        this._hidden = _hidden;\n        /**\n         * \\@property hiddenChanges\n         *\n         * \\@description\n         * A stream of state changes an instance of DatagridHideableColumnModel will broadcast to subscribers.\n         *\n         */\n        this.hiddenChangesState = new Subject();\n        // Flag this true when the service only has one visible column open.\n        this.lastVisibleColumn = false;\n    }\n    Object.defineProperty(DatagridHideableColumnModel.prototype, \"template\", {\n        /**\n         *\n         * @description\n         * A getter function that returns an TemplateRef of the DatagridColumn that is hideable. This is currently used to\n         * populate the DatagridColumnToggle UI with the correct Column name.\n         *\n         */\n        get: /**\n         *\n         * \\@description\n         * A getter function that returns an TemplateRef of the DatagridColumn that is hideable. This is currently used to\n         * populate the DatagridColumnToggle UI with the correct Column name.\n         *\n         * @return {?}\n         */\n        function () {\n            return this._template;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DatagridHideableColumnModel.prototype, \"id\", {\n        /**\n         *\n         * @description\n         * public function that returns the id of a HideableCOlumn instance. Used by the HideableCOlumnService for passing\n         * state and actions between DateGridColumns, DataGridCells & the DatagridColumnToggle Components.\n         *\n         */\n        get: /**\n         *\n         * \\@description\n         * public function that returns the id of a HideableCOlumn instance. Used by the HideableCOlumnService for passing\n         * state and actions between DateGridColumns, DataGridCells & the DatagridColumnToggle Components.\n         *\n         * @return {?}\n         */\n        function () {\n            return this._id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DatagridHideableColumnModel.prototype, \"hidden\", {\n        /**\n         *\n         * @description\n         * A getter that returns the hidden value of a DatagridHideableColumnModel instance.\n         *\n         */\n        get: /**\n         *\n         * \\@description\n         * A getter that returns the hidden value of a DatagridHideableColumnModel instance.\n         *\n         * @return {?}\n         */\n        function () {\n            return this._hidden;\n        },\n        /**\n         *\n         * @description\n         * The setter for setting the hidden state of a DatagridHideableColumnModel instance.\n         * It also broadcasts the change after its set.\n         *\n         */\n        set: /**\n         *\n         * \\@description\n         * The setter for setting the hidden state of a DatagridHideableColumnModel instance.\n         * It also broadcasts the change after its set.\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this._hidden === value) {\n                return;\n            }\n            this._hidden = value;\n            this.hiddenChangesState.next(value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DatagridHideableColumnModel.prototype, \"hiddenChangeState\", {\n        /**\n         *\n         * @description\n         * An Observable for the HideableColumns hidden changes.\n         *\n         */\n        get: /**\n         *\n         * \\@description\n         * An Observable for the HideableColumns hidden changes.\n         *\n         * @return {?}\n         */\n        function () {\n            return this.hiddenChangesState.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return DatagridHideableColumnModel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridHideableColumn = /** @class */ (function () {\n    /**\n     * @description\n     * Used the DatagridColumn to get and set an id for this HiddenColumn\n     *\n     */\n    function ClrDatagridHideableColumn(templateRef, viewContainerRef, dgColumn) {\n        var _this = this;\n        this.templateRef = templateRef;\n        this.viewContainerRef = viewContainerRef;\n        this.dgColumn = dgColumn;\n        this.hiddenChange = new EventEmitter();\n        this.columnId = dgColumn.columnId;\n        // Use the templateRef to create this view\n        this.viewContainerRef.createEmbeddedView(this.templateRef);\n        // Create instance of the utility class DatagridHideableColumn.\n        // Note this is on the parent instance of DatagridColumn.\n        this.dgColumn.hideable = new DatagridHideableColumnModel(this.templateRef, this.columnId, this._hidden);\n        this.dgColumn.hideable.hiddenChangeState.subscribe(function (state$$1) { return _this.hiddenChange.emit(state$$1); });\n    }\n    Object.defineProperty(ClrDatagridHideableColumn.prototype, \"clrDgHideableColumn\", {\n        /**\n         *\n         * @description\n         * Setter fn for the @Input with the same name as this structural directive.\n         * It allows the user to pre-configure the column's hide/show state. { hidden: true }\n         * It's more verbose but has more Clarity.\n         *\n         *\n         * @example\n         * *clrDgHideableColumn\n         * *clrDgHideableColumn={hidden: false}\n         * *clrDgHideableColumn={hidden: true}\n         *\n         */\n        set: /**\n         *\n         * \\@description\n         * Setter fn for the \\@Input with the same name as this structural directive.\n         * It allows the user to pre-configure the column's hide/show state. { hidden: true }\n         * It's more verbose but has more Clarity.\n         *\n         *\n         * \\@example\n         * *clrDgHideableColumn\n         * *clrDgHideableColumn={hidden: false}\n         * *clrDgHideableColumn={hidden: true}\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.clrDgHidden = value && value.hidden ? value.hidden : false;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridHideableColumn.prototype, \"clrDgHidden\", {\n        set: /**\n         * @param {?} hidden\n         * @return {?}\n         */\n        function (hidden) {\n            this._hidden = hidden ? hidden : false;\n            if (this.dgColumn.hideable) {\n                this.dgColumn.hideable.hidden = this._hidden;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDatagridHideableColumn.decorators = [\n        { type: Directive, args: [{ selector: '[clrDgHideableColumn]' },] }\n    ];\n    /** @nocollapse */\n    ClrDatagridHideableColumn.ctorParameters = function () { return [\n        { type: TemplateRef },\n        { type: ViewContainerRef },\n        { type: ClrDatagridColumn }\n    ]; };\n    ClrDatagridHideableColumn.propDecorators = {\n        clrDgHideableColumn: [{ type: Input, args: ['clrDgHideableColumn',] }],\n        clrDgHidden: [{ type: Input, args: ['clrDgHidden',] }],\n        hiddenChange: [{ type: Output, args: ['clrDgHiddenChange',] }]\n    };\n    return ClrDatagridHideableColumn;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDatagridItemsTrackBy = /** @class */ (function () {\n    function ClrDatagridItemsTrackBy(_items) {\n        this._items = _items;\n    }\n    Object.defineProperty(ClrDatagridItemsTrackBy.prototype, \"trackBy\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this._items) {\n                this._items.trackBy = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDatagridItemsTrackBy.decorators = [\n        { type: Directive, args: [{\n                    selector: '[ngForTrackBy]',\n                },] }\n    ];\n    /** @nocollapse */\n    ClrDatagridItemsTrackBy.ctorParameters = function () { return [\n        { type: Items, decorators: [{ type: Optional }] }\n    ]; };\n    ClrDatagridItemsTrackBy.propDecorators = {\n        trackBy: [{ type: Input, args: ['ngForTrackBy',] }]\n    };\n    return ClrDatagridItemsTrackBy;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridPageSize = /** @class */ (function () {\n    function ClrDatagridPageSize(page) {\n        this.page = page;\n    }\n    /**\n     * @return {?}\n     */\n    ClrDatagridPageSize.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        if (!this.pageSizeOptions || this.pageSizeOptions.length === 0) {\n            this.pageSizeOptions = [this.page.size];\n        }\n    };\n    ClrDatagridPageSize.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-page-size',\n                    template: \"\\n    <ng-content></ng-content>\\n    <div class=\\\"clr-select-wrapper\\\">\\n      <select [class.clr-page-size-select]=\\\"true\\\" [(ngModel)]=\\\"page.size\\\">\\n        <option *ngFor=\\\"let option of pageSizeOptions\\\" [ngValue]=\\\"option\\\">{{option}}</option>\\n      </select>\\n    </div>\\n  \"\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridPageSize.ctorParameters = function () { return [\n        { type: Page }\n    ]; };\n    ClrDatagridPageSize.propDecorators = {\n        pageSizeOptions: [{ type: Input, args: ['clrPageSizeOptions',] }]\n    };\n    return ClrDatagridPageSize;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDatagridPagination = /** @class */ (function () {\n    function ClrDatagridPagination(page) {\n        this.page = page;\n        this.defaultSize = true;\n        this.currentChanged = new EventEmitter(false);\n    }\n    /**********\n     * Subscription to the Page service for page changes.\n     * Note: this only emits after the datagrid is initialized/stabalized and the page changes.\n     */\n    /**\n     * *******\n     * Subscription to the Page service for page changes.\n     * Note: this only emits after the datagrid is initialized/stabalized and the page changes.\n     * @return {?}\n     */\n    ClrDatagridPagination.prototype.ngOnInit = /**\n     * *******\n     * Subscription to the Page service for page changes.\n     * Note: this only emits after the datagrid is initialized/stabalized and the page changes.\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        /*\n         * Default page size is 10.\n         * The reason we set it in this constructor and not in the provider itself is because\n         * we don't want pagination (page size 0) if this component isn't present in the datagrid.\n         */\n        if (this.defaultSize) {\n            this.page.size = 10;\n        }\n        this._pageSubscription = this.page.change.subscribe(function (current) { return _this.currentChanged.emit(current); });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridPagination.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.page.resetPageSize();\n        if (this._pageSubscription) {\n            this._pageSubscription.unsubscribe();\n        }\n    };\n    Object.defineProperty(ClrDatagridPagination.prototype, \"pageSize\", {\n        /**\n         * Page size\n         */\n        get: /**\n         * Page size\n         * @return {?}\n         */\n        function () {\n            return this.page.size;\n        },\n        set: /**\n         * @param {?} size\n         * @return {?}\n         */\n        function (size) {\n            if (typeof size === 'number') {\n                this.defaultSize = false;\n                this.page.size = size;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridPagination.prototype, \"totalItems\", {\n        /**\n         * Total items (needed to guess the last page)\n         */\n        get: /**\n         * Total items (needed to guess the last page)\n         * @return {?}\n         */\n        function () {\n            return this.page.totalItems;\n        },\n        set: /**\n         * @param {?} total\n         * @return {?}\n         */\n        function (total) {\n            if (typeof total === 'number') {\n                this.page.totalItems = total;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridPagination.prototype, \"lastPage\", {\n        /**\n         * Last page\n         */\n        get: /**\n         * Last page\n         * @return {?}\n         */\n        function () {\n            return this.page.last;\n        },\n        set: /**\n         * @param {?} last\n         * @return {?}\n         */\n        function (last) {\n            if (typeof last === 'number') {\n                this.page.last = last;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridPagination.prototype, \"currentPage\", {\n        /**\n         * Current page\n         */\n        get: /**\n         * Current page\n         * @return {?}\n         */\n        function () {\n            return this.page.current;\n        },\n        set: /**\n         * @param {?} page\n         * @return {?}\n         */\n        function (page) {\n            if (typeof page === 'number') {\n                this.page.current = page;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Moves to the previous page if it exists\n     */\n    /**\n     * Moves to the previous page if it exists\n     * @return {?}\n     */\n    ClrDatagridPagination.prototype.previous = /**\n     * Moves to the previous page if it exists\n     * @return {?}\n     */\n    function () {\n        this.page.previous();\n    };\n    /**\n     * Moves to the next page if it exists\n     */\n    /**\n     * Moves to the next page if it exists\n     * @return {?}\n     */\n    ClrDatagridPagination.prototype.next = /**\n     * Moves to the next page if it exists\n     * @return {?}\n     */\n    function () {\n        this.page.next();\n    };\n    Object.defineProperty(ClrDatagridPagination.prototype, \"firstItem\", {\n        /**\n         * Index of the first item displayed on the current page, starting at 0\n         */\n        get: /**\n         * Index of the first item displayed on the current page, starting at 0\n         * @return {?}\n         */\n        function () {\n            return this.page.firstItem;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridPagination.prototype, \"lastItem\", {\n        /**\n         * Index of the last item displayed on the current page, starting at 0\n         */\n        get: /**\n         * Index of the last item displayed on the current page, starting at 0\n         * @return {?}\n         */\n        function () {\n            return this.page.lastItem;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDatagridPagination.prototype, \"middlePages\", {\n        /**\n         * Conditionally adds page numbers before and after the current page\n         */\n        get: /**\n         * Conditionally adds page numbers before and after the current page\n         * @return {?}\n         */\n        function () {\n            /** @type {?} */\n            var middlePages = [];\n            if (this.page.current > 1) {\n                middlePages.push(this.page.current - 1);\n            }\n            middlePages.push(this.page.current);\n            if (this.page.current < this.page.last) {\n                middlePages.push(this.page.current + 1);\n            }\n            return middlePages;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * We only update the pagination's current page on blur of the input field, or\n     * when they press enter.\n     */\n    /**\n     * We only update the pagination's current page on blur of the input field, or\n     * when they press enter.\n     * @param {?} event\n     * @return {?}\n     */\n    ClrDatagridPagination.prototype.updateCurrentPage = /**\n     * We only update the pagination's current page on blur of the input field, or\n     * when they press enter.\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        /** @type {?} */\n        var parsed = parseInt(event.target.value, 10);\n        // if the input value, is not a number, we don't update the page\n        if (!isNaN(parsed)) {\n            if (parsed < 1) {\n                this.page.current = 1;\n            }\n            else if (parsed > this.page.last) {\n                this.page.current = this.page.last;\n            }\n            else {\n                this.page.current = parsed;\n            }\n        }\n        /**\n         * Set the input's value to the new current page. This is needed because the code\n         * above may have changed the value from what the user entered in.\n         */\n        this.currentPageInputRef.nativeElement.value = this.page.current;\n    };\n    ClrDatagridPagination.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-pagination',\n                    template: \"\\n    <div class=\\\"pagination-size\\\" *ngIf=\\\"_pageSizeComponent\\\">\\n      <ng-content select=\\\"clr-dg-page-size\\\"></ng-content>\\n    </div>\\n    <div class=\\\"pagination-description\\\">\\n      <ng-content></ng-content>\\n    </div>\\n    <div class=\\\"pagination-list\\\" *ngIf=\\\"page.last > 1\\\">\\n      <button class=\\\"pagination-first\\\" [disabled]=\\\"page.current <= 1\\\" (click)=\\\"page.current = 1\\\">\\n        <clr-icon shape=\\\"step-forward-2 down\\\"></clr-icon>\\n      </button>\\n      <button class=\\\"pagination-previous\\\" [disabled]=\\\"page.current <= 1\\\" (click)=\\\"page.current = page.current - 1\\\">\\n        <clr-icon shape=\\\"angle left\\\"></clr-icon>\\n      </button>\\n      <input #currentPageInput type=\\\"text\\\" class=\\\"pagination-current\\\" [size]=\\\"page.last.toString().length\\\" [value]=\\\"page.current\\\"\\n             (keydown.enter)=\\\"updateCurrentPage($event)\\\" (blur)=\\\"updateCurrentPage($event)\\\"/>&nbsp;/&nbsp;<span>{{page.last}}</span>\\n      <button class=\\\"pagination-next\\\" [disabled]=\\\"page.current >= page.last\\\" (click)=\\\"page.current = page.current + 1\\\">\\n        <clr-icon shape=\\\"angle right\\\"></clr-icon>\\n      </button>\\n      <button class=\\\"pagination-last\\\" [disabled]=\\\"page.current >= page.last\\\" (click)=\\\"page.current = page.last\\\">\\n        <clr-icon shape=\\\"step-forward-2 up\\\"></clr-icon>\\n      </button>\\n    </div>\\n    \",\n                    host: { '[class.pagination]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridPagination.ctorParameters = function () { return [\n        { type: Page }\n    ]; };\n    ClrDatagridPagination.propDecorators = {\n        _pageSizeComponent: [{ type: ContentChild, args: [ClrDatagridPageSize,] }],\n        currentPageInputRef: [{ type: ViewChild, args: ['currentPageInput',] }],\n        pageSize: [{ type: Input, args: ['clrDgPageSize',] }],\n        totalItems: [{ type: Input, args: ['clrDgTotalItems',] }],\n        lastPage: [{ type: Input, args: ['clrDgLastPage',] }],\n        currentPage: [{ type: Input, args: ['clrDgPage',] }],\n        currentChanged: [{ type: Output, args: ['clrDgPageChange',] }]\n    };\n    return ClrDatagridPagination;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * Generic bland container serving various purposes for Datagrid.\n * For instance, it can help span a text over multiple rows in detail view.\n * @template T\n */\nvar ClrDatagridRowDetail = /** @class */ (function () {\n    function ClrDatagridRowDetail(selection, rowActionService, expand, hideableColumnService, expandableRows) {\n        this.selection = selection;\n        this.rowActionService = rowActionService;\n        this.expand = expand;\n        this.hideableColumnService = hideableColumnService;\n        this.expandableRows = expandableRows;\n        /* reference to the enum so that template can access it */\n        this.SELECTION_TYPE = SelectionType;\n        this.subscriptions = [];\n        this.replacedRow = false;\n    }\n    Object.defineProperty(ClrDatagridRowDetail.prototype, \"replace\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.expand.setReplace(!!value);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrDatagridRowDetail.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        /** @type {?} */\n        var columnsList = this.hideableColumnService.getColumns();\n        this.updateCellsForColumns(columnsList);\n        // Triggered when the Cells list changes per row-renderer\n        this.subscriptions.push(this.cells.changes.subscribe(function (cellList) {\n            /** @type {?} */\n            var columnList = _this.hideableColumnService.getColumns();\n            if (cellList.length === columnList.length) {\n                _this.updateCellsForColumns(columnList);\n            }\n        }));\n        // Used to set things up the first time but only after all the columns are ready.\n        this.subscriptions.push(this.hideableColumnService.columnListChange.subscribe(function (columnList) {\n            // Prevents cell updates when cols and cells array are not aligned\n            if (columnList.length === _this.cells.length) {\n                _this.updateCellsForColumns(columnList);\n            }\n        }));\n        this.subscriptions.push(this.expand.replace.subscribe(function (replaceChange) {\n            _this.replacedRow = replaceChange;\n        }));\n    };\n    /**\n     * @param {?} columnList\n     * @return {?}\n     */\n    ClrDatagridRowDetail.prototype.updateCellsForColumns = /**\n     * @param {?} columnList\n     * @return {?}\n     */\n    function (columnList) {\n        this.cells.forEach(function (cell, index) {\n            /** @type {?} */\n            var currentColumn = columnList[index];\n            if (currentColumn) {\n                cell.id = currentColumn.id;\n            }\n        });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDatagridRowDetail.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrDatagridRowDetail.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dg-row-detail',\n                    template: \"\\n        <ng-container *ngIf=\\\"!replacedRow\\\">\\n            <!-- space for multiselection state -->\\n            <div class=\\\"datagrid-cell datagrid-select datagrid-fixed-column\\\"\\n                *ngIf=\\\"selection.selectionType === SELECTION_TYPE.Multi\\\">\\n            </div>\\n            <!-- space for single selection state -->\\n            <div class=\\\"datagrid-cell datagrid-select datagrid-fixed-column\\\"\\n                *ngIf=\\\"selection.selectionType === SELECTION_TYPE.Single\\\">\\n            </div>\\n            <!-- space for single row action; only displayType if we have at least one actionable row in datagrid -->\\n            <div class=\\\"datagrid-cell datagrid-row-actions datagrid-fixed-column\\\"\\n                *ngIf=\\\"rowActionService.hasActionableRow\\\">\\n            </div>\\n            <!-- space for expandable caret action; only displayType if we have at least one expandable row in datagrid -->\\n            <div *ngIf=\\\"expandableRows.hasExpandableRow\\\"\\n                        class=\\\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\\\">\\n            </div>\\n        </ng-container>\\n        <ng-content></ng-content>\\n    \",\n                    host: {\n                        '[class.datagrid-row-flex]': 'true',\n                        '[class.datagrid-row-detail]': 'true',\n                        '[class.datagrid-container]': 'cells.length === 0',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDatagridRowDetail.ctorParameters = function () { return [\n        { type: Selection },\n        { type: RowActionService },\n        { type: Expand },\n        { type: HideableColumnService },\n        { type: ExpandableRowsCount }\n    ]; };\n    ClrDatagridRowDetail.propDecorators = {\n        cells: [{ type: ContentChildren, args: [ClrDatagridCell,] }],\n        replace: [{ type: Input, args: ['clrDgReplace',] }]\n    };\n    return ClrDatagridRowDetail;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar STRICT_WIDTH_CLASS = 'datagrid-fixed-width';\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatagridCellRenderer = /** @class */ (function () {\n    function DatagridCellRenderer(el, renderer, organizer) {\n        var _this = this;\n        this.el = el;\n        this.renderer = renderer;\n        this.subscriptions = [];\n        this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(function () { return _this.clearWidth(); }));\n    }\n    /**\n     * @return {?}\n     */\n    DatagridCellRenderer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @return {?}\n     */\n    DatagridCellRenderer.prototype.clearWidth = /**\n     * @return {?}\n     */\n    function () {\n        this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);\n        this.renderer.setStyle(this.el.nativeElement, 'width', null);\n    };\n    /**\n     * @param {?} strict\n     * @param {?} value\n     * @return {?}\n     */\n    DatagridCellRenderer.prototype.setWidth = /**\n     * @param {?} strict\n     * @param {?} value\n     * @return {?}\n     */\n    function (strict, value) {\n        if (strict) {\n            this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);\n        }\n        else {\n            this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);\n        }\n        this.renderer.setStyle(this.el.nativeElement, 'width', value + 'px');\n    };\n    DatagridCellRenderer.decorators = [\n        { type: Directive, args: [{ selector: 'clr-dg-cell' },] }\n    ];\n    /** @nocollapse */\n    DatagridCellRenderer.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: Renderer2 },\n        { type: DatagridRenderOrganizer }\n    ]; };\n    return DatagridCellRenderer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatagridColumnResizer = /** @class */ (function () {\n    function DatagridColumnResizer(el, renderer, organizer, domAdapter, dragDispatcher, table) {\n        this.renderer = renderer;\n        this.organizer = organizer;\n        this.domAdapter = domAdapter;\n        this.dragDispatcher = dragDispatcher;\n        this.table = table;\n        this.columnResizeBy = 0;\n        // relative to pageStartPosition\n        this.dragWithinMinWidth = false;\n        this.resizeEmitter = new EventEmitter();\n        this.subscriptions = [];\n        this.columnEl = el.nativeElement;\n    }\n    /**\n     * @return {?}\n     */\n    DatagridColumnResizer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.dragDispatcher.destroy();\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @return {?}\n     */\n    DatagridColumnResizer.prototype.ngAfterViewInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.handleTrackerEl = this.dragDispatcher.handleTrackerRef.nativeElement;\n        this.dragDispatcher.addDragListener();\n        this.subscriptions.push(this.dragDispatcher.onDragStart.subscribe(function () { return _this.dragStartHandler(); }));\n        this.subscriptions.push(this.dragDispatcher.onDragMove.subscribe(function ($event) { return _this.dragMoveHandler($event); }));\n        this.subscriptions.push(this.dragDispatcher.onDragEnd.subscribe(function () { return _this.dragEndHandler(); }));\n    };\n    /**\n     * @return {?}\n     */\n    DatagridColumnResizer.prototype.dragStartHandler = /**\n     * @return {?}\n     */\n    function () {\n        if (!this.columnMinWidth) {\n            // sets the min width only on the very first drag attempt\n            this.columnMinWidth = this.domAdapter.minWidth(this.columnEl);\n        }\n        this.renderer.setStyle(this.handleTrackerEl, 'display', 'block');\n        this.renderer.setStyle(this.handleTrackerEl, 'height', this.table.getColumnDragHeight());\n        this.renderer.setStyle(document.body, 'cursor', 'col-resize');\n        this.dragDistancePositionX = 0;\n        this.columnRectWidth = this.domAdapter.clientRect(this.columnEl).width;\n        this.pageStartPositionX = this.domAdapter.clientRect(this.columnEl).right;\n    };\n    /**\n     * @param {?} moveEvent\n     * @return {?}\n     */\n    DatagridColumnResizer.prototype.dragMoveHandler = /**\n     * @param {?} moveEvent\n     * @return {?}\n     */\n    function (moveEvent) {\n        /** @type {?} */\n        var pageMovePosition = moveEvent.pageX || moveEvent.changedTouches[0].pageX;\n        this.dragDistancePositionX = this.getPositionWithinMax(pageMovePosition - this.pageStartPositionX);\n        this.renderer.setStyle(this.handleTrackerEl, 'right', -1 * this.dragDistancePositionX + 'px');\n    };\n    /**\n     * @return {?}\n     */\n    DatagridColumnResizer.prototype.dragEndHandler = /**\n     * @return {?}\n     */\n    function () {\n        this.renderer.setStyle(this.handleTrackerEl, 'right', '0px');\n        this.renderer.setStyle(this.handleTrackerEl, 'display', 'none');\n        this.renderer.setStyle(document.body, 'cursor', 'auto');\n        if (this.dragDistancePositionX) {\n            this.columnResizeBy = this.dragDistancePositionX;\n            this.resizeEmitter.emit(this.columnRectWidth + this.columnResizeBy);\n            this.organizer.resize();\n        }\n    };\n    /**\n     * @param {?} draggedDistance\n     * @return {?}\n     */\n    DatagridColumnResizer.prototype.getPositionWithinMax = /**\n     * @param {?} draggedDistance\n     * @return {?}\n     */\n    function (draggedDistance) {\n        if (draggedDistance < 0) {\n            if (Math.abs(draggedDistance) < this.columnRectWidth - this.columnMinWidth) {\n                if (this.dragWithinMinWidth) {\n                    this.dragWithinMinWidth = false;\n                    this.renderer.removeClass(this.handleTrackerEl, 'exceeded-max');\n                }\n                return draggedDistance;\n            }\n            else {\n                if (!this.dragWithinMinWidth) {\n                    this.dragWithinMinWidth = true;\n                    this.renderer.addClass(this.handleTrackerEl, 'exceeded-max');\n                }\n                return this.columnMinWidth - this.columnRectWidth;\n            }\n        }\n        else {\n            if (this.dragWithinMinWidth) {\n                this.dragWithinMinWidth = false;\n                this.renderer.removeClass(this.handleTrackerEl, 'exceeded-max');\n            }\n            return draggedDistance;\n        }\n    };\n    DatagridColumnResizer.decorators = [\n        { type: Directive, args: [{ selector: 'clr-dg-column', providers: [DragDispatcher] },] }\n    ];\n    /** @nocollapse */\n    DatagridColumnResizer.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: Renderer2 },\n        { type: DatagridRenderOrganizer },\n        { type: DomAdapter },\n        { type: DragDispatcher },\n        { type: TableSizeService }\n    ]; };\n    DatagridColumnResizer.propDecorators = {\n        resizeEmitter: [{ type: Output, args: ['clrDgColumnResize',] }]\n    };\n    return DatagridColumnResizer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatagridHeaderRenderer = /** @class */ (function () {\n    function DatagridHeaderRenderer(el, renderer, organizer, domAdapter, columnResizer) {\n        var _this = this;\n        this.el = el;\n        this.renderer = renderer;\n        this.organizer = organizer;\n        this.domAdapter = domAdapter;\n        this.columnResizer = columnResizer;\n        this.widthSet = false;\n        this.subscriptions = [];\n        this.subscriptions.push(this.organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(function () { return _this.clearWidth(); }));\n        this.subscriptions.push(this.organizer\n            .filterRenderSteps(DatagridRenderStep.DETECT_STRICT_WIDTHS)\n            .subscribe(function () { return _this.detectStrictWidth(); }));\n    }\n    /**\n     * @return {?}\n     */\n    DatagridHeaderRenderer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @return {?}\n     */\n    DatagridHeaderRenderer.prototype.clearWidth = /**\n     * @return {?}\n     */\n    function () {\n        // remove the width only if we set it, and it is not changed by dragging.\n        if (this.widthSet && !this.columnResizer.columnResizeBy) {\n            this.renderer.setStyle(this.el.nativeElement, 'width', null);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    DatagridHeaderRenderer.prototype.detectStrictWidth = /**\n     * @return {?}\n     */\n    function () {\n        if (this.columnResizer.columnResizeBy) {\n            this.strictWidth = this.columnResizer.columnRectWidth + this.columnResizer.columnResizeBy;\n        }\n        else {\n            this.strictWidth = this.domAdapter.userDefinedWidth(this.el.nativeElement);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    DatagridHeaderRenderer.prototype.computeWidth = /**\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var width = this.strictWidth;\n        if (!width) {\n            width = this.domAdapter.scrollWidth(this.el.nativeElement);\n        }\n        return width;\n    };\n    /**\n     * @param {?} width\n     * @return {?}\n     */\n    DatagridHeaderRenderer.prototype.setWidth = /**\n     * @param {?} width\n     * @return {?}\n     */\n    function (width) {\n        if (this.strictWidth) {\n            if (this.columnResizer.columnResizeBy) {\n                this.renderer.setStyle(this.el.nativeElement, 'width', width + 'px');\n                this.columnResizer.columnResizeBy = 0;\n                this.widthSet = false;\n            }\n            // Don't set width if there is a user-defined one. Just add the strict width class.\n            this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);\n            return;\n        }\n        this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);\n        this.renderer.setStyle(this.el.nativeElement, 'width', width + 'px');\n        this.widthSet = true;\n    };\n    DatagridHeaderRenderer.decorators = [\n        { type: Directive, args: [{ selector: 'clr-dg-column' },] }\n    ];\n    /** @nocollapse */\n    DatagridHeaderRenderer.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: Renderer2 },\n        { type: DatagridRenderOrganizer },\n        { type: DomAdapter },\n        { type: DatagridColumnResizer }\n    ]; };\n    return DatagridHeaderRenderer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar NoopDomAdapter = /** @class */ (function () {\n    function NoopDomAdapter() {\n    }\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    NoopDomAdapter.prototype.userDefinedWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return 0;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    NoopDomAdapter.prototype.scrollBarWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return 0;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    NoopDomAdapter.prototype.scrollWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return 0;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    NoopDomAdapter.prototype.computedHeight = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return 0;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    NoopDomAdapter.prototype.clientRect = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return {\n            top: 0,\n            bottom: 0,\n            left: 0,\n            right: 0,\n            width: 0,\n            height: 0,\n        };\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    NoopDomAdapter.prototype.minWidth = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) {\n        return 0;\n    };\n    /**\n     * @param {?} element\n     * @return {?}\n     */\n    NoopDomAdapter.prototype.focus = /**\n     * @param {?} element\n     * @return {?}\n     */\n    function (element) { };\n    NoopDomAdapter.decorators = [\n        { type: Injectable }\n    ];\n    return NoopDomAdapter;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// Fixes build error\n// @dynamic (https://github.com/angular/angular/issues/19698#issuecomment-338340211)\n/** @type {?} */\nvar domAdapterFactory = function (platformId) {\n    if (isPlatformBrowser(platformId)) {\n        return new DomAdapter();\n    }\n    else {\n        return new NoopDomAdapter();\n    }\n};\n// Fixes build error\n// @dynamic (https://github.com/angular/angular/issues/19698#issuecomment-338340211)\n/**\n * @template T\n */\nvar DatagridMainRenderer = /** @class */ (function () {\n    function DatagridMainRenderer(organizer, items, page, domAdapter, el, renderer, tableSizeService) {\n        var _this = this;\n        this.organizer = organizer;\n        this.items = items;\n        this.page = page;\n        this.domAdapter = domAdapter;\n        this.el = el;\n        this.renderer = renderer;\n        this.tableSizeService = tableSizeService;\n        this._heightSet = false;\n        this.subscriptions = [];\n        /**\n         * Indicates if we want to re-compute columns width. This should only happen:\n         * 1) When headers change, with columns being added or removed\n         * 2) When rows are lazily loaded for the first time\n         */\n        this.columnsSizesStable = false;\n        this.shouldStabilizeColumns = true;\n        this.subscriptions.push(this.organizer\n            .filterRenderSteps(DatagridRenderStep.COMPUTE_COLUMN_WIDTHS)\n            .subscribe(function () { return _this.computeHeadersWidth(); }));\n        this.subscriptions.push(this.page.sizeChange.subscribe(function () {\n            if (_this._heightSet) {\n                _this.resetDatagridHeight();\n            }\n        }));\n        this.subscriptions.push(this.items.change.subscribe(function () { return (_this.shouldStabilizeColumns = true); }));\n    }\n    /**\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.subscriptions.push(this.headers.changes.subscribe(function () {\n            // TODO: only re-stabilize if a column was added or removed. Reordering is fine.\n            _this.columnsSizesStable = false;\n            _this.stabilizeColumns();\n        }));\n    };\n    // Initialize and set Table width for horizontal scrolling here.\n    // Initialize and set Table width for horizontal scrolling here.\n    /**\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.ngAfterViewInit = \n    // Initialize and set Table width for horizontal scrolling here.\n    /**\n     * @return {?}\n     */\n    function () {\n        this.tableSizeService.table = this.el;\n    };\n    /**\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.ngAfterViewChecked = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this.shouldStabilizeColumns) {\n            this.stabilizeColumns();\n        }\n        if (this.shouldComputeHeight()) {\n            setTimeout(function () {\n                _this.computeDatagridHeight();\n            });\n        }\n    };\n    /**\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.shouldComputeHeight = /**\n     * @return {?}\n     */\n    function () {\n        if (!this._heightSet && this.page.size > 0) {\n            if (this.items.displayed.length === this.page.size) {\n                return true;\n            }\n        }\n        return false;\n    };\n    /**\n     * Computes the height of the datagrid.\n     *\n     * NOTE: We had to choose to set the height instead of the min-height because\n     * IE 11 requires the height on the parent for the children flex grow/shrink properties to work.\n     * When we used min-height, 1 1 auto doesn't used to work in IE11 :-(\n     * But this doesn't affect the fix. It works in both fixed & variable height datagrids.\n     *\n     * Refer: http://stackoverflow.com/questions/24396205/flex-grow-not-working-in-internet-explorer-11-0\n     */\n    /**\n     * Computes the height of the datagrid.\n     *\n     * NOTE: We had to choose to set the height instead of the min-height because\n     * IE 11 requires the height on the parent for the children flex grow/shrink properties to work.\n     * When we used min-height, 1 1 auto doesn't used to work in IE11 :-(\n     * But this doesn't affect the fix. It works in both fixed & variable height datagrids.\n     *\n     * Refer: http://stackoverflow.com/questions/24396205/flex-grow-not-working-in-internet-explorer-11-0\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.computeDatagridHeight = /**\n     * Computes the height of the datagrid.\n     *\n     * NOTE: We had to choose to set the height instead of the min-height because\n     * IE 11 requires the height on the parent for the children flex grow/shrink properties to work.\n     * When we used min-height, 1 1 auto doesn't used to work in IE11 :-(\n     * But this doesn't affect the fix. It works in both fixed & variable height datagrids.\n     *\n     * Refer: http://stackoverflow.com/questions/24396205/flex-grow-not-working-in-internet-explorer-11-0\n     * @return {?}\n     */\n    function () {\n        // IE doesn't return correct value for getComputedStyle(element).getPropertyValue(\"height\")\n        /** @type {?} */\n        var value = this.domAdapter.clientRect(this.el.nativeElement).height;\n        this.renderer.setStyle(this.el.nativeElement, 'height', value + 'px');\n        this._heightSet = true;\n    };\n    /**\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.resetDatagridHeight = /**\n     * @return {?}\n     */\n    function () {\n        this.renderer.setStyle(this.el.nativeElement, 'height', '');\n        this._heightSet = false;\n    };\n    /**\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * Makes each header compute its width.\n     */\n    /**\n     * Makes each header compute its width.\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.computeHeadersWidth = /**\n     * Makes each header compute its width.\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        /** @type {?} */\n        var nbColumns = this.headers.length;\n        /** @type {?} */\n        var allStrict = true;\n        this.headers.forEach(function (header, index) {\n            // On the last header column check whether all columns have strict widths.\n            // If all columns have strict widths, remove the strict width from the last column and make it the column's\n            // minimum width so that when all previous columns shrink, it will get a flexible width and cover the empty\n            // gap in the Datagrid.\n            if (!header.strictWidth) {\n                allStrict = false;\n            }\n            if (nbColumns === index + 1 && allStrict) {\n                delete header.strictWidth;\n            }\n            _this.organizer.widths[index] = { px: header.computeWidth(), strict: !!header.strictWidth };\n        });\n        this.headers.forEach(function (header, index) { return header.setWidth(_this.organizer.widths[index].px); });\n    };\n    /**\n     * Triggers a whole re-rendring cycle to set column sizes, if needed.\n     */\n    /**\n     * Triggers a whole re-rendring cycle to set column sizes, if needed.\n     * @return {?}\n     */\n    DatagridMainRenderer.prototype.stabilizeColumns = /**\n     * Triggers a whole re-rendring cycle to set column sizes, if needed.\n     * @return {?}\n     */\n    function () {\n        this.shouldStabilizeColumns = false;\n        if (this.columnsSizesStable) {\n            // Nothing to do.\n            return;\n        }\n        // Resize when the rows are loaded.\n        if (this.items.displayed.length > 0) {\n            this.organizer.resize();\n            this.columnsSizesStable = true;\n        }\n    };\n    DatagridMainRenderer.decorators = [\n        { type: Directive, args: [{\n                    selector: 'clr-datagrid',\n                    providers: [{ provide: DomAdapter, useFactory: domAdapterFactory, deps: [PLATFORM_ID] }],\n                },] }\n    ];\n    /** @nocollapse */\n    DatagridMainRenderer.ctorParameters = function () { return [\n        { type: DatagridRenderOrganizer },\n        { type: Items },\n        { type: Page },\n        { type: DomAdapter },\n        { type: ElementRef },\n        { type: Renderer2 },\n        { type: TableSizeService }\n    ]; };\n    DatagridMainRenderer.propDecorators = {\n        headers: [{ type: ContentChildren, args: [DatagridHeaderRenderer,] }],\n        columns: [{ type: ContentChildren, args: [ClrDatagridColumn,] }]\n    };\n    return DatagridMainRenderer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar DatagridRowRenderer = /** @class */ (function () {\n    function DatagridRowRenderer(organizer) {\n        var _this = this;\n        this.organizer = organizer;\n        this.subscriptions = [];\n        this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.ALIGN_COLUMNS).subscribe(function () { return _this.setWidths(); }));\n    }\n    /**\n     * @return {?}\n     */\n    DatagridRowRenderer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    /**\n     * @return {?}\n     */\n    DatagridRowRenderer.prototype.setWidths = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this.organizer.widths.length !== this.cells.length) {\n            return;\n        }\n        this.cells.forEach(function (cell, index) {\n            /** @type {?} */\n            var width = _this.organizer.widths[index];\n            cell.setWidth(width.strict, width.px);\n        });\n    };\n    /**\n     * @return {?}\n     */\n    DatagridRowRenderer.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.cells.changes.subscribe(function () {\n            _this.setWidths();\n        });\n    };\n    /**\n     * @return {?}\n     */\n    DatagridRowRenderer.prototype.ngAfterViewInit = /**\n     * @return {?}\n     */\n    function () {\n        this.setWidths();\n    };\n    DatagridRowRenderer.decorators = [\n        { type: Directive, args: [{ selector: 'clr-dg-row, clr-dg-row-detail' },] }\n    ];\n    /** @nocollapse */\n    DatagridRowRenderer.ctorParameters = function () { return [\n        { type: DatagridRenderOrganizer }\n    ]; };\n    DatagridRowRenderer.propDecorators = {\n        cells: [{ type: ContentChildren, args: [DatagridCellRenderer,] }]\n    };\n    return DatagridRowRenderer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_DATAGRID_DIRECTIVES = [\n    // Core\n    ClrDatagrid,\n    ClrDatagridActionBar,\n    ClrDatagridActionOverflow,\n    ClrDatagridColumn,\n    ClrDatagridColumnToggle,\n    ClrDatagridHideableColumn,\n    ClrDatagridFilter,\n    ClrDatagridItems,\n    ClrDatagridItemsTrackBy,\n    ClrDatagridRow,\n    ClrDatagridRowDetail,\n    DatagridDetailRegisterer,\n    ClrDatagridCell,\n    ClrDatagridFooter,\n    ClrDatagridPagination,\n    ClrDatagridPageSize,\n    ClrDatagridPlaceholder,\n    ClrDatagridColumnToggleButton,\n    ClrDatagridColumnToggleTitle,\n    WrappedCell,\n    WrappedColumn,\n    WrappedRow,\n    // Renderers\n    DatagridMainRenderer,\n    DatagridHeaderRenderer,\n    DatagridColumnResizer,\n    DatagridRowRenderer,\n    DatagridCellRenderer,\n    // Chocolate\n    DatagridWillyWonka,\n    ActionableOompaLoompa,\n    ExpandableOompaLoompa,\n    // Animation hack\n    DatagridRowExpandAnimation,\n    // Built-in shortcuts\n    DatagridStringFilter,\n];\nvar ClrDatagridModule = /** @class */ (function () {\n    function ClrDatagridModule() {\n    }\n    ClrDatagridModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [\n                        CommonModule,\n                        ClrIconModule,\n                        ClrFormsModule,\n                        FormsModule,\n                        ClrCommonPopoverModule,\n                        ClrLoadingModule,\n                        ClrOutsideClickModule,\n                    ],\n                    declarations: [CLR_DATAGRID_DIRECTIVES],\n                    exports: [CLR_DATAGRID_DIRECTIVES, ClrIfExpandModule],\n                    entryComponents: [WrappedCell, WrappedColumn, WrappedRow],\n                },] }\n    ];\n    return ClrDatagridModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrStackBlock = /** @class */ (function () {\n    /*\n       * This would be more efficient with @ContentChildren, with the parent ClrStackBlock\n       * querying for children StackBlocks, but this feature is not available when downgrading\n       * the component for Angular 1.\n       */\n    function ClrStackBlock(parent, commonStrings) {\n        this.parent = parent;\n        this.commonStrings = commonStrings;\n        this.expanded = false;\n        this.expandedChange = new EventEmitter(false);\n        this.expandable = false;\n        this.focused = false;\n        this._changedChildren = 0;\n        this._fullyInitialized = false;\n        this._changed = false;\n        if (parent) {\n            parent.addChild();\n        }\n    }\n    Object.defineProperty(ClrStackBlock.prototype, \"getChangedValue\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._changed || (this._changedChildren > 0 && !this.expanded);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrStackBlock.prototype, \"setChangedValue\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._changed = value;\n            if (this.parent && this._fullyInitialized) {\n                if (value) {\n                    this.parent._changedChildren++;\n                }\n                else {\n                    this.parent._changedChildren--;\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrStackBlock.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        // in order to access the parent ClrStackBlock's properties,\n        // the child ClrStackBlock  has to be fully initialized at first.\n        this._fullyInitialized = true;\n    };\n    /**\n     * @return {?}\n     */\n    ClrStackBlock.prototype.addChild = /**\n     * @return {?}\n     */\n    function () {\n        this.expandable = true;\n    };\n    /**\n     * @return {?}\n     */\n    ClrStackBlock.prototype.toggleExpand = /**\n     * @return {?}\n     */\n    function () {\n        if (this.expandable) {\n            this.expanded = !this.expanded;\n            this.expandedChange.emit(this.expanded);\n        }\n    };\n    Object.defineProperty(ClrStackBlock.prototype, \"caretDirection\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.expanded ? 'down' : 'right';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrStackBlock.prototype, \"caretTitle\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.expanded ? this.commonStrings.collapse : this.commonStrings.expand;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrStackBlock.prototype, \"role\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.expandable ? 'button' : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrStackBlock.prototype, \"tabIndex\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.expandable ? '0' : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrStackBlock.prototype, \"onStackLabelFocus\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.expandable && !this.expanded && this.focused;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrStackBlock.prototype, \"ariaExpanded\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (!this.expandable) {\n                return null;\n            }\n            else {\n                return this.expanded ? 'true' : 'false';\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrStackBlock.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-stack-block',\n                    template: \"\\n    <dt class=\\\"stack-block-label\\\"\\n        (click)=\\\"toggleExpand()\\\"\\n        (keyup.enter)=\\\"toggleExpand()\\\"\\n        (keyup.space)=\\\"toggleExpand()\\\"\\n        (focus)=\\\"focused = true\\\"\\n        (blur)=\\\"focused = false\\\"\\n        [attr.role]=\\\"role\\\"\\n        [attr.tabindex]=\\\"tabIndex\\\"\\n        [attr.aria-expanded]=\\\"ariaExpanded\\\">\\n      <clr-icon shape=\\\"caret\\\"\\n                class=\\\"stack-block-caret\\\"\\n                *ngIf=\\\"expandable\\\"\\n                [attr.dir]=\\\"caretDirection\\\"\\n                [attr.title]=\\\"caretTitle\\\"></clr-icon>\\n      <ng-content select=\\\"clr-stack-label\\\"></ng-content>\\n    </dt>\\n    <dd class=\\\"stack-block-content\\\">\\n      <ng-content></ng-content>\\n    </dd>\\n    <!-- FIXME: remove this string concatenation when boolean states are supported -->\\n    <div [@collapse]=\\\"''+!expanded\\\" class=\\\"stack-children\\\" >\\n      <ng-content select=\\\"clr-stack-block\\\"></ng-content>\\n    </div>\\n  \",\n                    // Make sure the host has the proper class for styling purposes\n                    host: { '[class.stack-block]': 'true' },\n                    animations: [\n                        trigger('collapse', [\n                            state('true', style({ height: 0, display: 'none' })),\n                            transition('true => false', [animate('0.2s ease-in-out', style({ height: '*', display: '*' }))]),\n                            transition('false => true', [style({ height: '*', display: '*' }), animate('0.2s ease-in-out')]),\n                        ]),\n                    ],\n                    styles: [\"\\n        :host { display: block; }\\n    \"]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrStackBlock.ctorParameters = function () { return [\n        { type: ClrStackBlock, decorators: [{ type: SkipSelf }, { type: Optional }] },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrStackBlock.propDecorators = {\n        expanded: [{ type: HostBinding, args: ['class.stack-block-expanded',] }, { type: Input, args: ['clrSbExpanded',] }],\n        expandedChange: [{ type: Output, args: ['clrSbExpandedChange',] }],\n        expandable: [{ type: HostBinding, args: ['class.stack-block-expandable',] }, { type: Input, args: ['clrSbExpandable',] }],\n        getChangedValue: [{ type: HostBinding, args: ['class.stack-block-changed',] }],\n        setChangedValue: [{ type: Input, args: ['clrSbNotifyChange',] }],\n        onStackLabelFocus: [{ type: HostBinding, args: ['class.on-focus',] }]\n    };\n    return ClrStackBlock;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrStackView = /** @class */ (function () {\n    function ClrStackView() {\n        /**\n         * Undocumented experimental feature: inline editing.\n         */\n        this.editable = false;\n        this.save = new EventEmitter(false);\n        this._editMode = false;\n        this.editingChange = new EventEmitter(false);\n        /**\n         * End of undocumented experimental feature.\n         */\n    }\n    Object.defineProperty(ClrStackView.prototype, \"editing\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.editable && this._editMode;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this.editable) {\n                this._editMode = value;\n                this.editingChange.emit(value);\n                if (!value) {\n                    this.save.emit(null);\n                }\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrStackView.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-stack-view',\n                    template: \"\\n        <ng-content select=\\\"clr-stack-header\\\"></ng-content>\\n        <dl class=\\\"stack-view\\\"><ng-content></ng-content></dl>\\n    \",\n                    styles: [\"\\n        :host { display: block; }\\n    \"]\n                }] }\n    ];\n    ClrStackView.propDecorators = {\n        save: [{ type: Output, args: ['clrStackSave',] }]\n    };\n    return ClrStackView;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrStackHeader = /** @class */ (function () {\n    function ClrStackHeader(stackView) {\n        this.stackView = stackView;\n    }\n    ClrStackHeader.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-stack-header',\n                    template: \"\\n        <h4 class=\\\"stack-header\\\">\\n            <span class=\\\"stack-title\\\"><ng-content></ng-content></span>\\n            \\n            <span class=\\\"stack-actions\\\">\\n                <ng-content select=\\\".stack-action\\\"></ng-content>\\n                <!-- Undocumented experimental feature: inline editing. -->\\n                <button *ngIf=\\\"stackView.editable\\\" class=\\\"stack-action btn btn-sm btn-link\\\" \\n                        (click)=\\\"stackView.editing = !stackView.editing\\\" type=\\\"button\\\">\\n                        Edit\\n                </button>\\n                <!-- End of undocumented experimental feature. -->\\n            </span>\\n        </h4>\\n    \",\n                    styles: [\"\\n        :host { display: block; }\\n    \"]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrStackHeader.ctorParameters = function () { return [\n        { type: ClrStackView }\n    ]; };\n    return ClrStackHeader;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar StackControl = /** @class */ (function () {\n    function StackControl(stackView) {\n        var _this = this;\n        this.stackView = stackView;\n        this.modelChange = new EventEmitter(false);\n        // Make the ClrStackView editable, since it contains a StackControl\n        this.stackView.editable = true;\n        this.stackView.editingChange.subscribe(function (editing) {\n            // Edit mode was closed\n            if (!editing) {\n                _this.modelChange.emit(_this.model);\n            }\n        });\n    }\n    return StackControl;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrStackInput = /** @class */ (function (_super) {\n    __extends(ClrStackInput, _super);\n    function ClrStackInput(stackView) {\n        var _this = _super.call(this, stackView) || this;\n        _this.stackView = stackView;\n        _this.type = 'text';\n        return _this;\n    }\n    ClrStackInput.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-stack-input',\n                    inputs: ['model: clrModel', 'type'],\n                    outputs: ['modelChange: clrModelChange'],\n                    template: \"\\n        <span *ngIf=\\\"!stackView.editing\\\">{{model}}</span>\\n        <input [type]=\\\"type\\\" *ngIf=\\\"stackView.editing\\\" [(ngModel)]=\\\"model\\\"/>\\n    \"\n                }] }\n    ];\n    /** @nocollapse */\n    ClrStackInput.ctorParameters = function () { return [\n        { type: ClrStackView }\n    ]; };\n    return ClrStackInput;\n}(StackControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrStackSelect = /** @class */ (function (_super) {\n    __extends(ClrStackSelect, _super);\n    function ClrStackSelect(stackView) {\n        var _this = _super.call(this, stackView) || this;\n        _this.stackView = stackView;\n        return _this;\n    }\n    ClrStackSelect.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-stack-select',\n                    inputs: ['model: clrModel'],\n                    outputs: ['modelChange: clrModelChange'],\n                    template: \"\\n        <span *ngIf=\\\"!stackView.editing\\\">{{model}}</span>\\n        <div class=\\\"select\\\" *ngIf=\\\"stackView.editing\\\" >\\n            <select [(ngModel)]=\\\"model\\\">\\n                <ng-content></ng-content>\\n            </select>\\n        </div>\\n    \"\n                }] }\n    ];\n    /** @nocollapse */\n    ClrStackSelect.ctorParameters = function () { return [\n        { type: ClrStackView }\n    ]; };\n    return ClrStackSelect;\n}(StackControl));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrStackViewCustomTags = /** @class */ (function () {\n    function ClrStackViewCustomTags() {\n    }\n    ClrStackViewCustomTags.decorators = [\n        { type: Directive, args: [{ selector: 'clr-stack-label, clr-stack-content' },] }\n    ];\n    return ClrStackViewCustomTags;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_STACK_VIEW_DIRECTIVES = [\n    ClrStackView,\n    ClrStackHeader,\n    ClrStackBlock,\n    ClrStackViewCustomTags,\n    /**\n     * Undocumented experimental feature: inline editing.\n     */\n    ClrStackInput,\n    ClrStackSelect,\n];\nvar ClrStackViewModule = /** @class */ (function () {\n    function ClrStackViewModule() {\n    }\n    ClrStackViewModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, FormsModule, ClrIconModule],\n                    declarations: [CLR_STACK_VIEW_DIRECTIVES],\n                    exports: [CLR_STACK_VIEW_DIRECTIVES],\n                },] }\n    ];\n    return ClrStackViewModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar NB_INSTANCES = 0;\n/** @type {?} */\nvar UNIQUE_ID = new InjectionToken('UNIQUE_ID');\n/**\n * @return {?}\n */\nfunction uniqueIdFactory() {\n    return 'clr-id-' + NB_INSTANCES++;\n}\n/** @type {?} */\nvar UNIQUE_ID_PROVIDER = {\n    provide: UNIQUE_ID,\n    useFactory: uniqueIdFactory,\n};\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/** @enum {number} */\nvar ClrSelectedState = {\n    // WARNING! Unselected has the value 0,\n    // so it's actually the only one that will evaluate to false if cast to a boolean.\n    // Don't mess with the order!\n    UNSELECTED: 0,\n    SELECTED: 1,\n    INDETERMINATE: 2,\n};\nClrSelectedState[ClrSelectedState.UNSELECTED] = 'UNSELECTED';\nClrSelectedState[ClrSelectedState.SELECTED] = 'SELECTED';\nClrSelectedState[ClrSelectedState.INDETERMINATE] = 'INDETERMINATE';\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @abstract\n * @template T\n */\nvar /**\n * @abstract\n * @template T\n */\nTreeNodeModel = /** @class */ (function () {\n    function TreeNodeModel() {\n        this.selected = new BehaviorSubject(ClrSelectedState.UNSELECTED);\n        /*\n           * Being able to push this down to the RecursiveTreeNodeModel would require too much work on the angular components\n           * right now for them to know which kind of model they are using. So I'm lifting the public properties to this\n           * abstract parent class for now and we can revisit it later, when we're not facing such a close deadline.\n           */\n        this.loading = false;\n    }\n    /**\n     * @return {?}\n     */\n    TreeNodeModel.prototype.destroy = /**\n     * @return {?}\n     */\n    function () {\n        // Just to be safe\n        this.selected.complete();\n    };\n    // Propagate by default when eager, don't propagate in the lazy-loaded tree.\n    // Propagate by default when eager, don't propagate in the lazy-loaded tree.\n    /**\n     * @param {?} state\n     * @param {?} propagateUp\n     * @param {?} propagateDown\n     * @return {?}\n     */\n    TreeNodeModel.prototype.setSelected = \n    // Propagate by default when eager, don't propagate in the lazy-loaded tree.\n    /**\n     * @param {?} state\n     * @param {?} propagateUp\n     * @param {?} propagateDown\n     * @return {?}\n     */\n    function (state$$1, propagateUp, propagateDown) {\n        if (state$$1 === this.selected.value) {\n            return;\n        }\n        this.selected.next(state$$1);\n        if (propagateDown && state$$1 !== ClrSelectedState.INDETERMINATE && this.children) {\n            this.children.forEach(function (child) { return child.setSelected(state$$1, false, true); });\n        }\n        if (propagateUp && this.parent) {\n            this.parent._updateSelectionFromChildren();\n        }\n    };\n    /**\n     * @param {?} propagate\n     * @return {?}\n     */\n    TreeNodeModel.prototype.toggleSelection = /**\n     * @param {?} propagate\n     * @return {?}\n     */\n    function (propagate) {\n        // Both unselected and indeterminate toggle to selected\n        /** @type {?} */\n        var newState = this.selected.value === ClrSelectedState.SELECTED ? ClrSelectedState.UNSELECTED : ClrSelectedState.SELECTED;\n        // NOTE: we always propagate selection up in this method because it is only called when the user takes an action.\n        // It should never be called from lifecycle hooks or app-provided inputs.\n        this.setSelected(newState, true, propagate);\n    };\n    /**\n     * @return {?}\n     */\n    TreeNodeModel.prototype.computeSelectionStateFromChildren = /**\n     * @return {?}\n     */\n    function () {\n        var e_1, _a;\n        /** @type {?} */\n        var oneSelected = false;\n        /** @type {?} */\n        var oneUnselected = false;\n        try {\n            // Using a good old for loop to exit as soon as we can tell, for better performance on large trees.\n            for (var _b = __values(this.children), _c = _b.next(); !_c.done; _c = _b.next()) {\n                var child = _c.value;\n                switch (child.selected.value) {\n                    case ClrSelectedState.INDETERMINATE:\n                        return ClrSelectedState.INDETERMINATE;\n                    case ClrSelectedState.SELECTED:\n                        oneSelected = true;\n                        if (oneUnselected) {\n                            return ClrSelectedState.INDETERMINATE;\n                        }\n                        break;\n                    case ClrSelectedState.UNSELECTED:\n                    default:\n                        // Default is the same as unselected, in case an undefined somehow made it all the way here.\n                        oneUnselected = true;\n                        if (oneSelected) {\n                            return ClrSelectedState.INDETERMINATE;\n                        }\n                        break;\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        if (!oneSelected) {\n            return ClrSelectedState.UNSELECTED;\n        }\n        else if (!oneUnselected) {\n            return ClrSelectedState.SELECTED;\n        }\n    };\n    /*\n     * Internal, but needs to be called by other nodes\n     */\n    /*\n       * Internal, but needs to be called by other nodes\n       */\n    /**\n     * @return {?}\n     */\n    TreeNodeModel.prototype._updateSelectionFromChildren = /*\n       * Internal, but needs to be called by other nodes\n       */\n    /**\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var newState = this.computeSelectionStateFromChildren();\n        if (newState === this.selected.value) {\n            return;\n        }\n        this.selected.next(newState);\n        if (this.parent) {\n            this.parent._updateSelectionFromChildren();\n        }\n    };\n    return TreeNodeModel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * A declarative model is built by traversing the Angular component tree.\n * Declarative = Tree node components dictate the model\n */\n/**\n * @template T\n */\nvar /*\n * A declarative model is built by traversing the Angular component tree.\n * Declarative = Tree node components dictate the model\n */\n/**\n * @template T\n */\nDeclarativeTreeNodeModel = /** @class */ (function (_super) {\n    __extends(DeclarativeTreeNodeModel, _super);\n    function DeclarativeTreeNodeModel(parent) {\n        var _this = _super.call(this) || this;\n        _this.parent = parent;\n        if (parent) {\n            parent._addChild(_this);\n        }\n        _this.children = [];\n        return _this;\n    }\n    /**\n     * @param {?} child\n     * @return {?}\n     */\n    DeclarativeTreeNodeModel.prototype._addChild = /**\n     * @param {?} child\n     * @return {?}\n     */\n    function (child) {\n        this.children.push(child);\n    };\n    /**\n     * @param {?} child\n     * @return {?}\n     */\n    DeclarativeTreeNodeModel.prototype._removeChild = /**\n     * @param {?} child\n     * @return {?}\n     */\n    function (child) {\n        /** @type {?} */\n        var index = this.children.indexOf(child);\n        if (index > -1) {\n            this.children.splice(index, 1);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    DeclarativeTreeNodeModel.prototype.destroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.parent) {\n            this.parent._removeChild(this);\n        }\n        _super.prototype.destroy.call(this);\n    };\n    return DeclarativeTreeNodeModel;\n}(TreeNodeModel));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar TreeFeaturesService = /** @class */ (function () {\n    function TreeFeaturesService() {\n        this.selectable = false;\n        this.eager = true;\n    }\n    TreeFeaturesService.decorators = [\n        { type: Injectable }\n    ];\n    return TreeFeaturesService;\n}());\n/**\n * @template T\n * @param {?} existing\n * @return {?}\n */\nfunction treeFeaturesFactory(existing) {\n    return existing || new TreeFeaturesService();\n}\n/** @type {?} */\nvar TREE_FEATURES_PROVIDER = {\n    provide: TreeFeaturesService,\n    useFactory: treeFeaturesFactory,\n    /*\n       * The Optional + SkipSelf pattern ensures that in case of nested components, only the root one will\n       * instantiate a new service and all its children will reuse the root's instance.\n       * If there are several roots (in this case, several independent trees on a page), each root will instantiate\n       * its own service so they won't interfere with one another.\n       *\n       * TL;DR - Optional + SkipSelf = 1 instance of TreeFeaturesService per tree.\n       */\n    deps: [[new Optional(), new SkipSelf(), TreeFeaturesService]],\n};\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrTreeNode = /** @class */ (function () {\n    function ClrTreeNode(nodeId, parent, featuresService, expandService, commonStrings, injector) {\n        this.nodeId = nodeId;\n        this.featuresService = featuresService;\n        this.expandService = expandService;\n        this.commonStrings = commonStrings;\n        this.STATES = ClrSelectedState;\n        // We need an async EventEmitter or we will trigger chocolate errors like it's 2016.\n        this.selectedChange = new EventEmitter(true);\n        this.expandedChange = new EventEmitter();\n        this.subscriptions = [];\n        if (this.featuresService.recursion) {\n            // I'm completely stuck, we have to hack into private properties until either\n            // https://github.com/angular/angular/issues/14935 or https://github.com/angular/angular/issues/15998\n            // are fixed\n            this._model = ((/** @type {?} */ (injector))).view.context.clrModel;\n        }\n        else {\n            // Force cast for now, not sure how to tie the correct type here to featuresService.recursion\n            this._model = new DeclarativeTreeNodeModel(parent ? (/** @type {?} */ (parent._model)) : null);\n        }\n    }\n    /**\n     * @return {?}\n     */\n    ClrTreeNode.prototype.isExpandable = /**\n     * @return {?}\n     */\n    function () {\n        if (typeof this.expandable !== 'undefined') {\n            return this.expandable;\n        }\n        return !!this.expandService.expandable || this._model.children.length > 0;\n    };\n    Object.defineProperty(ClrTreeNode.prototype, \"selected\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._model.selected.value;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.featuresService.selectable = true;\n            // Gracefully handle falsy states like null or undefined because it's just easier than answering questions.\n            // This shouldn't happen with strict typing on the app's side, but it's not up to us.\n            if (value === null || typeof value === 'undefined') {\n                value = ClrSelectedState.UNSELECTED;\n            }\n            // We match booleans to the corresponding ClrSelectedState\n            if (typeof value === 'boolean') {\n                value = value ? ClrSelectedState.SELECTED : ClrSelectedState.UNSELECTED;\n            }\n            // We propagate only if the tree is in smart mode\n            this._model.setSelected(value, this.featuresService.eager, this.featuresService.eager);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTreeNode.prototype, \"treeNodeRole\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._model.parent ? 'treeitem' : 'tree';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTreeNode.prototype, \"rootAriaMultiSelectable\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (this._model.parent || !this.featuresService.selectable) {\n                return null;\n            }\n            else {\n                return true;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTreeNode.prototype, \"ariaSelected\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.featuresService.selectable ? this._model.selected.value === ClrSelectedState.SELECTED : null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTreeNode.prototype, \"expanded\", {\n        // I'm caving on this, for tree nodes I think we can tolerate having a two-way binding on the component\n        // rather than enforce the clrIfExpanded structural directive for dynamic cases. Mostly because for the smart\n        // case, you can't use a structural directive, it would need to go on an ng-container.\n        get: \n        // I'm caving on this, for tree nodes I think we can tolerate having a two-way binding on the component\n        // rather than enforce the clrIfExpanded structural directive for dynamic cases. Mostly because for the smart\n        // case, you can't use a structural directive, it would need to go on an ng-container.\n        /**\n         * @return {?}\n         */\n        function () {\n            return this.expandService.expanded;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.expandService.expanded = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrTreeNode.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.subscriptions.push(this._model.selected.subscribe(function (value) { return _this.selectedChange.emit(value); }));\n        this.subscriptions.push(this.expandService.expandChange.subscribe(function (value) { return _this.expandedChange.emit(value); }));\n    };\n    /**\n     * @return {?}\n     */\n    ClrTreeNode.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._model.destroy();\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrTreeNode.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tree-node',\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<div class=\\\"clr-tree-node-content-container\\\">\\n  <button\\n    *ngIf=\\\"isExpandable() && !_model.loading && !expandService.loading\\\"\\n    type=\\\"button\\\"\\n    class=\\\"clr-treenode-caret\\\"\\n    (click)=\\\"expandService.toggle()\\\"\\n    [attr.aria-expanded]=\\\"expandService.expanded\\\">\\n    <clr-icon\\n      class=\\\"clr-treenode-caret-icon\\\"\\n      shape=\\\"caret\\\"\\n      [attr.dir]=\\\"expandService.expanded ? 'down' : 'right'\\\"\\n      [attr.title]=\\\"expandService.expanded ? commonStrings.collapse : commonStrings.expand\\\"></clr-icon>\\n  </button>\\n  <div class=\\\"clr-treenode-spinner-container\\\" *ngIf=\\\"expandService.loading || _model.loading\\\">\\n        <span class=\\\"clr-treenode-spinner spinner\\\"></span>\\n  </div>\\n  <div class=\\\"clr-checkbox-wrapper clr-treenode-checkbox\\\" *ngIf=\\\"featuresService.selectable\\\">\\n    <input type=\\\"checkbox\\\" id=\\\"{{nodeId}}-check\\\" class=\\\"clr-checkbox\\\" [attr.aria-labelledby]=\\\"nodeId\\\"\\n           [checked]=\\\"_model.selected.value === STATES.SELECTED\\\"\\n           [indeterminate]=\\\"_model.selected.value === STATES.INDETERMINATE\\\"\\n           (change)=\\\"_model.toggleSelection(featuresService.eager)\\\">\\n    <label for=\\\"{{nodeId}}-check\\\" class=\\\"clr-control-label\\\"></label>\\n  </div>\\n  <div class=\\\"clr-treenode-content\\\" [id]=\\\"nodeId\\\">\\n    <ng-content></ng-content>\\n  </div>\\n</div>\\n<div class=\\\"clr-treenode-children\\\"\\n     [@childNodesState]=\\\"expandService.expanded ? 'expanded' : 'collapsed'\\\"\\n     [attr.role]=\\\"isExpandable() ? 'group' : null\\\">\\n  <ng-content select=\\\"clr-tree-node\\\"></ng-content>\\n  <ng-content select=\\\"[clrIfExpanded]\\\"></ng-content>\\n  <clr-recursive-children [parent]=\\\"_model\\\"></clr-recursive-children>\\n</div>\\n\",\n                    providers: [UNIQUE_ID_PROVIDER, TREE_FEATURES_PROVIDER, Expand, { provide: LoadingListener, useExisting: Expand }],\n                    animations: [\n                        trigger('childNodesState', [\n                            state('expanded', style({ height: '*', 'overflow-y': 'hidden' })),\n                            state('collapsed', style({ height: 0, 'overflow-y': 'hidden' })),\n                            transition('expanded <=> collapsed', animate('0.2s ease-in-out')),\n                        ]),\n                    ],\n                    host: { '[class.clr-tree-node]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTreeNode.ctorParameters = function () { return [\n        { type: String, decorators: [{ type: Inject, args: [UNIQUE_ID,] }] },\n        { type: ClrTreeNode, decorators: [{ type: Optional }, { type: SkipSelf }] },\n        { type: TreeFeaturesService },\n        { type: Expand },\n        { type: ClrCommonStrings },\n        { type: Injector }\n    ]; };\n    ClrTreeNode.propDecorators = {\n        selected: [{ type: Input, args: ['clrSelected',] }],\n        selectedChange: [{ type: Output, args: ['clrSelectedChange',] }],\n        treeNodeRole: [{ type: HostBinding, args: ['attr.role',] }],\n        rootAriaMultiSelectable: [{ type: HostBinding, args: ['attr.aria-multiselectable',] }],\n        ariaSelected: [{ type: HostBinding, args: ['attr.aria-selected',] }],\n        expandable: [{ type: Input, args: ['clrExpandable',] }],\n        expanded: [{ type: Input, args: ['clrExpanded',] }],\n        expandedChange: [{ type: Output, args: ['clrExpandedChange',] }]\n    };\n    return ClrTreeNode;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrTree = /** @class */ (function () {\n    // This component can also be used just to declare providers once for trees with multiple root nodes.\n    function ClrTree(featuresService) {\n        this.featuresService = featuresService;\n    }\n    Object.defineProperty(ClrTree.prototype, \"lazy\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.featuresService.eager = !value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrTree.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tree',\n                    template: \"\\n    <ng-content></ng-content>\\n    <clr-recursive-children *ngIf=\\\"featuresService.recursion\\\"\\n                            [children]=\\\"featuresService.recursion.root\\\"></clr-recursive-children>\\n  \",\n                    providers: [TREE_FEATURES_PROVIDER]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTree.ctorParameters = function () { return [\n        { type: TreeFeaturesService }\n    ]; };\n    ClrTree.propDecorators = {\n        lazy: [{ type: Input, args: ['clrLazy',] }]\n    };\n    return ClrTree;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n/**\n * @template T\n * @param {?} o\n * @return {?}\n */\nfunction isPromise(o) {\n    // Shamelessly copied from every open-source project out there.\n    return o && typeof ((/** @type {?} */ (o))).then === 'function';\n}\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * A recursive model is built received from the app and traversed to create the corresponding components.\n * Recursive = Model dictates the tree node components\n */\n/**\n * @template T\n */\nvar /*\n * A recursive model is built received from the app and traversed to create the corresponding components.\n * Recursive = Model dictates the tree node components\n */\n/**\n * @template T\n */\nRecursiveTreeNodeModel = /** @class */ (function (_super) {\n    __extends(RecursiveTreeNodeModel, _super);\n    function RecursiveTreeNodeModel(model, parent, getChildren) {\n        var _this = _super.call(this) || this;\n        _this.getChildren = getChildren;\n        _this.childrenFetched = false;\n        _this._children = [];\n        _this.model = model;\n        _this.parent = parent;\n        return _this;\n    }\n    /**\n     * @return {?}\n     */\n    RecursiveTreeNodeModel.prototype.fetchChildren = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        if (this.childrenFetched) {\n            return;\n        }\n        /** @type {?} */\n        var asyncChildren = this.getChildren(this.model);\n        if (isPromise(asyncChildren)) {\n            this.loading = true;\n            asyncChildren.then(function (raw) {\n                _this._children = _this.wrapChildren(raw);\n                _this.loading = false;\n            });\n        }\n        else if (isObservable(asyncChildren)) {\n            this.loading = true;\n            this.subscription = asyncChildren.subscribe(function (raw) {\n                _this._children = _this.wrapChildren(raw);\n                _this.loading = false;\n            });\n        }\n        else if (asyncChildren) {\n            // Synchronous case\n            this._children = this.wrapChildren(asyncChildren);\n        }\n        else {\n            this._children = [];\n        }\n        this.childrenFetched = true;\n    };\n    /**\n     * @param {?} rawModels\n     * @return {?}\n     */\n    RecursiveTreeNodeModel.prototype.wrapChildren = /**\n     * @param {?} rawModels\n     * @return {?}\n     */\n    function (rawModels) {\n        var _this = this;\n        return rawModels.map(function (m) { return new RecursiveTreeNodeModel(m, _this, _this.getChildren); });\n    };\n    Object.defineProperty(RecursiveTreeNodeModel.prototype, \"children\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            this.fetchChildren();\n            return this._children;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._children = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    RecursiveTreeNodeModel.prototype.destroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n        _super.prototype.destroy.call(this);\n    };\n    return RecursiveTreeNodeModel;\n}(TreeNodeModel));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrRecursiveForOf = /** @class */ (function () {\n    function ClrRecursiveForOf(template, featuresService) {\n        this.template = template;\n        this.featuresService = featuresService;\n    }\n    // I'm using OnChanges instead of OnInit to easily keep up to date with dynamic trees. Maybe optimizable later.\n    // I'm using OnChanges instead of OnInit to easily keep up to date with dynamic trees. Maybe optimizable later.\n    /**\n     * @return {?}\n     */\n    ClrRecursiveForOf.prototype.ngOnChanges = \n    // I'm using OnChanges instead of OnInit to easily keep up to date with dynamic trees. Maybe optimizable later.\n    /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        /** @type {?} */\n        var wrapped;\n        if (Array.isArray(this.nodes)) {\n            wrapped = this.nodes.map(function (node) { return new RecursiveTreeNodeModel(node, null, _this.getChildren); });\n        }\n        else {\n            wrapped = [new RecursiveTreeNodeModel(this.nodes, null, this.getChildren)];\n        }\n        this.featuresService.recursion = {\n            template: this.template,\n            root: wrapped,\n        };\n    };\n    ClrRecursiveForOf.decorators = [\n        { type: Directive, args: [{ selector: '[clrRecursiveFor][clrRecursiveForOf]' },] }\n    ];\n    /** @nocollapse */\n    ClrRecursiveForOf.ctorParameters = function () { return [\n        { type: TemplateRef },\n        { type: TreeFeaturesService }\n    ]; };\n    ClrRecursiveForOf.propDecorators = {\n        nodes: [{ type: Input, args: ['clrRecursiveForOf',] }],\n        getChildren: [{ type: Input, args: ['clrRecursiveForGetChildren',] }]\n    };\n    return ClrRecursiveForOf;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar RecursiveChildren = /** @class */ (function () {\n    function RecursiveChildren(featuresService, expandService) {\n        var _this = this;\n        this.featuresService = featuresService;\n        this.expandService = expandService;\n        if (expandService && featuresService.recursion) {\n            this.subscription = this.expandService.expandChange.subscribe(function (value) {\n                if (value && _this.parent) {\n                    // Once again, I'm sure we can find a way to avoid this casting by typing every component in a way that\n                    // lets us use the more specific model classes depending on the use of *clrRecursiveForOf or not.\n                    // But it would take time, which we don't have right now.\n                    ((/** @type {?} */ (_this.parent))).fetchChildren();\n                }\n            });\n        }\n    }\n    /**\n     * @return {?}\n     */\n    RecursiveChildren.prototype.shouldRender = /**\n     * @return {?}\n     */\n    function () {\n        return (this.featuresService.recursion &&\n            // In the smart case, we eagerly render all the recursive children\n            // to make sure two-way bindings for selection are available.\n            // They will be hidden with CSS by the parent.\n            (this.featuresService.eager || !this.expandService || this.expandService.expanded));\n    };\n    /**\n     * @param {?} node\n     * @return {?}\n     */\n    RecursiveChildren.prototype.getContext = /**\n     * @param {?} node\n     * @return {?}\n     */\n    function (node) {\n        return {\n            $implicit: node.model,\n            clrModel: node,\n        };\n    };\n    /**\n     * @return {?}\n     */\n    RecursiveChildren.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    };\n    RecursiveChildren.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-recursive-children',\n                    template: \"\\n    <ng-container *ngIf=\\\"shouldRender()\\\">\\n      <ng-container *ngFor=\\\"let child of parent?.children || children\\\">\\n        <ng-container *ngTemplateOutlet=\\\"featuresService.recursion.template; context: getContext(child)\\\"></ng-container>\\n      </ng-container>\\n    </ng-container>\\n  \"\n                }] }\n    ];\n    /** @nocollapse */\n    RecursiveChildren.ctorParameters = function () { return [\n        { type: TreeFeaturesService },\n        { type: Expand, decorators: [{ type: Optional }] }\n    ]; };\n    RecursiveChildren.propDecorators = {\n        parent: [{ type: Input, args: ['parent',] }],\n        children: [{ type: Input, args: ['children',] }]\n    };\n    return RecursiveChildren;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_TREE_VIEW_DIRECTIVES = [ClrTree, ClrTreeNode, ClrRecursiveForOf];\nvar ClrTreeViewModule = /** @class */ (function () {\n    function ClrTreeViewModule() {\n    }\n    ClrTreeViewModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule, ClrLoadingModule],\n                    declarations: [CLR_TREE_VIEW_DIRECTIVES, RecursiveChildren],\n                    exports: [CLR_TREE_VIEW_DIRECTIVES, ClrIfExpandModule],\n                },] }\n    ];\n    return ClrTreeViewModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDataModule = /** @class */ (function () {\n    function ClrDataModule() {\n    }\n    ClrDataModule.decorators = [\n        { type: NgModule, args: [{ exports: [ClrDatagridModule, ClrStackViewModule, ClrTreeViewModule] },] }\n    ];\n    return ClrDataModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// This class is used to convert an internal event\n// to an external event to be emitted.\n/**\n * @template T\n */\nvar  \n// This class is used to convert an internal event\n// to an external event to be emitted.\n/**\n * @template T\n */\nClrDragEvent = /** @class */ (function () {\n    function ClrDragEvent(dragEvent) {\n        this.dragPosition = dragEvent.dragPosition;\n        this.group = dragEvent.group;\n        this.dragDataTransfer = dragEvent.dragDataTransfer;\n        this.dropPointPosition = dragEvent.dropPointPosition;\n    }\n    return ClrDragEvent;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @enum {number} */\nvar DragEventType = {\n    DRAG_START: 0,\n    DRAG_MOVE: 1,\n    DRAG_END: 2,\n    DRAG_ENTER: 3,\n    DRAG_LEAVE: 4,\n    DROP: 5,\n};\nDragEventType[DragEventType.DRAG_START] = 'DRAG_START';\nDragEventType[DragEventType.DRAG_MOVE] = 'DRAG_MOVE';\nDragEventType[DragEventType.DRAG_END] = 'DRAG_END';\nDragEventType[DragEventType.DRAG_ENTER] = 'DRAG_ENTER';\nDragEventType[DragEventType.DRAG_LEAVE] = 'DRAG_LEAVE';\nDragEventType[DragEventType.DROP] = 'DROP';\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar DragAndDropEventBusService = /** @class */ (function () {\n    function DragAndDropEventBusService() {\n        this.dragStart = new Subject();\n        this.dragMove = new Subject();\n        this.dragEnd = new Subject();\n        this.drop = new Subject();\n    }\n    Object.defineProperty(DragAndDropEventBusService.prototype, \"dragStarted\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.dragStart.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DragAndDropEventBusService.prototype, \"dragMoved\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.dragMove.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DragAndDropEventBusService.prototype, \"dragEnded\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.dragEnd.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DragAndDropEventBusService.prototype, \"dropped\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.drop.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    DragAndDropEventBusService.prototype.broadcast = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        switch (event.type) {\n            case DragEventType.DRAG_START:\n                this.dragStart.next(event);\n                break;\n            case DragEventType.DRAG_MOVE:\n                this.dragMove.next(event);\n                break;\n            case DragEventType.DRAG_END:\n                this.dragEnd.next(event);\n                break;\n            case DragEventType.DROP:\n                this.drop.next(event);\n                break;\n            default:\n                break;\n        }\n    };\n    DragAndDropEventBusService.decorators = [\n        { type: Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    /** @nocollapse */ DragAndDropEventBusService.ngInjectableDef = defineInjectable({ factory: function DragAndDropEventBusService_Factory() { return new DragAndDropEventBusService(); }, token: DragAndDropEventBusService, providedIn: \"root\" });\n    return DragAndDropEventBusService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar DragEventListenerService = /** @class */ (function () {\n    function DragEventListenerService(ngZone, renderer, eventBus) {\n        this.ngZone = ngZone;\n        this.renderer = renderer;\n        this.eventBus = eventBus;\n        this.dragStart = new Subject();\n        this.dragMove = new Subject();\n        this.dragEnd = new Subject();\n        this.hasDragStarted = false;\n    }\n    Object.defineProperty(DragEventListenerService.prototype, \"dragStarted\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.dragStart.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DragEventListenerService.prototype, \"dragMoved\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.dragMove.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DragEventListenerService.prototype, \"dragEnded\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.dragEnd.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} draggableEl\n     * @return {?}\n     */\n    DragEventListenerService.prototype.attachDragListeners = /**\n     * @param {?} draggableEl\n     * @return {?}\n     */\n    function (draggableEl) {\n        this.draggableEl = draggableEl;\n        this.listeners = [\n            this.customDragEvent(this.draggableEl, 'mousedown', 'mousemove', 'mouseup'),\n            this.customDragEvent(this.draggableEl, 'touchstart', 'touchmove', 'touchend'),\n        ];\n    };\n    /**\n     * @return {?}\n     */\n    DragEventListenerService.prototype.detachDragListeners = /**\n     * @return {?}\n     */\n    function () {\n        if (this.listeners) {\n            this.listeners.map(function (event) { return event(); });\n        }\n        // In most cases, once users start dragging with mousedown/touchstart events,\n        // they will end dragging at one point with mouseup/touchend.\n        // However, there might be a few cases where mousedown/touchstart events get registered,\n        // but the draggable element gets removed before user ends dragging.\n        // In that case, we need to remove the attached listeners that happened during the mousedown/touchstart events.\n        if (this.nestedListeners) {\n            this.nestedListeners.map(function (event) { return event(); });\n        }\n    };\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    DragEventListenerService.prototype.getNativeEventObject = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        if (((/** @type {?} */ (event))).hasOwnProperty('changedTouches')) {\n            return ((/** @type {?} */ (event))).changedTouches[0];\n        }\n        else {\n            return event;\n        }\n    };\n    /**\n     * @param {?} element\n     * @param {?} startOnEvent\n     * @param {?} moveOnEvent\n     * @param {?} endOnEvent\n     * @return {?}\n     */\n    DragEventListenerService.prototype.customDragEvent = /**\n     * @param {?} element\n     * @param {?} startOnEvent\n     * @param {?} moveOnEvent\n     * @param {?} endOnEvent\n     * @return {?}\n     */\n    function (element, startOnEvent, moveOnEvent, endOnEvent) {\n        var _this = this;\n        return this.renderer.listen(element, startOnEvent, function (startEvent) {\n            // save the initial point to initialPosition\n            // this will be used to calculate how far the draggable has been dragged from its initial position\n            _this.initialPosition = {\n                pageX: _this.getNativeEventObject(startEvent).pageX,\n                pageY: _this.getNativeEventObject(startEvent).pageY,\n            };\n            // Initialize nested listeners' property with a new empty array;\n            _this.nestedListeners = [];\n            // This is needed to disable selection during dragging (especially in EDGE/IE11).\n            _this.nestedListeners.push(_this.renderer.listen('document', 'selectstart', function (selectEvent) {\n                selectEvent.preventDefault();\n                selectEvent.stopImmediatePropagation();\n            }));\n            // Listen to mousemove/touchmove events outside of angular zone.\n            _this.nestedListeners.push(_this.ngZone.runOutsideAngular(function () {\n                return _this.renderer.listen('document', moveOnEvent, function (moveEvent) {\n                    // Event.stopImmediatePropagation() is needed here to prevent nested draggables from getting dragged\n                    // altogether. We shouldn't use Event.stopPropagation() here as we are listening to the events\n                    // on the global element level.\n                    // With Event.stopImmediatePropagation(), it registers the events sent from the inner most draggable\n                    // first. Then immediately after that, it stops listening to the same type of events on the same\n                    // element. So this will help us to not register the same events that would come from the parent\n                    // level draggables eventually.\n                    moveEvent.stopImmediatePropagation();\n                    if (!_this.hasDragStarted) {\n                        _this.hasDragStarted = true;\n                        // Fire \"dragstart\"\n                        _this.broadcast(moveEvent, DragEventType.DRAG_START);\n                    }\n                    else {\n                        // Fire \"dragmove\"\n                        _this.broadcast(moveEvent, DragEventType.DRAG_MOVE);\n                    }\n                });\n            }));\n            // Listen to mouseup/touchend events.\n            _this.nestedListeners.push(_this.renderer.listen('document', endOnEvent, function (endEvent) {\n                if (_this.hasDragStarted) {\n                    // Fire \"dragend\" only if dragstart is registered\n                    _this.hasDragStarted = false;\n                    _this.broadcast(endEvent, DragEventType.DRAG_END);\n                }\n                // We must remove the the nested listeners every time drag completes.\n                if (_this.nestedListeners) {\n                    _this.nestedListeners.map(function (event) { return event(); });\n                }\n            }));\n        });\n    };\n    /**\n     * @param {?} event\n     * @param {?} eventType\n     * @return {?}\n     */\n    DragEventListenerService.prototype.broadcast = /**\n     * @param {?} event\n     * @param {?} eventType\n     * @return {?}\n     */\n    function (event, eventType) {\n        /** @type {?} */\n        var dragEvent = this.generateDragEvent(event, eventType);\n        switch (dragEvent.type) {\n            case DragEventType.DRAG_START:\n                this.dragStart.next(dragEvent);\n                break;\n            case DragEventType.DRAG_MOVE:\n                this.dragMove.next(dragEvent);\n                break;\n            case DragEventType.DRAG_END:\n                this.dragEnd.next(dragEvent);\n                break;\n            default:\n                break;\n        }\n        // The following properties are set after they are broadcasted to the DraggableGhost component.\n        dragEvent.ghostElement = this.ghostElement;\n        dragEvent.dropPointPosition = this.dropPointPosition;\n        this.eventBus.broadcast(dragEvent);\n    };\n    /**\n     * @param {?} event\n     * @param {?} eventType\n     * @return {?}\n     */\n    DragEventListenerService.prototype.generateDragEvent = /**\n     * @param {?} event\n     * @param {?} eventType\n     * @return {?}\n     */\n    function (event, eventType) {\n        /** @type {?} */\n        var nativeEvent = this.getNativeEventObject(event);\n        return {\n            type: eventType,\n            dragPosition: {\n                pageX: nativeEvent.pageX,\n                pageY: nativeEvent.pageY,\n                moveX: nativeEvent.pageX - this.initialPosition.pageX,\n                moveY: nativeEvent.pageY - this.initialPosition.pageY,\n            },\n            group: this.group,\n            dragDataTransfer: this.dragDataTransfer,\n            ghostElement: this.ghostElement,\n        };\n    };\n    DragEventListenerService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DragEventListenerService.ctorParameters = function () { return [\n        { type: NgZone },\n        { type: Renderer2 },\n        { type: DragAndDropEventBusService }\n    ]; };\n    return DragEventListenerService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// This service is used to capture the state of clrDraggable element\n// at a certain event and passes it to clrDraggableGhost component.\n/**\n * @template T\n */\nvar DraggableSnapshotService = /** @class */ (function () {\n    function DraggableSnapshotService(domAdapter) {\n        this.domAdapter = domAdapter;\n    }\n    /**\n     * @param {?} el\n     * @param {?} event\n     * @return {?}\n     */\n    DraggableSnapshotService.prototype.capture = /**\n     * @param {?} el\n     * @param {?} event\n     * @return {?}\n     */\n    function (el, event) {\n        this.draggableElClientRect = this.domAdapter.clientRect(el);\n        this.snapshotDragEvent = event;\n    };\n    /**\n     * @return {?}\n     */\n    DraggableSnapshotService.prototype.discard = /**\n     * @return {?}\n     */\n    function () {\n        delete this.draggableElClientRect;\n        delete this.snapshotDragEvent;\n    };\n    Object.defineProperty(DraggableSnapshotService.prototype, \"hasDraggableState\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return !!this.snapshotDragEvent && !!this.draggableElClientRect;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DraggableSnapshotService.prototype, \"clientRect\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.draggableElClientRect;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DraggableSnapshotService.prototype, \"dragEvent\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.snapshotDragEvent;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    DraggableSnapshotService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DraggableSnapshotService.ctorParameters = function () { return [\n        { type: DomAdapter }\n    ]; };\n    return DraggableSnapshotService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDraggableGhost = /** @class */ (function () {\n    function ClrDraggableGhost(el, dragEventListener, draggableSnapshot, renderer, ngZone) {\n        var _this = this;\n        this.el = el;\n        this.dragEventListener = dragEventListener;\n        this.draggableSnapshot = draggableSnapshot;\n        this.renderer = renderer;\n        this.ngZone = ngZone;\n        this.subscriptions = [];\n        this.leaveAnimConfig = { value: 0, params: { top: '0px', left: '0px' } };\n        if (!this.dragEventListener || !this.draggableSnapshot) {\n            throw new Error('The clr-draggable-ghost component can only be used inside of a clrDraggable directive.');\n        }\n        this.draggableGhostEl = this.el.nativeElement;\n        // Need to use Renderer2 as it runs outside of NgZone\n        this.renderer.addClass(this.draggableGhostEl, 'draggable-ghost');\n        // Register the ghost element in DragEventListener to pass in a ClrDragEvent.\n        this.dragEventListener.ghostElement = this.draggableGhostEl;\n        // Default ghost size gets the size of ClrDraggable element.\n        this.setDefaultGhostSize(this.draggableGhostEl);\n        /** @type {?} */\n        var offset = {\n            top: this.draggableSnapshot.hasDraggableState\n                ? this.draggableSnapshot.dragEvent.dragPosition.pageY - this.draggableSnapshot.clientRect.top\n                : 0,\n            left: this.draggableSnapshot.hasDraggableState\n                ? this.draggableSnapshot.dragEvent.dragPosition.pageX - this.draggableSnapshot.clientRect.left\n                : 0,\n        };\n        /** @type {?} */\n        var isAnimationConfigured = false;\n        this.subscriptions.push(this.dragEventListener.dragMoved.subscribe(function (event) {\n            // On the first drag move event, we configure the animation as it's dependent on the first drag event.\n            if (!isAnimationConfigured) {\n                if (_this.draggableSnapshot.hasDraggableState) {\n                    _this.animateToOnLeave(_this.draggableSnapshot.clientRect.top + \"px\", _this.draggableSnapshot.clientRect.left + \"px\");\n                }\n                else {\n                    _this.animateToOnLeave(event.dragPosition.pageY + \"px\", event.dragPosition.pageX + \"px\");\n                }\n                isAnimationConfigured = true;\n            }\n            // Position the draggable ghost.\n            /** @type {?} */\n            var topLeftPosition = _this.findTopLeftPosition(event.dragPosition, offset);\n            _this.setPositionStyle(_this.draggableGhostEl, topLeftPosition.pageX, topLeftPosition.pageY);\n            _this.dragEventListener.dropPointPosition = _this.findDropPointPosition(topLeftPosition);\n        }));\n    }\n    /**\n     * @param {?} el\n     * @return {?}\n     */\n    ClrDraggableGhost.prototype.setDefaultGhostSize = /**\n     * @param {?} el\n     * @return {?}\n     */\n    function (el) {\n        if (this.draggableSnapshot.hasDraggableState) {\n            this.setSizeStyle(el, this.draggableSnapshot.clientRect.width, this.draggableSnapshot.clientRect.height);\n        }\n    };\n    /**\n     * @param {?} top\n     * @param {?} left\n     * @return {?}\n     */\n    ClrDraggableGhost.prototype.animateToOnLeave = /**\n     * @param {?} top\n     * @param {?} left\n     * @return {?}\n     */\n    function (top, left) {\n        var _this = this;\n        this.ngZone.run(function () {\n            _this.leaveAnimConfig = { value: 0, params: { top: top, left: left } };\n        });\n    };\n    /**\n     * @param {?} dragPosition\n     * @param {?} offset\n     * @return {?}\n     */\n    ClrDraggableGhost.prototype.findTopLeftPosition = /**\n     * @param {?} dragPosition\n     * @param {?} offset\n     * @return {?}\n     */\n    function (dragPosition, offset) {\n        return { pageX: dragPosition.pageX - offset.left, pageY: dragPosition.pageY - offset.top };\n    };\n    /**\n     * @param {?} topLeftPosition\n     * @return {?}\n     */\n    ClrDraggableGhost.prototype.findDropPointPosition = /**\n     * @param {?} topLeftPosition\n     * @return {?}\n     */\n    function (topLeftPosition) {\n        if (this.draggableSnapshot.hasDraggableState) {\n            return {\n                pageX: topLeftPosition.pageX + this.draggableSnapshot.clientRect.width / 2,\n                pageY: topLeftPosition.pageY + this.draggableSnapshot.clientRect.height / 2,\n            };\n        }\n        else {\n            return topLeftPosition;\n        }\n    };\n    /**\n     * @param {?} el\n     * @param {?} width\n     * @param {?} height\n     * @return {?}\n     */\n    ClrDraggableGhost.prototype.setSizeStyle = /**\n     * @param {?} el\n     * @param {?} width\n     * @param {?} height\n     * @return {?}\n     */\n    function (el, width, height) {\n        this.renderer.setStyle(el, 'width', width + \"px\");\n        this.renderer.setStyle(el, 'height', height + \"px\");\n    };\n    /**\n     * @param {?} el\n     * @param {?} left\n     * @param {?} top\n     * @return {?}\n     */\n    ClrDraggableGhost.prototype.setPositionStyle = /**\n     * @param {?} el\n     * @param {?} left\n     * @param {?} top\n     * @return {?}\n     */\n    function (el, left, top) {\n        this.renderer.setStyle(el, 'left', left + \"px\");\n        this.renderer.setStyle(el, 'top', top + \"px\");\n        this.renderer.setStyle(el, 'visibility', 'visible');\n    };\n    /**\n     * @return {?}\n     */\n    ClrDraggableGhost.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrDraggableGhost.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-draggable-ghost',\n                    template: \"<ng-content></ng-content>\",\n                    animations: [\n                        trigger('leaveAnimation', [\n                            transition(':leave', [\n                                style({ left: '*', top: '*' }),\n                                animate('0.2s ease-in-out', style({ top: '{{top}}', left: '{{left}}' })),\n                            ]),\n                        ]),\n                    ]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDraggableGhost.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: DragEventListenerService, decorators: [{ type: Optional }] },\n        { type: DraggableSnapshotService, decorators: [{ type: Optional }] },\n        { type: Renderer2 },\n        { type: NgZone }\n    ]; };\n    ClrDraggableGhost.propDecorators = {\n        leaveAnimConfig: [{ type: HostBinding, args: ['@leaveAnimation',] }]\n    };\n    return ClrDraggableGhost;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// This structural directive will be used mainly together with `clr-draggable-ghost` directive inside of clrDraggable\n// directive. The directive is responsible for instantiating `clr-draggable-ghost` directive only during dragging so\n// that Angular Change Detection is prevented from running if a component or directive is placed inside of the\n// `clr-draggable-ghost` directive.\n/**\n * @template T\n */\nvar ClrIfDragged = /** @class */ (function () {\n    function ClrIfDragged(template, container, dragEventListener) {\n        var _this = this;\n        this.template = template;\n        this.container = container;\n        this.dragEventListener = dragEventListener;\n        this.subscriptions = [];\n        if (!this.dragEventListener || !this.container) {\n            throw new Error('The *clrIfDragged directive can only be used inside of a clrDraggable directive.');\n        }\n        this.subscriptions.push(this.dragEventListener.dragStarted.subscribe(function (event) {\n            _this.container.createEmbeddedView(_this.template);\n        }));\n        this.subscriptions.push(this.dragEventListener.dragEnded.subscribe(function (event) {\n            _this.container.clear();\n        }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrIfDragged.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrIfDragged.decorators = [\n        { type: Directive, args: [{ selector: '[clrIfDragged]' },] }\n    ];\n    /** @nocollapse */\n    ClrIfDragged.ctorParameters = function () { return [\n        { type: TemplateRef },\n        { type: ViewContainerRef, decorators: [{ type: Optional }, { type: SkipSelf }] },\n        { type: DragEventListenerService, decorators: [{ type: Optional }] }\n    ]; };\n    return ClrIfDragged;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// This provider registers the drag handle element.\n// When it registers a element as a drag handle, it attaches that element to the listeners from ClrDragEventListener.\n// Also, it adds the \"drag-handle\" css class to the registered element through Renderer.\n/**\n * @template T\n */\nvar DragHandleRegistrarService = /** @class */ (function () {\n    function DragHandleRegistrarService(dragEventListener, renderer) {\n        this.dragEventListener = dragEventListener;\n        this.renderer = renderer;\n    }\n    Object.defineProperty(DragHandleRegistrarService.prototype, \"defaultHandleEl\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._defaultHandleEl;\n        },\n        set: /**\n         * @param {?} el\n         * @return {?}\n         */\n        function (el) {\n            this._defaultHandleEl = el; // defaultHandleEl will be usually the clrDraggable element.\n            // If the customHandleEl has been registered,\n            // don't make the defaultHandleEl the drag handle yet until the customHandleEl is unregistered.\n            if (!this._customHandleEl) {\n                this.makeElementHandle(this._defaultHandleEl);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} el\n     * @return {?}\n     */\n    DragHandleRegistrarService.prototype.makeElementHandle = /**\n     * @param {?} el\n     * @return {?}\n     */\n    function (el) {\n        if (this._defaultHandleEl && this._defaultHandleEl !== el) {\n            // Before making an element the custom handle element,\n            // we should remove the existing drag-handle class from the draggable element.\n            this.renderer.removeClass(this._defaultHandleEl, 'drag-handle');\n        }\n        this.dragEventListener.attachDragListeners(el);\n        this.renderer.addClass(el, 'drag-handle');\n    };\n    Object.defineProperty(DragHandleRegistrarService.prototype, \"customHandleEl\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._customHandleEl;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} el\n     * @return {?}\n     */\n    DragHandleRegistrarService.prototype.registerCustomHandle = /**\n     * @param {?} el\n     * @return {?}\n     */\n    function (el) {\n        this.dragEventListener.detachDragListeners(); // removes the existing listeners\n        this._customHandleEl = el;\n        this.makeElementHandle(this._customHandleEl);\n    };\n    /**\n     * @return {?}\n     */\n    DragHandleRegistrarService.prototype.unregisterCustomHandle = /**\n     * @return {?}\n     */\n    function () {\n        this.dragEventListener.detachDragListeners(); // removes the existing listeners\n        this.renderer.removeClass(this._customHandleEl, 'drag-handle');\n        delete this._customHandleEl;\n        // if default handle is set, make that handle\n        if (this._defaultHandleEl) {\n            this.makeElementHandle(this._defaultHandleEl);\n        }\n    };\n    DragHandleRegistrarService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    DragHandleRegistrarService.ctorParameters = function () { return [\n        { type: DragEventListenerService },\n        { type: Renderer2 }\n    ]; };\n    return DragHandleRegistrarService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// This service class adds and removes the \"in-drag\" class to the document body element\n// through its public enter() and exit() methods.\nvar GlobalDragModeService = /** @class */ (function () {\n    function GlobalDragModeService(renderer) {\n        this.renderer = renderer;\n    }\n    /**\n     * @return {?}\n     */\n    GlobalDragModeService.prototype.enter = /**\n     * @return {?}\n     */\n    function () {\n        this.renderer.addClass(document.body, 'in-drag');\n    };\n    /**\n     * @return {?}\n     */\n    GlobalDragModeService.prototype.exit = /**\n     * @return {?}\n     */\n    function () {\n        this.renderer.removeClass(document.body, 'in-drag');\n    };\n    GlobalDragModeService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    GlobalDragModeService.ctorParameters = function () { return [\n        { type: Renderer2 }\n    ]; };\n    return GlobalDragModeService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDraggable = /** @class */ (function () {\n    function ClrDraggable(el, dragEventListener, dragHandleRegistrar, viewContainerRef, cfr, injector, draggableSnapshot, globalDragMode) {\n        this.el = el;\n        this.dragEventListener = dragEventListener;\n        this.dragHandleRegistrar = dragHandleRegistrar;\n        this.viewContainerRef = viewContainerRef;\n        this.cfr = cfr;\n        this.injector = injector;\n        this.draggableSnapshot = draggableSnapshot;\n        this.globalDragMode = globalDragMode;\n        this.subscriptions = [];\n        this.dragOn = false;\n        this.dragStartEmitter = new EventEmitter();\n        this.dragMoveEmitter = new EventEmitter();\n        this.dragEndEmitter = new EventEmitter();\n        this.draggableEl = this.el.nativeElement;\n        this.componentFactory = this.cfr.resolveComponentFactory(ClrDraggableGhost);\n    }\n    Object.defineProperty(ClrDraggable.prototype, \"dataTransfer\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.dragEventListener.dragDataTransfer = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDraggable.prototype, \"group\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.dragEventListener.group = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    ClrDraggable.prototype.createDefaultGhost = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        this.draggableSnapshot.capture(this.draggableEl, event);\n        // NOTE: The default ghost element will appear\n        // next to the clrDraggable in the DOM as a sibling element.\n        this.viewContainerRef.createComponent(this.componentFactory, 0, this.injector, [\n            [this.draggableEl.cloneNode(true)],\n        ]);\n    };\n    /**\n     * @return {?}\n     */\n    ClrDraggable.prototype.destroyDefaultGhost = /**\n     * @return {?}\n     */\n    function () {\n        this.viewContainerRef.clear();\n        this.draggableSnapshot.discard();\n    };\n    /**\n     * @return {?}\n     */\n    ClrDraggable.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.dragHandleRegistrar.defaultHandleEl = this.draggableEl;\n        this.subscriptions.push(this.dragEventListener.dragStarted.subscribe(function (event) {\n            _this.globalDragMode.enter();\n            _this.dragOn = true;\n            if (!_this.customGhost) {\n                _this.createDefaultGhost(event);\n            }\n            _this.dragStartEmitter.emit(new ClrDragEvent(event));\n        }));\n        this.subscriptions.push(this.dragEventListener.dragMoved.subscribe(function (event) {\n            _this.dragMoveEmitter.emit(new ClrDragEvent(event));\n        }));\n        this.subscriptions.push(this.dragEventListener.dragEnded.subscribe(function (event) {\n            _this.globalDragMode.exit();\n            _this.dragOn = false;\n            if (!_this.customGhost) {\n                _this.destroyDefaultGhost();\n            }\n            _this.dragEndEmitter.emit(new ClrDragEvent(event));\n        }));\n    };\n    /**\n     * @return {?}\n     */\n    ClrDraggable.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n        this.dragEventListener.detachDragListeners();\n    };\n    ClrDraggable.decorators = [\n        { type: Directive, args: [{\n                    selector: '[clrDraggable]',\n                    providers: [\n                        DragEventListenerService,\n                        DragHandleRegistrarService,\n                        DraggableSnapshotService,\n                        GlobalDragModeService,\n                        DomAdapter,\n                    ],\n                    host: { '[class.draggable]': 'true', '[class.being-dragged]': 'dragOn' },\n                },] }\n    ];\n    /** @nocollapse */\n    ClrDraggable.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: DragEventListenerService },\n        { type: DragHandleRegistrarService },\n        { type: ViewContainerRef },\n        { type: ComponentFactoryResolver },\n        { type: Injector },\n        { type: DraggableSnapshotService },\n        { type: GlobalDragModeService }\n    ]; };\n    ClrDraggable.propDecorators = {\n        customGhost: [{ type: ContentChild, args: [ClrIfDragged,] }],\n        dataTransfer: [{ type: Input, args: ['clrDraggable',] }],\n        group: [{ type: Input, args: ['clrGroup',] }],\n        dragStartEmitter: [{ type: Output, args: ['clrDragStart',] }],\n        dragMoveEmitter: [{ type: Output, args: ['clrDragMove',] }],\n        dragEndEmitter: [{ type: Output, args: ['clrDragEnd',] }]\n    };\n    return ClrDraggable;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDroppable = /** @class */ (function () {\n    function ClrDroppable(el, eventBus, domAdapter, renderer) {\n        this.el = el;\n        this.eventBus = eventBus;\n        this.domAdapter = domAdapter;\n        this.renderer = renderer;\n        this.isDraggableMatch = false;\n        this._isDraggableOver = false;\n        this._dropTolerance = { top: 0, right: 0, bottom: 0, left: 0 };\n        this.dragStartEmitter = new EventEmitter();\n        this.dragMoveEmitter = new EventEmitter();\n        this.dragEndEmitter = new EventEmitter();\n        this.dragLeaveEmitter = new EventEmitter();\n        this.dragEnterEmitter = new EventEmitter();\n        this.dropEmitter = new EventEmitter();\n        this.droppableEl = this.el.nativeElement;\n    }\n    Object.defineProperty(ClrDroppable.prototype, \"isDraggableOver\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            // We need to add/remove this draggable-over class via Renderer2\n            // because isDraggableOver is set outside of NgZone.\n            if (value) {\n                this.renderer.addClass(this.droppableEl, 'draggable-over');\n            }\n            else {\n                this.renderer.removeClass(this.droppableEl, 'draggable-over');\n            }\n            this._isDraggableOver = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrDroppable.prototype, \"group\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._group = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?=} top\n     * @param {?=} right\n     * @param {?=} bottom\n     * @param {?=} left\n     * @return {?}\n     */\n    ClrDroppable.prototype.dropToleranceGenerator = /**\n     * @param {?=} top\n     * @param {?=} right\n     * @param {?=} bottom\n     * @param {?=} left\n     * @return {?}\n     */\n    function (top, right, bottom, left) {\n        if (top === void 0) { top = 0; }\n        if (right === void 0) { right = top; }\n        if (bottom === void 0) { bottom = top; }\n        if (left === void 0) { left = right; }\n        return { top: top, right: right, bottom: bottom, left: left };\n    };\n    Object.defineProperty(ClrDroppable.prototype, \"dropTolerance\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            // If user provides an object here and wants to manipulate/update properties individually,\n            // the object must be immutable as we generate new object based user's given object.\n            if (typeof value === 'number') {\n                this._dropTolerance = this.dropToleranceGenerator(value);\n            }\n            else if (typeof value === 'string') {\n                /** @type {?} */\n                var toleranceValues = value\n                    .trim()\n                    .split(/\\s+/)\n                    .map(function (tolerance) { return parseInt(tolerance, 10); });\n                this._dropTolerance = this.dropToleranceGenerator.apply(this, __spread(toleranceValues));\n            }\n            else if (value) {\n                // The value could be passed in as {left: 20, top: 30 }\n                // In this case, the rest of the direction properties should be 0.\n                // That's why we initialize properties with 0 first, then override with user's given value.\n                this._dropTolerance = __assign({}, this.dropToleranceGenerator(0), value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} subscription\n     * @return {?}\n     */\n    ClrDroppable.prototype.unsubscribeFrom = /**\n     * @param {?} subscription\n     * @return {?}\n     */\n    function (subscription) {\n        if (subscription) {\n            subscription.unsubscribe();\n        }\n    };\n    /**\n     * @param {?} draggableGroup\n     * @return {?}\n     */\n    ClrDroppable.prototype.checkGroupMatch = /**\n     * @param {?} draggableGroup\n     * @return {?}\n     */\n    function (draggableGroup) {\n        // Both Draggable and Droppable have clrGroup input.\n        // The clrGroup input can be both a string key or array of string keys in Draggable and Droppable.\n        // It's not match if Draggable has no defined value assigned to clrGroup, but Droppable has a defined clrGroup.\n        if (!draggableGroup && this._group) {\n            return false;\n        }\n        // The same is true the other way round.\n        if (!this._group && draggableGroup) {\n            return false;\n        }\n        // It's match if both Draggable and Droppable have no assigned value for clrGroup.\n        if (!this._group && !draggableGroup) {\n            return true;\n        }\n        // It's match if both Draggable and Droppable have simple string keys that are matching.\n        // It's match if Draggable's simple clrGroup key is matching with one of the clrGroup keys of Droppable. The\n        // same is true the other way round.\n        // it's match if one of the clrGroup keys of Droppable is matching with one of the clrGroup keys of Draggable.\n        if (typeof draggableGroup === 'string') {\n            if (typeof this._group === 'string') {\n                return this._group === draggableGroup;\n            }\n            else {\n                return this._group.indexOf(draggableGroup) > -1;\n            }\n        }\n        else {\n            if (typeof this._group === 'string') {\n                return draggableGroup.indexOf(this._group) > -1;\n            }\n            else {\n                return ((/** @type {?} */ (this._group))).some(function (groupKey) { return draggableGroup.indexOf(groupKey) > -1; });\n            }\n        }\n    };\n    /**\n     * @param {?} point\n     * @return {?}\n     */\n    ClrDroppable.prototype.isInDropArea = /**\n     * @param {?} point\n     * @return {?}\n     */\n    function (point) {\n        if (!point) {\n            return false;\n        }\n        if (!this.clientRect) {\n            this.clientRect = this.domAdapter.clientRect(this.droppableEl);\n        }\n        if (point.pageX >= this.clientRect.left - this._dropTolerance.left &&\n            point.pageX <= this.clientRect.right + this._dropTolerance.right &&\n            point.pageY >= this.clientRect.top - this._dropTolerance.top &&\n            point.pageY <= this.clientRect.bottom + this._dropTolerance.bottom) {\n            return true;\n        }\n        else {\n            return false;\n        }\n    };\n    /**\n     * @param {?} dragStartEvent\n     * @return {?}\n     */\n    ClrDroppable.prototype.onDragStart = /**\n     * @param {?} dragStartEvent\n     * @return {?}\n     */\n    function (dragStartEvent) {\n        var _this = this;\n        // Check draggable and droppable have a matching group key.\n        this.isDraggableMatch = this.checkGroupMatch(dragStartEvent.group);\n        // Subscribe to dragMoved and dragEnded only if draggable and droppable have a matching group key.\n        if (this.isDraggableMatch) {\n            this.dragStartEmitter.emit(new ClrDragEvent(dragStartEvent));\n            this.dragMoveSubscription = this.eventBus.dragMoved.subscribe(function (dragMoveEvent) {\n                _this.onDragMove(dragMoveEvent);\n            });\n            this.dragEndSubscription = this.eventBus.dragEnded.subscribe(function (dragEndEvent) {\n                _this.onDragEnd(dragEndEvent);\n            });\n        }\n    };\n    /**\n     * @param {?} dragMoveEvent\n     * @return {?}\n     */\n    ClrDroppable.prototype.onDragMove = /**\n     * @param {?} dragMoveEvent\n     * @return {?}\n     */\n    function (dragMoveEvent) {\n        /** @type {?} */\n        var isInDropArea = this.isInDropArea(dragMoveEvent.dropPointPosition);\n        if (!this._isDraggableOver && isInDropArea) {\n            this.isDraggableOver = true;\n            /** @type {?} */\n            var dragEnterEvent = __assign({}, dragMoveEvent, { type: DragEventType.DRAG_ENTER });\n            this.eventBus.broadcast(dragEnterEvent);\n            this.dragEnterEmitter.emit(new ClrDragEvent(dragEnterEvent));\n        }\n        else if (this._isDraggableOver && !isInDropArea) {\n            this.isDraggableOver = false;\n            /** @type {?} */\n            var dragLeaveEvent = __assign({}, dragMoveEvent, { type: DragEventType.DRAG_LEAVE });\n            this.eventBus.broadcast(dragLeaveEvent);\n            this.dragLeaveEmitter.emit(new ClrDragEvent(dragLeaveEvent));\n        }\n        this.dragMoveEmitter.emit(new ClrDragEvent(dragMoveEvent));\n    };\n    /**\n     * @param {?} dragEndEvent\n     * @return {?}\n     */\n    ClrDroppable.prototype.onDragEnd = /**\n     * @param {?} dragEndEvent\n     * @return {?}\n     */\n    function (dragEndEvent) {\n        if (this._isDraggableOver) {\n            if (dragEndEvent.ghostElement) {\n                // By this point, the draggable ghost component is destroyed,\n                // but the element would be active until its animation completes.\n                // As such, once the ghost is dropped over, we will give it \"dropped\" class.\n                // This process cannot be done in the ghost component\n                // because any subscription to the drop event is ineffective or invalid\n                // as the component had been already destroyed.\n                this.renderer.addClass(dragEndEvent.ghostElement, 'dropped');\n            }\n            /** @type {?} */\n            var dropEvent = __assign({}, dragEndEvent, { type: DragEventType.DROP });\n            this.eventBus.broadcast(dropEvent);\n            this.dropEmitter.emit(new ClrDragEvent(dropEvent));\n            this.isDraggableOver = false;\n        }\n        this.dragEndEmitter.emit(new ClrDragEvent(dragEndEvent));\n        this.unsubscribeFrom(this.dragMoveSubscription);\n        this.unsubscribeFrom(this.dragEndSubscription);\n        this.isDraggableMatch = false;\n        delete this.clientRect;\n    };\n    /**\n     * @return {?}\n     */\n    ClrDroppable.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.dragStartSubscription = this.eventBus.dragStarted.subscribe(function (dragStartEvent) {\n            _this.onDragStart(dragStartEvent);\n        });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDroppable.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.unsubscribeFrom(this.dragStartSubscription);\n        this.unsubscribeFrom(this.dragMoveSubscription);\n        this.unsubscribeFrom(this.dragEndSubscription);\n    };\n    ClrDroppable.decorators = [\n        { type: Directive, args: [{\n                    selector: '[clrDroppable]',\n                    providers: [DomAdapter],\n                    host: { '[class.droppable]': 'true', '[class.draggable-match]': 'isDraggableMatch' },\n                },] }\n    ];\n    /** @nocollapse */\n    ClrDroppable.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: DragAndDropEventBusService },\n        { type: DomAdapter },\n        { type: Renderer2 }\n    ]; };\n    ClrDroppable.propDecorators = {\n        group: [{ type: Input, args: ['clrGroup',] }],\n        dropTolerance: [{ type: Input, args: ['clrDropTolerance',] }],\n        dragStartEmitter: [{ type: Output, args: ['clrDragStart',] }],\n        dragMoveEmitter: [{ type: Output, args: ['clrDragMove',] }],\n        dragEndEmitter: [{ type: Output, args: ['clrDragEnd',] }],\n        dragLeaveEmitter: [{ type: Output, args: ['clrDragLeave',] }],\n        dragEnterEmitter: [{ type: Output, args: ['clrDragEnter',] }],\n        dropEmitter: [{ type: Output, args: ['clrDrop',] }]\n    };\n    return ClrDroppable;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @template T\n */\nvar ClrDragHandle = /** @class */ (function () {\n    function ClrDragHandle(el, dragHandleRegistrar) {\n        this.el = el;\n        this.dragHandleRegistrar = dragHandleRegistrar;\n        if (!this.dragHandleRegistrar) {\n            // ClrDragHandleRegistrar is provided in ClrDraggable so we expect it to be present here\n            // as clrDragHandle is required to be used only inside of a clrDraggable directive.\n            throw new Error('The clrDragHandle directive can only be used inside of a clrDraggable directive.');\n        }\n        this.dragHandleRegistrar.registerCustomHandle(this.el.nativeElement);\n    }\n    /**\n     * @return {?}\n     */\n    ClrDragHandle.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.dragHandleRegistrar.unregisterCustomHandle();\n    };\n    ClrDragHandle.decorators = [\n        { type: Directive, args: [{ selector: '[clrDragHandle]', host: { '[class.drag-handle]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrDragHandle.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: DragHandleRegistrarService, decorators: [{ type: Optional }] }\n    ]; };\n    return ClrDragHandle;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_DRAG_AND_DROP_DIRECTIVES = [\n    ClrDraggable,\n    ClrDroppable,\n    ClrIfDragged,\n    ClrDragHandle,\n    ClrDraggableGhost,\n];\nvar ClrDragAndDropModule = /** @class */ (function () {\n    function ClrDragAndDropModule() {\n    }\n    ClrDragAndDropModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule],\n                    declarations: [CLR_DRAG_AND_DROP_DIRECTIVES],\n                    entryComponents: [ClrDraggableGhost],\n                    exports: [CLR_DRAG_AND_DROP_DIRECTIVES],\n                },] }\n    ];\n    return ClrDragAndDropModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar RootDropdownService = /** @class */ (function () {\n    function RootDropdownService() {\n        this._changes = new Subject();\n    }\n    Object.defineProperty(RootDropdownService.prototype, \"changes\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._changes.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    RootDropdownService.prototype.closeMenus = /**\n     * @return {?}\n     */\n    function () {\n        this._changes.next(false);\n    };\n    RootDropdownService.decorators = [\n        { type: Injectable }\n    ];\n    return RootDropdownService;\n}());\n/**\n * @param {?} existing\n * @return {?}\n */\nfunction clrRootDropdownFactory(existing) {\n    return existing || new RootDropdownService();\n}\n/** @type {?} */\nvar ROOT_DROPDOWN_PROVIDER = {\n    provide: RootDropdownService,\n    useFactory: clrRootDropdownFactory,\n    deps: [[new Optional(), new SkipSelf(), RootDropdownService]],\n};\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDropdown = /** @class */ (function () {\n    function ClrDropdown(parent, ifOpenService, cdr, dropdownService) {\n        var _this = this;\n        this.parent = parent;\n        this.ifOpenService = ifOpenService;\n        this.cdr = cdr;\n        this.subscriptions = [];\n        this.isMenuClosable = true;\n        this.subscriptions.push(dropdownService.changes.subscribe(function (value) { return (_this.ifOpenService.open = value); }));\n        this.subscriptions.push(ifOpenService.openChange.subscribe(function (value) { return _this.cdr.markForCheck(); }));\n    }\n    /**\n     * @return {?}\n     */\n    ClrDropdown.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n    };\n    ClrDropdown.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dropdown',\n                    template: '<ng-content></ng-content>',\n                    host: {\n                        '[class.dropdown]': 'true',\n                        // FIXME: remove this as soon as we stop supporting this old <div class=\"dropdown-menu\"> syntax\n                        '[class.open]': 'ifOpenService.open',\n                    },\n                    providers: [IfOpenService, ROOT_DROPDOWN_PROVIDER, { provide: POPOVER_HOST_ANCHOR, useExisting: ElementRef }]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDropdown.ctorParameters = function () { return [\n        { type: ClrDropdown, decorators: [{ type: SkipSelf }, { type: Optional }] },\n        { type: IfOpenService },\n        { type: ChangeDetectorRef },\n        { type: RootDropdownService }\n    ]; };\n    ClrDropdown.propDecorators = {\n        isMenuClosable: [{ type: Input, args: ['clrCloseMenuOnItemClick',] }]\n    };\n    return ClrDropdown;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDropdownItem = /** @class */ (function () {\n    function ClrDropdownItem(dropdown, el, _dropdownService, renderer) {\n        this.dropdown = dropdown;\n        this.el = el;\n        this._dropdownService = _dropdownService;\n        this.renderer = renderer;\n    }\n    /**\n     * @return {?}\n     */\n    ClrDropdownItem.prototype.ngAfterViewInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.renderer.listen(this.el.nativeElement, 'click', function () { return _this.onDropdownItemClick(); });\n    };\n    /**\n     * @return {?}\n     */\n    ClrDropdownItem.prototype.onDropdownItemClick = /**\n     * @return {?}\n     */\n    function () {\n        if (this.dropdown.isMenuClosable && !this.el.nativeElement.classList.contains('disabled')) {\n            this._dropdownService.closeMenus();\n        }\n    };\n    ClrDropdownItem.decorators = [\n        { type: Directive, args: [{ selector: '[clrDropdownItem]', host: { '[class.dropdown-item]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrDropdownItem.ctorParameters = function () { return [\n        { type: ClrDropdown },\n        { type: ElementRef },\n        { type: RootDropdownService },\n        { type: Renderer2 }\n    ]; };\n    return ClrDropdownItem;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDropdownMenu = /** @class */ (function (_super) {\n    __extends(ClrDropdownMenu, _super);\n    function ClrDropdownMenu(injector, parentHost, nested) {\n        var _this = this;\n        if (!parentHost) {\n            throw new Error('clr-dropdown-menu should only be used inside of a clr-dropdown');\n        }\n        _this = _super.call(this, injector, parentHost) || this;\n        if (!nested) {\n            // Default positioning for normal dropdown is bottom-left\n            _this.anchorPoint = Point.BOTTOM_LEFT;\n            _this.popoverPoint = Point.LEFT_TOP;\n        }\n        else {\n            // Default positioning for nested dropdown is right-top\n            _this.anchorPoint = Point.RIGHT_TOP;\n            _this.popoverPoint = Point.LEFT_TOP;\n        }\n        _this.popoverOptions.allowMultipleOpen = true;\n        _this.closeOnOutsideClick = true;\n        return _this;\n    }\n    Object.defineProperty(ClrDropdownMenu.prototype, \"position\", {\n        set: /**\n         * @param {?} position\n         * @return {?}\n         */\n        function (position) {\n            // set the popover values based on menu position\n            switch (position) {\n                case 'top-right':\n                    this.anchorPoint = Point.TOP_RIGHT;\n                    this.popoverPoint = Point.RIGHT_BOTTOM;\n                    break;\n                case 'top-left':\n                    this.anchorPoint = Point.TOP_LEFT;\n                    this.popoverPoint = Point.LEFT_BOTTOM;\n                    break;\n                case 'bottom-right':\n                    this.anchorPoint = Point.BOTTOM_RIGHT;\n                    this.popoverPoint = Point.RIGHT_TOP;\n                    break;\n                case 'bottom-left':\n                    this.anchorPoint = Point.BOTTOM_LEFT;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n                case 'right-top':\n                    this.anchorPoint = Point.RIGHT_TOP;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n                case 'right-bottom':\n                    this.anchorPoint = Point.RIGHT_BOTTOM;\n                    this.popoverPoint = Point.LEFT_BOTTOM;\n                    break;\n                case 'left-top':\n                    this.anchorPoint = Point.LEFT_TOP;\n                    this.popoverPoint = Point.RIGHT_TOP;\n                    break;\n                case 'left-bottom':\n                    this.anchorPoint = Point.LEFT_BOTTOM;\n                    this.popoverPoint = Point.RIGHT_BOTTOM;\n                    break;\n                default:\n                    this.anchorPoint = Point.BOTTOM_LEFT;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrDropdownMenu.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-dropdown-menu',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    host: {\n                        '[class.dropdown-menu]': 'true',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrDropdownMenu.ctorParameters = function () { return [\n        { type: Injector },\n        { type: ElementRef, decorators: [{ type: Optional }, { type: Inject, args: [POPOVER_HOST_ANCHOR,] }] },\n        { type: ClrDropdownMenu, decorators: [{ type: Optional }, { type: SkipSelf }] }\n    ]; };\n    ClrDropdownMenu.propDecorators = {\n        position: [{ type: Input, args: ['clrPosition',] }]\n    };\n    return ClrDropdownMenu;\n}(AbstractPopover));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrDropdownTrigger = /** @class */ (function () {\n    function ClrDropdownTrigger(dropdown, ifOpenService) {\n        this.ifOpenService = ifOpenService;\n        this.isRootLevelToggle = true;\n        // if the containing dropdown has a parent, then this is not the root level one\n        if (dropdown.parent) {\n            this.isRootLevelToggle = false;\n        }\n    }\n    Object.defineProperty(ClrDropdownTrigger.prototype, \"active\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ifOpenService.open;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    ClrDropdownTrigger.prototype.onDropdownTriggerClick = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        this.ifOpenService.toggleWithEvent(event);\n    };\n    ClrDropdownTrigger.decorators = [\n        { type: Directive, args: [{\n                    // We support both selectors for legacy reasons\n                    selector: '[clrDropdownTrigger],[clrDropdownToggle]',\n                    host: {\n                        '[class.dropdown-toggle]': 'isRootLevelToggle',\n                        '[class.dropdown-item]': '!isRootLevelToggle',\n                        '[class.expandable]': '!isRootLevelToggle',\n                        '[class.active]': 'active',\n                    },\n                },] }\n    ];\n    /** @nocollapse */\n    ClrDropdownTrigger.ctorParameters = function () { return [\n        { type: ClrDropdown },\n        { type: IfOpenService }\n    ]; };\n    ClrDropdownTrigger.propDecorators = {\n        onDropdownTriggerClick: [{ type: HostListener, args: ['click', ['$event'],] }]\n    };\n    return ClrDropdownTrigger;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_DROPDOWN_DIRECTIVES = [ClrDropdown, ClrDropdownMenu, ClrDropdownTrigger, ClrDropdownItem];\nvar ClrDropdownModule = /** @class */ (function () {\n    function ClrDropdownModule() {\n    }\n    ClrDropdownModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrCommonPopoverModule],\n                    declarations: [CLR_DROPDOWN_DIRECTIVES],\n                    exports: [CLR_DROPDOWN_DIRECTIVES, ClrConditionalModule, ClrIconModule],\n                },] }\n    ];\n    return ClrDropdownModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\n// @TODO Make this an enum\n/** @type {?} */\nvar ALERT_TYPES = ['info', 'warning', 'danger', 'success'];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar AlertIconAndTypesService = /** @class */ (function () {\n    function AlertIconAndTypesService(commonStrings) {\n        this.commonStrings = commonStrings;\n        this.defaultIconShape = 'info-circle';\n        this._alertIconShape = '';\n        this._alertType = 'info';\n    }\n    Object.defineProperty(AlertIconAndTypesService.prototype, \"alertType\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._alertType;\n        },\n        set: /**\n         * @param {?} val\n         * @return {?}\n         */\n        function (val) {\n            if (ALERT_TYPES.indexOf(val) > -1) {\n                this._alertType = val;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(AlertIconAndTypesService.prototype, \"alertIconShape\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if ('' === this._alertIconShape) {\n                return this.iconInfoFromType(this._alertType).shape;\n            }\n            return this._alertIconShape;\n        },\n        set: /**\n         * @param {?} val\n         * @return {?}\n         */\n        function (val) {\n            if (!val) {\n                this._alertIconShape = '';\n            }\n            else if (val !== this._alertIconShape) {\n                this._alertIconShape = val;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(AlertIconAndTypesService.prototype, \"alertIconTitle\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.iconInfoFromType(this._alertType).title;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} type\n     * @return {?}\n     */\n    AlertIconAndTypesService.prototype.iconInfoFromType = /**\n     * @param {?} type\n     * @return {?}\n     */\n    function (type) {\n        /** @type {?} */\n        var returnObj = { shape: '', cssClass: '', title: '' };\n        switch (type) {\n            case 'warning':\n                returnObj.shape = 'exclamation-triangle';\n                returnObj.cssClass = 'alert-warning';\n                returnObj.title = this.commonStrings.warning;\n                break;\n            case 'danger':\n                returnObj.shape = 'exclamation-circle';\n                returnObj.cssClass = 'alert-danger';\n                returnObj.title = this.commonStrings.danger;\n                break;\n            case 'success':\n                returnObj.shape = 'check-circle';\n                returnObj.cssClass = 'alert-success';\n                returnObj.title = this.commonStrings.success;\n                break;\n            default:\n                returnObj.shape = this.defaultIconShape;\n                returnObj.cssClass = 'alert-info';\n                returnObj.title = this.commonStrings.info;\n                break;\n        }\n        return returnObj;\n    };\n    AlertIconAndTypesService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    AlertIconAndTypesService.ctorParameters = function () { return [\n        { type: ClrCommonStrings }\n    ]; };\n    return AlertIconAndTypesService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar MultiAlertService = /** @class */ (function () {\n    function MultiAlertService() {\n        this.allAlerts = new QueryList();\n        this._current = 0;\n        /**\n         * The Observable that lets other classes subscribe to changes\n         */\n        this._change = new Subject();\n    }\n    Object.defineProperty(MultiAlertService.prototype, \"changes\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._change.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MultiAlertService.prototype, \"current\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._current;\n        },\n        set: /**\n         * @param {?} index\n         * @return {?}\n         */\n        function (index) {\n            if (index !== this._current) {\n                this._current = index;\n                this._change.next(index);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MultiAlertService.prototype, \"activeAlerts\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.allAlerts.filter(function (alert) { return !alert._closed; });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MultiAlertService.prototype, \"currentAlert\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.activeAlerts[this.current];\n        },\n        set: /**\n         * @param {?} alert\n         * @return {?}\n         */\n        function (alert) {\n            this.current = this.activeAlerts.indexOf(alert);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MultiAlertService.prototype, \"count\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.activeAlerts.length;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} alerts\n     * @return {?}\n     */\n    MultiAlertService.prototype.manage = /**\n     * @param {?} alerts\n     * @return {?}\n     */\n    function (alerts) {\n        var _this = this;\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n        this.allAlerts = alerts;\n        this.subscription = this.allAlerts.changes.subscribe(function () {\n            if (_this.current >= _this.allAlerts.length) {\n                _this.current = Math.max(0, _this.allAlerts.length - 1);\n            }\n        });\n    };\n    /**\n     * @return {?}\n     */\n    MultiAlertService.prototype.next = /**\n     * @return {?}\n     */\n    function () {\n        this.current = this.current === this.activeAlerts.length - 1 ? 0 : this.current + 1;\n    };\n    /**\n     * @return {?}\n     */\n    MultiAlertService.prototype.previous = /**\n     * @return {?}\n     */\n    function () {\n        if (this.activeAlerts.length === 0) {\n            return;\n        }\n        this.current = this.current === 0 ? this.activeAlerts.length - 1 : this.current - 1;\n    };\n    /**\n     * @return {?}\n     */\n    MultiAlertService.prototype.close = /**\n     * @return {?}\n     */\n    function () {\n        this.previous();\n    };\n    /**\n     * @return {?}\n     */\n    MultiAlertService.prototype.destroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.subscription) {\n            this.subscription.unsubscribe();\n        }\n    };\n    MultiAlertService.decorators = [\n        { type: Injectable }\n    ];\n    return MultiAlertService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrAlert = /** @class */ (function () {\n    function ClrAlert(iconService, cdr, multiAlertService, commonStrings) {\n        this.iconService = iconService;\n        this.cdr = cdr;\n        this.multiAlertService = multiAlertService;\n        this.commonStrings = commonStrings;\n        this.isSmall = false;\n        this.closable = true;\n        this.isAppLevel = false;\n        this._closed = false;\n        this._closedChanged = new EventEmitter(false);\n        this.previouslyHidden = false;\n        this.hidden = false;\n    }\n    Object.defineProperty(ClrAlert.prototype, \"alertType\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.iconService.alertType;\n        },\n        set: /**\n         * @param {?} val\n         * @return {?}\n         */\n        function (val) {\n            this.iconService.alertType = val;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrAlert.prototype, \"alertIconShape\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this.iconService.alertIconShape = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrAlert.prototype, \"alertClass\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.iconService.iconInfoFromType(this.iconService.alertType).cssClass;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrAlert.prototype.detectChangesIfNeeded = /**\n     * @return {?}\n     */\n    function () {\n        if (this.previouslyHidden !== this.hidden) {\n            this.previouslyHidden = this.hidden;\n            this.cdr.detectChanges();\n        }\n    };\n    Object.defineProperty(ClrAlert.prototype, \"isHidden\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (this.multiAlertService) {\n                if (this.multiAlertService.currentAlert === this) {\n                    if (this.hidden === true) {\n                        this.previouslyHidden = true;\n                        this.hidden = false;\n                    }\n                }\n                else if (this.hidden === false) {\n                    this.previouslyHidden = false;\n                    this.hidden = true;\n                }\n                this.detectChangesIfNeeded();\n            }\n            return this.hidden;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrAlert.prototype.close = /**\n     * @return {?}\n     */\n    function () {\n        if (!this.closable) {\n            return;\n        }\n        this._closed = true;\n        if (this.multiAlertService) {\n            this.multiAlertService.close();\n        }\n        this._closedChanged.emit(true);\n    };\n    /**\n     * @return {?}\n     */\n    ClrAlert.prototype.open = /**\n     * @return {?}\n     */\n    function () {\n        this._closed = false;\n        this._closedChanged.emit(false);\n    };\n    ClrAlert.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-alert',\n                    providers: [AlertIconAndTypesService],\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<div\\n    *ngIf=\\\"!_closed\\\"\\n    class=\\\"alert\\\"\\n    [ngClass]=\\\"alertClass\\\"\\n    [class.alert-hidden]=\\\"isHidden\\\"\\n    [class.alert-sm]=\\\"isSmall\\\"\\n    [class.alert-app-level]=\\\"isAppLevel\\\"\\n    role=\\\"alert\\\"\\n    aria-live=\\\"assertive\\\">\\n    <div class=\\\"alert-items\\\">\\n        <ng-content></ng-content>\\n    </div>\\n    <button type=\\\"button\\\" class=\\\"close\\\" *ngIf=\\\"closable\\\" (click)=\\\"close()\\\">\\n        <clr-icon shape=\\\"close\\\" [attr.title]=\\\"commonStrings.close\\\"></clr-icon>\\n    </button>\\n</div>\\n\",\n                    styles: [':host { display: block; }']\n                }] }\n    ];\n    /** @nocollapse */\n    ClrAlert.ctorParameters = function () { return [\n        { type: AlertIconAndTypesService },\n        { type: ChangeDetectorRef },\n        { type: MultiAlertService, decorators: [{ type: Optional }] },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrAlert.propDecorators = {\n        isSmall: [{ type: Input, args: ['clrAlertSizeSmall',] }],\n        closable: [{ type: Input, args: ['clrAlertClosable',] }],\n        isAppLevel: [{ type: Input, args: ['clrAlertAppLevel',] }],\n        _closed: [{ type: Input, args: ['clrAlertClosed',] }],\n        _closedChanged: [{ type: Output, args: ['clrAlertClosedChange',] }],\n        alertType: [{ type: Input, args: ['clrAlertType',] }],\n        alertIconShape: [{ type: Input, args: ['clrAlertIcon',] }]\n    };\n    return ClrAlert;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrAlertItem = /** @class */ (function () {\n    function ClrAlertItem(iconService) {\n        this.iconService = iconService;\n    }\n    ClrAlertItem.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-alert-item',\n                    template: \"\\n        <div class=\\\"alert-icon-wrapper\\\">\\n            <clr-icon class=\\\"alert-icon\\\" \\n              [attr.shape]=\\\"iconService.alertIconShape\\\" \\n              [attr.title]=\\\"iconService.alertIconTitle\\\"></clr-icon>\\n        </div>\\n        <ng-content></ng-content>\\n    \",\n                    host: { class: 'alert-item' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrAlertItem.ctorParameters = function () { return [\n        { type: AlertIconAndTypesService }\n    ]; };\n    return ClrAlertItem;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrAlerts = /** @class */ (function () {\n    function ClrAlerts(multiAlertService) {\n        this.multiAlertService = multiAlertService;\n        this.currentAlertIndexChange = new EventEmitter(false);\n        this.currentAlertChange = new EventEmitter(false);\n    }\n    Object.defineProperty(ClrAlerts.prototype, \"_inputCurrentIndex\", {\n        /**\n         * Input/Output to support two way binding on current alert index\n         */\n        set: /**\n         * Input/Output to support two way binding on current alert index\n         * @param {?} index\n         * @return {?}\n         */\n        function (index) {\n            if (Number.isInteger(index) && index >= 0) {\n                this.multiAlertService.current = index;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrAlerts.prototype, \"currentAlertIndex\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.multiAlertService.current;\n        },\n        set: /**\n         * @param {?} index\n         * @return {?}\n         */\n        function (index) {\n            this.multiAlertService.current = index;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrAlerts.prototype, \"currentAlert\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.multiAlertService.currentAlert;\n        },\n        /**\n         * Input/Output to support two way binding on current alert instance\n         */\n        set: /**\n         * Input/Output to support two way binding on current alert instance\n         * @param {?} alert\n         * @return {?}\n         */\n        function (alert) {\n            if (alert) {\n                this.multiAlertService.currentAlert = alert;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrAlerts.prototype, \"alerts\", {\n        /**\n         * Ensure we are only dealing with alerts that have not been closed yet\n         */\n        get: /**\n         * Ensure we are only dealing with alerts that have not been closed yet\n         * @return {?}\n         */\n        function () {\n            return this.allAlerts.filter(function (alert) {\n                return alert.isHidden === false;\n            });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrAlerts.prototype, \"currentAlertType\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (this.multiAlertService.currentAlert) {\n                return this.multiAlertService.currentAlert.alertType;\n            }\n            return '';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrAlerts.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.multiAlertService.manage(this.allAlerts);\n        this.multiAlertService.changes.subscribe(function (index) {\n            _this.currentAlertIndexChange.next(index);\n            _this.currentAlertChange.next(_this.multiAlertService.currentAlert);\n        });\n    };\n    /**\n     * @return {?}\n     */\n    ClrAlerts.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.multiAlertService.destroy();\n    };\n    ClrAlerts.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-alerts',\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<clr-alerts-pager\\n        *ngIf=\\\"multiAlertService.count > 1\\\"\\n        [clrCurrentAlertIndex]=\\\"currentAlertIndex\\\">\\n</clr-alerts-pager>\\n<ng-content select=\\\"clr-alert\\\"></ng-content>\\n\",\n                    providers: [MultiAlertService],\n                    host: {\n                        '[class.alerts]': 'true',\n                        '[class.alert-danger]': \"this.currentAlertType == 'danger'\",\n                        '[class.alert-info]': \"this.currentAlertType == 'info'\",\n                        '[class.alert-success]': \"this.currentAlertType == 'success'\",\n                        '[class.alert-warning]': \"this.currentAlertType == 'warning'\",\n                    },\n                    styles: [':host { display: block }']\n                }] }\n    ];\n    /** @nocollapse */\n    ClrAlerts.ctorParameters = function () { return [\n        { type: MultiAlertService }\n    ]; };\n    ClrAlerts.propDecorators = {\n        allAlerts: [{ type: ContentChildren, args: [ClrAlert,] }],\n        _inputCurrentIndex: [{ type: Input, args: ['clrCurrentAlertIndex',] }],\n        currentAlertIndexChange: [{ type: Output, args: ['clrCurrentAlertIndexChange',] }],\n        currentAlert: [{ type: Input, args: ['clrCurrentAlert',] }],\n        currentAlertChange: [{ type: Output, args: ['clrCurrentAlertChange',] }]\n    };\n    return ClrAlerts;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrAlertsPager = /** @class */ (function () {\n    function ClrAlertsPager(multiAlertService, commonStrings) {\n        this.multiAlertService = multiAlertService;\n        this.commonStrings = commonStrings;\n        this.currentAlertChange = new EventEmitter(false);\n        this.currentAlertIndexChange = new EventEmitter();\n    }\n    Object.defineProperty(ClrAlertsPager.prototype, \"currentAlert\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.multiAlertService.currentAlert;\n        },\n        /**\n         * Input/Output to support two way binding on current alert instance\n         */\n        set: /**\n         * Input/Output to support two way binding on current alert instance\n         * @param {?} alert\n         * @return {?}\n         */\n        function (alert) {\n            if (alert) {\n                this.multiAlertService.currentAlert = alert;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrAlertsPager.prototype, \"currentAlertIndex\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.multiAlertService.current;\n        },\n        /**\n         * Input/Output to support two way binding on current alert index\n         */\n        set: /**\n         * Input/Output to support two way binding on current alert index\n         * @param {?} index\n         * @return {?}\n         */\n        function (index) {\n            this.multiAlertService.current = index;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrAlertsPager.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.multiAlertServiceChanges = this.multiAlertService.changes.subscribe(function (index) {\n            _this.currentAlertIndexChange.emit(index);\n            _this.currentAlertChange.emit(_this.multiAlertService.activeAlerts[index]);\n        });\n    };\n    /**\n     * @return {?}\n     */\n    ClrAlertsPager.prototype.pageUp = /**\n     * @return {?}\n     */\n    function () {\n        this.multiAlertService.next();\n    };\n    /**\n     * @return {?}\n     */\n    ClrAlertsPager.prototype.pageDown = /**\n     * @return {?}\n     */\n    function () {\n        this.multiAlertService.previous();\n    };\n    /**\n     * @return {?}\n     */\n    ClrAlertsPager.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.multiAlertServiceChanges.unsubscribe();\n    };\n    ClrAlertsPager.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-alerts-pager',\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<div class=\\\"alerts-pager-control\\\">\\n    <div class=\\\"alerts-page-down\\\">\\n        <button class=\\\"alerts-pager-button\\\" (click)=\\\"pageDown()\\\">\\n            <clr-icon shape=\\\"caret left\\\" [attr.title]=\\\"commonStrings.previous\\\"></clr-icon>\\n        </button>\\n    </div>\\n    <div class=\\\"alerts-pager-text\\\">\\n        {{this.multiAlertService.current+1}} / {{this.multiAlertService.count}}\\n    </div>\\n    <div class=\\\"alerts-page-up\\\">\\n        <button class=\\\"alerts-pager-button\\\" (click)=\\\"pageUp()\\\">\\n            <clr-icon shape=\\\"caret right\\\" [attr.title]=\\\"commonStrings.next\\\"></clr-icon>\\n        </button>\\n    </div>\\n</div>\\n\",\n                    host: { '[class.alerts-pager]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrAlertsPager.ctorParameters = function () { return [\n        { type: MultiAlertService },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrAlertsPager.propDecorators = {\n        currentAlert: [{ type: Input, args: ['clrCurrentAlert',] }],\n        currentAlertChange: [{ type: Output, args: ['clrCurrentAlertChange',] }],\n        currentAlertIndex: [{ type: Input, args: ['clrCurrentAlertIndex',] }],\n        currentAlertIndexChange: [{ type: Output, args: ['clrCurrentAlertIndexChange',] }]\n    };\n    return ClrAlertsPager;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_ALERT_DIRECTIVES = [ClrAlert, ClrAlertItem, ClrAlerts, ClrAlertsPager];\nvar ClrAlertModule = /** @class */ (function () {\n    function ClrAlertModule() {\n    }\n    ClrAlertModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule, ClrDropdownModule],\n                    declarations: [CLR_ALERT_DIRECTIVES],\n                    exports: [CLR_ALERT_DIRECTIVES],\n                },] }\n    ];\n    return ClrAlertModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrEmphasisModule = /** @class */ (function () {\n    function ClrEmphasisModule() {\n    }\n    ClrEmphasisModule.decorators = [\n        { type: NgModule, args: [{ exports: [ClrAlertModule] },] }\n    ];\n    return ClrEmphasisModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\nvar ResponsiveNavCodes = /** @class */ (function () {\n    function ResponsiveNavCodes() {\n    }\n    ResponsiveNavCodes.NAV_LEVEL_1 = 1;\n    ResponsiveNavCodes.NAV_LEVEL_2 = 2;\n    ResponsiveNavCodes.NAV_CLOSE_ALL = 'NAV_CLOSE_ALL';\n    ResponsiveNavCodes.NAV_OPEN = 'NAV_OPEN';\n    ResponsiveNavCodes.NAV_CLOSE = 'NAV_CLOSE';\n    ResponsiveNavCodes.NAV_TOGGLE = 'NAV_TOGGLE';\n    ResponsiveNavCodes.NAV_CLASS_HAMBURGER_MENU = 'open-hamburger-menu';\n    ResponsiveNavCodes.NAV_CLASS_OVERFLOW_MENU = 'open-overflow-menu';\n    ResponsiveNavCodes.NAV_CLASS_TRIGGER_1 = 'header-hamburger-trigger';\n    ResponsiveNavCodes.NAV_CLASS_TRIGGER_2 = 'header-overflow-trigger';\n    ResponsiveNavCodes.NAV_CLASS_LEVEL_1 = 'clr-nav-level-1';\n    ResponsiveNavCodes.NAV_CLASS_LEVEL_2 = 'clr-nav-level-2';\n    return ResponsiveNavCodes;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/*\n * Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\n * This software is released under MIT license.\n * The full license information can be found in LICENSE in the root directory of this project.\n */\nvar ResponsiveNavControlMessage = /** @class */ (function () {\n    function ResponsiveNavControlMessage(_controlCode, _navLevel) {\n        this._controlCode = _controlCode;\n        this._navLevel = _navLevel;\n    }\n    Object.defineProperty(ResponsiveNavControlMessage.prototype, \"controlCode\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._controlCode;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ResponsiveNavControlMessage.prototype, \"navLevel\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._navLevel;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return ResponsiveNavControlMessage;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ResponsiveNavigationService = /** @class */ (function () {\n    function ResponsiveNavigationService() {\n        this.responsiveNavList = [];\n        this.registerNavSubject = new Subject();\n        this.controlNavSubject = new Subject();\n        this.closeAllNavs(); // We start with all navs closed\n    }\n    Object.defineProperty(ResponsiveNavigationService.prototype, \"registeredNavs\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.registerNavSubject.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ResponsiveNavigationService.prototype, \"navControl\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.controlNavSubject.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    ResponsiveNavigationService.prototype.registerNav = /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    function (navLevel) {\n        if (!navLevel || this.isNavRegistered(navLevel)) {\n            return;\n        }\n        this.responsiveNavList.push(navLevel);\n        this.registerNavSubject.next(this.responsiveNavList);\n    };\n    /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    ResponsiveNavigationService.prototype.isNavRegistered = /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    function (navLevel) {\n        if (this.responsiveNavList.indexOf(navLevel) > -1) {\n            console.error('Multiple clr-nav-level ' + navLevel + ' attributes found. Please make sure that only one exists');\n            return true;\n        }\n        return false;\n    };\n    /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    ResponsiveNavigationService.prototype.unregisterNav = /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    function (navLevel) {\n        /** @type {?} */\n        var index = this.responsiveNavList.indexOf(navLevel);\n        if (index > -1) {\n            this.responsiveNavList.splice(index, 1);\n            this.registerNavSubject.next(this.responsiveNavList);\n        }\n    };\n    /**\n     * @param {?} controlCode\n     * @param {?} navLevel\n     * @return {?}\n     */\n    ResponsiveNavigationService.prototype.sendControlMessage = /**\n     * @param {?} controlCode\n     * @param {?} navLevel\n     * @return {?}\n     */\n    function (controlCode, navLevel) {\n        /** @type {?} */\n        var message = new ResponsiveNavControlMessage(controlCode, navLevel);\n        this.controlNavSubject.next(message);\n    };\n    /**\n     * @return {?}\n     */\n    ResponsiveNavigationService.prototype.closeAllNavs = /**\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var message = new ResponsiveNavControlMessage(ResponsiveNavCodes.NAV_CLOSE_ALL, -999);\n        this.controlNavSubject.next(message);\n    };\n    ResponsiveNavigationService.decorators = [\n        { type: Injectable, args: [{ providedIn: 'root' },] }\n    ];\n    /** @nocollapse */\n    ResponsiveNavigationService.ctorParameters = function () { return []; };\n    /** @nocollapse */ ResponsiveNavigationService.ngInjectableDef = defineInjectable({ factory: function ResponsiveNavigationService_Factory() { return new ResponsiveNavigationService(); }, token: ResponsiveNavigationService, providedIn: \"root\" });\n    return ResponsiveNavigationService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrMainContainer = /** @class */ (function () {\n    function ClrMainContainer(elRef, responsiveNavService) {\n        this.elRef = elRef;\n        this.responsiveNavService = responsiveNavService;\n    }\n    /**\n     * @return {?}\n     */\n    ClrMainContainer.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this._classList = this.elRef.nativeElement.classList;\n        this._subscription = this.responsiveNavService.navControl.subscribe({\n            next: function (message) {\n                _this.processMessage(message);\n            },\n        });\n    };\n    /**\n     * @param {?} message\n     * @return {?}\n     */\n    ClrMainContainer.prototype.processMessage = /**\n     * @param {?} message\n     * @return {?}\n     */\n    function (message) {\n        /** @type {?} */\n        var navClass = ResponsiveNavCodes.NAV_CLASS_HAMBURGER_MENU;\n        if (message.controlCode === ResponsiveNavCodes.NAV_CLOSE_ALL) {\n            this._classList.remove(ResponsiveNavCodes.NAV_CLASS_HAMBURGER_MENU);\n            this._classList.remove(ResponsiveNavCodes.NAV_CLASS_OVERFLOW_MENU);\n        }\n        else if (message.navLevel === ResponsiveNavCodes.NAV_LEVEL_1) {\n            this.controlNav(message.controlCode, navClass);\n        }\n        else if (message.navLevel === ResponsiveNavCodes.NAV_LEVEL_2) {\n            navClass = ResponsiveNavCodes.NAV_CLASS_OVERFLOW_MENU;\n            this.controlNav(message.controlCode, navClass);\n        }\n    };\n    /**\n     * @param {?} controlCode\n     * @param {?} navClass\n     * @return {?}\n     */\n    ClrMainContainer.prototype.controlNav = /**\n     * @param {?} controlCode\n     * @param {?} navClass\n     * @return {?}\n     */\n    function (controlCode, navClass) {\n        if (controlCode === ResponsiveNavCodes.NAV_OPEN) {\n            this._classList.add(navClass);\n        }\n        else if (controlCode === ResponsiveNavCodes.NAV_CLOSE) {\n            this._classList.remove(navClass);\n        }\n        else if (controlCode === ResponsiveNavCodes.NAV_TOGGLE) {\n            this._classList.toggle(navClass);\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrMainContainer.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._subscription.unsubscribe();\n    };\n    ClrMainContainer.decorators = [\n        { type: Directive, args: [{ selector: 'clr-main-container', host: { '[class.main-container]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrMainContainer.ctorParameters = function () { return [\n        { type: ElementRef },\n        { type: ResponsiveNavigationService }\n    ]; };\n    return ClrMainContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_LAYOUT_DIRECTIVES = [ClrMainContainer];\nvar ClrMainContainerModule = /** @class */ (function () {\n    function ClrMainContainerModule() {\n    }\n    ClrMainContainerModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule],\n                    declarations: [CLR_LAYOUT_DIRECTIVES],\n                    exports: [CLR_LAYOUT_DIRECTIVES],\n                },] }\n    ];\n    return ClrMainContainerModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar MainContainerWillyWonka = /** @class */ (function (_super) {\n    __extends(MainContainerWillyWonka, _super);\n    function MainContainerWillyWonka() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    MainContainerWillyWonka.decorators = [\n        { type: Directive, args: [{ selector: 'clr-main-container' },] }\n    ];\n    return MainContainerWillyWonka;\n}(WillyWonka));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar NavDetectionOompaLoompa = /** @class */ (function (_super) {\n    __extends(NavDetectionOompaLoompa, _super);\n    function NavDetectionOompaLoompa(cdr, willyWonka, responsiveNavService) {\n        var _this = this;\n        if (!willyWonka) {\n            throw new Error('clr-header should only be used inside of a clr-main-container');\n        }\n        _this = _super.call(this, cdr, willyWonka) || this;\n        _this.responsiveNavService = responsiveNavService;\n        return _this;\n    }\n    Object.defineProperty(NavDetectionOompaLoompa.prototype, \"flavor\", {\n        // NavDetectionOompaLoompa is the addition of the nav levels\n        // Since we support 2 levels, the possibilities are 0, 1 or 3 (1 + 2)\n        get: \n        // NavDetectionOompaLoompa is the addition of the nav levels\n        // Since we support 2 levels, the possibilities are 0, 1 or 3 (1 + 2)\n        /**\n         * @return {?}\n         */\n        function () {\n            return this.responsiveNavService.responsiveNavList.reduce(function (sum, navLevel) { return sum + navLevel; }, 0);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    NavDetectionOompaLoompa.decorators = [\n        { type: Directive, args: [{ selector: 'clr-header' },] }\n    ];\n    /** @nocollapse */\n    NavDetectionOompaLoompa.ctorParameters = function () { return [\n        { type: ChangeDetectorRef },\n        { type: MainContainerWillyWonka, decorators: [{ type: Optional }] },\n        { type: ResponsiveNavigationService }\n    ]; };\n    return NavDetectionOompaLoompa;\n}(OompaLoompa));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrHeader = /** @class */ (function () {\n    function ClrHeader(responsiveNavService) {\n        var _this = this;\n        this.responsiveNavService = responsiveNavService;\n        this.isNavLevel1OnPage = false;\n        this.isNavLevel2OnPage = false;\n        this.responsiveNavCodes = ResponsiveNavCodes;\n        this._subscription = this.responsiveNavService.registeredNavs.subscribe({\n            next: function (navLevelList) {\n                _this.initializeNavTriggers(navLevelList);\n            },\n        });\n    }\n    // reset triggers. handles cases when an application has different nav levels on different pages.\n    // reset triggers. handles cases when an application has different nav levels on different pages.\n    /**\n     * @return {?}\n     */\n    ClrHeader.prototype.resetNavTriggers = \n    // reset triggers. handles cases when an application has different nav levels on different pages.\n    /**\n     * @return {?}\n     */\n    function () {\n        this.isNavLevel1OnPage = false;\n        this.isNavLevel2OnPage = false;\n    };\n    // decides which triggers to show on the header\n    // decides which triggers to show on the header\n    /**\n     * @param {?} navList\n     * @return {?}\n     */\n    ClrHeader.prototype.initializeNavTriggers = \n    // decides which triggers to show on the header\n    /**\n     * @param {?} navList\n     * @return {?}\n     */\n    function (navList) {\n        var _this = this;\n        this.resetNavTriggers();\n        if (navList.length > 2) {\n            console.error('More than 2 Nav Levels detected.');\n            return;\n        }\n        navList.forEach(function (navLevel) {\n            if (navLevel === ResponsiveNavCodes.NAV_LEVEL_1) {\n                _this.isNavLevel1OnPage = true;\n            }\n            else if (navLevel === ResponsiveNavCodes.NAV_LEVEL_2) {\n                _this.isNavLevel2OnPage = true;\n            }\n        });\n    };\n    // closes the nav that is open\n    // closes the nav that is open\n    /**\n     * @return {?}\n     */\n    ClrHeader.prototype.closeOpenNav = \n    // closes the nav that is open\n    /**\n     * @return {?}\n     */\n    function () {\n        this.responsiveNavService.closeAllNavs();\n    };\n    // toggles the nav that is open\n    // toggles the nav that is open\n    /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    ClrHeader.prototype.toggleNav = \n    // toggles the nav that is open\n    /**\n     * @param {?} navLevel\n     * @return {?}\n     */\n    function (navLevel) {\n        this.responsiveNavService.sendControlMessage(ResponsiveNavCodes.NAV_TOGGLE, navLevel);\n    };\n    /**\n     * @return {?}\n     */\n    ClrHeader.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._subscription.unsubscribe();\n    };\n    ClrHeader.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-header',\n                    template: \"\\n        <button\\n            type=\\\"button\\\"\\n            *ngIf=\\\"isNavLevel1OnPage\\\"\\n            class=\\\"header-hamburger-trigger\\\"\\n            (click)=\\\"toggleNav(responsiveNavCodes.NAV_LEVEL_1)\\\">\\n            <span></span>\\n        </button>\\n        <ng-content></ng-content>\\n        <button\\n            type=\\\"button\\\"\\n            *ngIf=\\\"isNavLevel2OnPage\\\"\\n            class=\\\"header-overflow-trigger\\\"\\n            (click)=\\\"toggleNav(responsiveNavCodes.NAV_LEVEL_2)\\\">\\n            <span></span>\\n        </button>\\n        <div class=\\\"header-backdrop\\\" (click)=\\\"closeOpenNav()\\\"></div>\\n    \",\n                    host: { '[class.header]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrHeader.ctorParameters = function () { return [\n        { type: ResponsiveNavigationService }\n    ]; };\n    return ClrHeader;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrNavLevel = /** @class */ (function () {\n    function ClrNavLevel(responsiveNavService, elementRef) {\n        this.responsiveNavService = responsiveNavService;\n        this.elementRef = elementRef;\n    }\n    /**\n     * @return {?}\n     */\n    ClrNavLevel.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        if (this.level !== ResponsiveNavCodes.NAV_LEVEL_1 && this.level !== ResponsiveNavCodes.NAV_LEVEL_2) {\n            console.error('Nav Level can only be 1 or 2');\n            return;\n        }\n        this.responsiveNavService.registerNav(this.level);\n        this.addNavClass(this.level);\n    };\n    /**\n     * @param {?} level\n     * @return {?}\n     */\n    ClrNavLevel.prototype.addNavClass = /**\n     * @param {?} level\n     * @return {?}\n     */\n    function (level) {\n        /** @type {?} */\n        var navHostClassList = this.elementRef.nativeElement.classList;\n        if (level === ResponsiveNavCodes.NAV_LEVEL_1) {\n            navHostClassList.add(ResponsiveNavCodes.NAV_CLASS_LEVEL_1);\n        }\n        else if (level === ResponsiveNavCodes.NAV_LEVEL_2) {\n            navHostClassList.add(ResponsiveNavCodes.NAV_CLASS_LEVEL_2);\n        }\n    };\n    Object.defineProperty(ClrNavLevel.prototype, \"level\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._level;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrNavLevel.prototype, \"responsiveNavCodes\", {\n        // getter to access the responsive navigation codes from the template\n        get: \n        // getter to access the responsive navigation codes from the template\n        /**\n         * @return {?}\n         */\n        function () {\n            return ResponsiveNavCodes;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrNavLevel.prototype.open = /**\n     * @return {?}\n     */\n    function () {\n        this.responsiveNavService.sendControlMessage(ResponsiveNavCodes.NAV_OPEN, this.level);\n    };\n    /**\n     * @return {?}\n     */\n    ClrNavLevel.prototype.close = /**\n     * @return {?}\n     */\n    function () {\n        this.responsiveNavService.sendControlMessage(ResponsiveNavCodes.NAV_CLOSE, this.level);\n    };\n    // TODO: Figure out whats the best way to do this. Possible methods\n    // 1. HostListener (current solution)\n    // 2. Directives on the .nav-link class. We discussed on moving away from class selectors but I forget the reason\n    // why\n    // TODO: Figure out whats the best way to do this. Possible methods\n    // 1. HostListener (current solution)\n    // 2. Directives on the .nav-link class. We discussed on moving away from class selectors but I forget the reason\n    // why\n    /**\n     * @param {?} target\n     * @return {?}\n     */\n    ClrNavLevel.prototype.onMouseClick = \n    // TODO: Figure out whats the best way to do this. Possible methods\n    // 1. HostListener (current solution)\n    // 2. Directives on the .nav-link class. We discussed on moving away from class selectors but I forget the reason\n    // why\n    /**\n     * @param {?} target\n     * @return {?}\n     */\n    function (target) {\n        /** @type {?} */\n        var current = target;\n        // Get the element in the DOM on which the mouse was clicked\n        /** @type {?} */\n        var navHost = this.elementRef.nativeElement;\n        // Start checking if current and navHost are equal.\n        // If not traverse to the parentNode and check again.\n        while (current) {\n            if (current === navHost) {\n                return;\n            }\n            else if (current.classList.contains('nav-link')) {\n                this.close();\n                return;\n            }\n            current = current.parentNode;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrNavLevel.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.responsiveNavService.unregisterNav(this.level);\n    };\n    ClrNavLevel.decorators = [\n        { type: Directive, args: [{ selector: '[clr-nav-level]' },] }\n    ];\n    /** @nocollapse */\n    ClrNavLevel.ctorParameters = function () { return [\n        { type: ResponsiveNavigationService },\n        { type: ElementRef }\n    ]; };\n    ClrNavLevel.propDecorators = {\n        _level: [{ type: Input, args: ['clr-nav-level',] }],\n        onMouseClick: [{ type: HostListener, args: ['click', ['$event.target'],] }]\n    };\n    return ClrNavLevel;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_NAVIGATION_DIRECTIVES = [\n    ClrHeader,\n    ClrNavLevel,\n    NavDetectionOompaLoompa,\n    MainContainerWillyWonka,\n];\nvar ClrNavigationModule = /** @class */ (function () {\n    function ClrNavigationModule() {\n    }\n    ClrNavigationModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule, ClrDropdownModule],\n                    declarations: [CLR_NAVIGATION_DIRECTIVES],\n                    exports: [CLR_NAVIGATION_DIRECTIVES],\n                },] }\n    ];\n    return ClrNavigationModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar TemplateRefContainer = /** @class */ (function () {\n    function TemplateRefContainer() {\n    }\n    TemplateRefContainer.decorators = [\n        { type: Component, args: [{\n                    template: \"\\n      <ng-template>\\n        <ng-content></ng-content>\\n      </ng-template>\\n    \"\n                }] }\n    ];\n    TemplateRefContainer.propDecorators = {\n        template: [{ type: ViewChild, args: [TemplateRef,] }]\n    };\n    return TemplateRefContainer;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar TEMPLATE_REF_DIRECTIVES = [TemplateRefContainer];\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTemplateRefModule = /** @class */ (function () {\n    function ClrTemplateRefModule() {\n    }\n    ClrTemplateRefModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule],\n                    declarations: [TEMPLATE_REF_DIRECTIVES],\n                    entryComponents: [TEMPLATE_REF_DIRECTIVES],\n                    exports: [TEMPLATE_REF_DIRECTIVES],\n                },] }\n    ];\n    return ClrTemplateRefModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar TabsWillyWonka = /** @class */ (function (_super) {\n    __extends(TabsWillyWonka, _super);\n    function TabsWillyWonka() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    TabsWillyWonka.decorators = [\n        { type: Directive, args: [{ selector: 'clr-tabs' },] }\n    ];\n    return TabsWillyWonka;\n}(WillyWonka));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ActiveOompaLoompa = /** @class */ (function (_super) {\n    __extends(ActiveOompaLoompa, _super);\n    function ActiveOompaLoompa(cdr, willyWonka, id, ifActive) {\n        var _this = this;\n        if (!willyWonka) {\n            throw new Error('clrTabLink and clr-tab-content should only be used inside of a clr-tabs');\n        }\n        _this = _super.call(this, cdr, willyWonka) || this;\n        _this.ifActive = ifActive;\n        _this.id = id;\n        return _this;\n    }\n    Object.defineProperty(ActiveOompaLoompa.prototype, \"flavor\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ifActive.current === this.id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ActiveOompaLoompa.decorators = [\n        { type: Directive, args: [{ selector: '[clrTabLink], clr-tab-content' },] }\n    ];\n    /** @nocollapse */\n    ActiveOompaLoompa.ctorParameters = function () { return [\n        { type: ChangeDetectorRef },\n        { type: TabsWillyWonka, decorators: [{ type: Optional }] },\n        { type: Number, decorators: [{ type: Inject, args: [IF_ACTIVE_ID,] }] },\n        { type: IfActiveService }\n    ]; };\n    return ActiveOompaLoompa;\n}(OompaLoompa));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// TODO: if we find more components that could use this, consider moving this to utils\nvar AriaService = /** @class */ (function () {\n    function AriaService() {\n    }\n    AriaService.decorators = [\n        { type: Injectable }\n    ];\n    return AriaService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar TabsService = /** @class */ (function () {\n    function TabsService() {\n        this._children = [];\n    }\n    /**\n     * @param {?} tab\n     * @return {?}\n     */\n    TabsService.prototype.register = /**\n     * @param {?} tab\n     * @return {?}\n     */\n    function (tab) {\n        this._children.push(tab);\n    };\n    Object.defineProperty(TabsService.prototype, \"children\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._children;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(TabsService.prototype, \"activeTab\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.children.find(function (tab) {\n                return tab.active;\n            });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(TabsService.prototype, \"overflowTabs\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.children.filter(function (tab) {\n                return tab.tabLink.inOverflow === true;\n            });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} tab\n     * @return {?}\n     */\n    TabsService.prototype.unregister = /**\n     * @param {?} tab\n     * @return {?}\n     */\n    function (tab) {\n        /** @type {?} */\n        var index = this.children.indexOf(tab);\n        if (index > -1) {\n            this.children.splice(index, 1);\n        }\n    };\n    TabsService.decorators = [\n        { type: Injectable }\n    ];\n    return TabsService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar nbTabContentComponents = 0;\nvar ClrTabContent = /** @class */ (function () {\n    function ClrTabContent(ifActiveService, id, ariaService) {\n        this.ifActiveService = ifActiveService;\n        this.id = id;\n        this.ariaService = ariaService;\n        if (!this.tabContentId) {\n            this.tabContentId = 'clr-tab-content-' + nbTabContentComponents++;\n        }\n    }\n    Object.defineProperty(ClrTabContent.prototype, \"ariaLabelledBy\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ariaService.ariaLabelledBy;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTabContent.prototype, \"tabContentId\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ariaService.ariaControls;\n        },\n        set: /**\n         * @param {?} id\n         * @return {?}\n         */\n        function (id) {\n            this.ariaService.ariaControls = id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTabContent.prototype, \"active\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ifActiveService.current === this.id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrTabContent.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tab-content',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    host: {\n                        '[id]': 'tabContentId',\n                        '[attr.aria-labelledby]': 'ariaLabelledBy',\n                        '[attr.aria-hidden]': '!active',\n                        '[attr.aria-expanded]': 'active',\n                        '[attr.data-hidden]': '!active',\n                        role: 'tabpanel',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTabContent.ctorParameters = function () { return [\n        { type: IfActiveService },\n        { type: Number, decorators: [{ type: Inject, args: [IF_ACTIVE_ID,] }] },\n        { type: AriaService }\n    ]; };\n    ClrTabContent.propDecorators = {\n        templateRef: [{ type: ViewChild, args: ['tabContentProjectedRef',] }],\n        tabContentId: [{ type: Input, args: ['id',] }]\n    };\n    return ClrTabContent;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar nbTabsComponent = 0;\n/** @type {?} */\nvar TABS_ID = new InjectionToken('TABS_ID');\n/**\n * @return {?}\n */\nfunction tokenFactory$1() {\n    return 'clr-tabs-' + nbTabsComponent++;\n}\n/** @type {?} */\nvar TABS_ID_PROVIDER = {\n    provide: TABS_ID,\n    useFactory: tokenFactory$1,\n};\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar nbTabLinkComponents = 0;\nvar ClrTabLink = /** @class */ (function () {\n    function ClrTabLink(ifActiveService, id, ariaService, el, cfr, viewContainerRef, tabsId) {\n        this.ifActiveService = ifActiveService;\n        this.id = id;\n        this.ariaService = ariaService;\n        this.el = el;\n        this.cfr = cfr;\n        this.viewContainerRef = viewContainerRef;\n        this.tabsId = tabsId;\n        if (!this.tabLinkId) {\n            this.tabLinkId = 'clr-tab-link-' + nbTabLinkComponents++;\n        }\n        // Tab links can be rendered in one of two places: in the main area or inside the overflow dropdown menu.\n        // Here, we create a container so that its template can be used to create embeddedView on the fly.\n        // See TabsService's renderView() method and how it's used in Tabs class for an example.\n        /** @type {?} */\n        var factory = this.cfr.resolveComponentFactory(TemplateRefContainer);\n        this.templateRefContainer = this.viewContainerRef.createComponent(factory, 1, undefined, [\n            [this.el.nativeElement],\n        ]).instance;\n    }\n    Object.defineProperty(ClrTabLink.prototype, \"ariaControls\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ariaService.ariaControls;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTabLink.prototype, \"tabLinkId\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ariaService.ariaLabelledBy;\n        },\n        set: /**\n         * @param {?} id\n         * @return {?}\n         */\n        function (id) {\n            this.ariaService.ariaLabelledBy = id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrTabLink.prototype.activate = /**\n     * @return {?}\n     */\n    function () {\n        this.ifActiveService.current = this.id;\n    };\n    Object.defineProperty(ClrTabLink.prototype, \"active\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ifActiveService.current === this.id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrTabLink.decorators = [\n        { type: Directive, args: [{\n                    selector: '[clrTabLink]',\n                    host: {\n                        '[id]': 'tabLinkId',\n                        '[attr.aria-selected]': 'active',\n                        '[attr.aria-hidden]': 'false',\n                        '[attr.aria-controls]': 'ariaControls',\n                        '[class.btn]': 'true',\n                        '[class.btn-link]': '!inOverflow',\n                        '[class.nav-link]': '!inOverflow',\n                        '[class.nav-item]': '!inOverflow',\n                        '[class.active]': 'active',\n                        role: 'tab',\n                        type: 'button',\n                    },\n                },] }\n    ];\n    /** @nocollapse */\n    ClrTabLink.ctorParameters = function () { return [\n        { type: IfActiveService },\n        { type: Number, decorators: [{ type: Inject, args: [IF_ACTIVE_ID,] }] },\n        { type: AriaService },\n        { type: ElementRef },\n        { type: ComponentFactoryResolver },\n        { type: ViewContainerRef },\n        { type: Number, decorators: [{ type: Inject, args: [TABS_ID,] }] }\n    ]; };\n    ClrTabLink.propDecorators = {\n        inOverflow: [{ type: Input, args: ['clrTabLinkInOverflow',] }],\n        tabLinkId: [{ type: Input, args: ['id',] }],\n        activate: [{ type: HostListener, args: ['click',] }]\n    };\n    return ClrTabLink;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTab = /** @class */ (function () {\n    function ClrTab(ifActiveService, id, tabsService) {\n        this.ifActiveService = ifActiveService;\n        this.id = id;\n        this.tabsService = tabsService;\n        tabsService.register(this);\n    }\n    /**\n     * @return {?}\n     */\n    ClrTab.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this.tabsService.unregister(this);\n    };\n    Object.defineProperty(ClrTab.prototype, \"active\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.ifActiveService.current === this.id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrTab.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tab',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    providers: [IF_ACTIVE_ID_PROVIDER, AriaService]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTab.ctorParameters = function () { return [\n        { type: IfActiveService },\n        { type: Number, decorators: [{ type: Inject, args: [IF_ACTIVE_ID,] }] },\n        { type: TabsService }\n    ]; };\n    ClrTab.propDecorators = {\n        tabLink: [{ type: ContentChild, args: [ClrTabLink,] }],\n        tabContent: [{ type: ContentChild, args: [ClrTabContent,] }]\n    };\n    return ClrTab;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTabOverflowContent = /** @class */ (function (_super) {\n    __extends(ClrTabOverflowContent, _super);\n    function ClrTabOverflowContent(injector, parentHost) {\n        var _this = _super.call(this, injector, parentHost) || this;\n        _this.anchorPoint = Point.BOTTOM_RIGHT;\n        _this.popoverPoint = Point.RIGHT_TOP;\n        _this.closeOnOutsideClick = true;\n        return _this;\n    }\n    ClrTabOverflowContent.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tab-overflow-content',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    host: {\n                        '[class.dropdown-menu]': 'true',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTabOverflowContent.ctorParameters = function () { return [\n        { type: Injector },\n        { type: ElementRef, decorators: [{ type: SkipSelf }] }\n    ]; };\n    return ClrTabOverflowContent;\n}(AbstractPopover));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTabs = /** @class */ (function () {\n    function ClrTabs(ifActiveService, ifOpenService, tabsService, tabsId, commonStrings) {\n        this.ifActiveService = ifActiveService;\n        this.ifOpenService = ifOpenService;\n        this.tabsService = tabsService;\n        this.tabsId = tabsId;\n        this.commonStrings = commonStrings;\n    }\n    Object.defineProperty(ClrTabs.prototype, \"activeTabInOverflow\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.tabsService.overflowTabs.indexOf(this.tabsService.activeTab) > -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTabs.prototype, \"tabIds\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.tabsService.children.map(function (tab) { return tab.tabLink.tabLinkId; }).join(' ');\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrTabs.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        if (typeof this.ifActiveService.current === 'undefined') {\n            this.tabLinkDirectives.first.activate();\n        }\n    };\n    /**\n     * @param {?} event\n     * @return {?}\n     */\n    ClrTabs.prototype.toggleOverflow = /**\n     * @param {?} event\n     * @return {?}\n     */\n    function (event) {\n        this.ifOpenService.toggleWithEvent(event);\n    };\n    ClrTabs.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tabs',\n                    template: \"\\n        <ul class=\\\"nav\\\" role=\\\"tablist\\\" [attr.aria-owns]=\\\"tabIds\\\">\\n            <!--tab links-->\\n            <ng-container *ngFor=\\\"let link of tabLinkDirectives\\\">\\n                <ng-container *ngIf=\\\"link.tabsId === tabsId && !link.inOverflow\\\"\\n                              [ngTemplateOutlet]=\\\"link.templateRefContainer.template\\\">\\n                </ng-container>\\n            </ng-container>\\n            <ng-container *ngIf=\\\"tabsService.overflowTabs.length > 0\\\">\\n                <div class=\\\"tabs-overflow bottom-right\\\" [class.open]=\\\"ifOpenService.open\\\"\\n                     (click)=\\\"toggleOverflow($event)\\\">\\n                    <li role=\\\"presentation\\\" class=\\\"nav-item\\\">\\n                        <button class=\\\"btn btn-link nav-link dropdown-toggle\\\" type=\\\"button\\\" [class.active]=\\\"activeTabInOverflow\\\">\\n                            <clr-icon shape=\\\"ellipsis-horizontal\\\"\\n                              [class.is-info]=\\\"ifOpenService.open\\\"\\n                              [attr.title]=\\\"commonStrings.more\\\"></clr-icon>\\n                        </button>\\n                    </li>\\n                    <!--tab links in overflow menu-->\\n                    <clr-tab-overflow-content>\\n                        <ng-container *ngFor=\\\"let link of tabLinkDirectives\\\">\\n                            <ng-container *ngIf=\\\"link.tabsId === tabsId && link.inOverflow\\\"\\n                                          [ngTemplateOutlet]=\\\"link.templateRefContainer.template\\\">\\n                            </ng-container>\\n                        </ng-container>\\n                    </clr-tab-overflow-content>\\n                </div>\\n            </ng-container>\\n        </ul>\\n        <!--tab content-->\\n        <ng-content></ng-content>\\n    \",\n                    providers: [IfActiveService, IfOpenService, TabsService, TABS_ID_PROVIDER]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTabs.ctorParameters = function () { return [\n        { type: IfActiveService },\n        { type: IfOpenService },\n        { type: TabsService },\n        { type: Number, decorators: [{ type: Inject, args: [TABS_ID,] }] },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrTabs.propDecorators = {\n        tabLinkDirectives: [{ type: ContentChildren, args: [ClrTabLink, { descendants: true },] }]\n    };\n    return ClrTabs;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_TABS_DIRECTIVES = [\n    ClrTabContent,\n    ClrTab,\n    ClrTabs,\n    ClrTabOverflowContent,\n    ClrTabLink,\n    TabsWillyWonka,\n    ActiveOompaLoompa,\n];\nvar ClrTabsModule = /** @class */ (function () {\n    function ClrTabsModule() {\n    }\n    ClrTabsModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrCommonPopoverModule, ClrConditionalModule, ClrIconModule, ClrTemplateRefModule],\n                    declarations: [CLR_TABS_DIRECTIVES],\n                    exports: [CLR_TABS_DIRECTIVES, ClrConditionalModule],\n                },] }\n    ];\n    return ClrTabsModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar VerticalNavGroupRegistrationService = /** @class */ (function () {\n    function VerticalNavGroupRegistrationService() {\n        this.navGroupCount = 0;\n    }\n    /**\n     * @return {?}\n     */\n    VerticalNavGroupRegistrationService.prototype.registerNavGroup = /**\n     * @return {?}\n     */\n    function () {\n        this.navGroupCount++;\n    };\n    /**\n     * @return {?}\n     */\n    VerticalNavGroupRegistrationService.prototype.unregisterNavGroup = /**\n     * @return {?}\n     */\n    function () {\n        this.navGroupCount--;\n    };\n    VerticalNavGroupRegistrationService.decorators = [\n        { type: Injectable }\n    ];\n    return VerticalNavGroupRegistrationService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar VerticalNavIconService = /** @class */ (function () {\n    function VerticalNavIconService() {\n        this._icons = 0;\n    }\n    Object.defineProperty(VerticalNavIconService.prototype, \"hasIcons\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._icons > 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    VerticalNavIconService.prototype.registerIcon = /**\n     * @return {?}\n     */\n    function () {\n        this._icons++;\n    };\n    /**\n     * @return {?}\n     */\n    VerticalNavIconService.prototype.unregisterIcon = /**\n     * @return {?}\n     */\n    function () {\n        this._icons--;\n    };\n    VerticalNavIconService.decorators = [\n        { type: Injectable }\n    ];\n    return VerticalNavIconService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar VerticalNavService = /** @class */ (function () {\n    function VerticalNavService() {\n        this._animateOnCollapsed = new Subject();\n        this._collapsedChanged = new Subject();\n        this._collapsed = false;\n        this._collapsible = false;\n    }\n    Object.defineProperty(VerticalNavService.prototype, \"animateOnCollapsed\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._animateOnCollapsed.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(VerticalNavService.prototype, \"collapsedChanged\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._collapsedChanged.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(VerticalNavService.prototype, \"collapsed\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._collapsed;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            value = !!value;\n            if (this.collapsible && this._collapsed !== value) {\n                this.updateCollapseBehavior(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(VerticalNavService.prototype, \"collapsible\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._collapsible;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            value = !!value;\n            if (this._collapsible !== value) {\n                if (!value && this.collapsed) {\n                    this.updateCollapseBehavior(false);\n                }\n                this._collapsible = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    VerticalNavService.prototype.updateCollapseBehavior = /**\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        this._animateOnCollapsed.next(value);\n        this._collapsed = value;\n        this._collapsedChanged.next(value);\n    };\n    VerticalNavService.decorators = [\n        { type: Injectable }\n    ];\n    return VerticalNavService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrVerticalNav = /** @class */ (function () {\n    function ClrVerticalNav(_navService, _navIconService, _navGroupRegistrationService, commonStrings) {\n        var _this = this;\n        this._navService = _navService;\n        this._navIconService = _navIconService;\n        this._navGroupRegistrationService = _navGroupRegistrationService;\n        this.commonStrings = commonStrings;\n        this._collapsedChanged = new EventEmitter(true);\n        this._sub = this._navService.collapsedChanged.subscribe(function (value) {\n            _this._collapsedChanged.emit(value);\n        });\n    }\n    Object.defineProperty(ClrVerticalNav.prototype, \"collapsible\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._navService.collapsible;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._navService.collapsible = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrVerticalNav.prototype, \"collapsed\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._navService.collapsed;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._navService.collapsed = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrVerticalNav.prototype, \"hasNavGroups\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._navGroupRegistrationService.navGroupCount > 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrVerticalNav.prototype, \"hasIcons\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._navIconService.hasIcons;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrVerticalNav.prototype.toggleByButton = /**\n     * @return {?}\n     */\n    function () {\n        this.collapsed = !this.collapsed;\n    };\n    /**\n     * @return {?}\n     */\n    ClrVerticalNav.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._sub.unsubscribe();\n    };\n    ClrVerticalNav.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-vertical-nav',\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<button type=\\\"button\\\" class=\\\"nav-trigger\\\"\\n        [class.on-collapse]=\\\"collapsed\\\"\\n        (click)=\\\"toggleByButton()\\\"\\n        *ngIf=\\\"collapsible\\\">\\n    <clr-icon shape=\\\"angle-double\\\"\\n              class=\\\"nav-trigger-icon\\\"\\n              [attr.dir]=\\\"(this.collapsed) ? 'right' : 'left'\\\"\\n              [attr.title]=\\\"(this.collapsed) ? commonStrings.expand : commonStrings.collapse\\\"></clr-icon>\\n</button>\\n<!-- Click handler on .nav-content is bad but required :-( -->\\n<div class=\\\"nav-content\\\">\\n    <ng-content></ng-content>\\n    <button (click)=\\\"collapsed = false\\\" class=\\\"nav-btn\\\" *ngIf=\\\"collapsible && collapsed\\\"></button>\\n</div>\\n\",\n                    providers: [VerticalNavService, VerticalNavIconService, VerticalNavGroupRegistrationService],\n                    host: {\n                        class: 'clr-vertical-nav',\n                        '[class.is-collapsed]': 'collapsed',\n                        '[class.has-nav-groups]': 'hasNavGroups',\n                        '[class.has-icons]': 'hasIcons',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrVerticalNav.ctorParameters = function () { return [\n        { type: VerticalNavService },\n        { type: VerticalNavIconService },\n        { type: VerticalNavGroupRegistrationService },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrVerticalNav.propDecorators = {\n        collapsible: [{ type: Input, args: ['clrVerticalNavCollapsible',] }],\n        collapsed: [{ type: Input, args: ['clrVerticalNavCollapsed',] }],\n        _collapsedChanged: [{ type: Output, args: ['clrVerticalNavCollapsedChange',] }]\n    };\n    return ClrVerticalNav;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar VerticalNavGroupService = /** @class */ (function () {\n    function VerticalNavGroupService() {\n        this._expandChange = new Subject();\n    }\n    Object.defineProperty(VerticalNavGroupService.prototype, \"expandChange\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._expandChange.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    VerticalNavGroupService.prototype.expand = /**\n     * @return {?}\n     */\n    function () {\n        this._expandChange.next(true);\n    };\n    VerticalNavGroupService.decorators = [\n        { type: Injectable }\n    ];\n    return VerticalNavGroupService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar EXPANDED_STATE = 'expanded';\n/** @type {?} */\nvar COLLAPSED_STATE = 'collapsed';\nvar ClrVerticalNavGroup = /** @class */ (function () {\n    function ClrVerticalNavGroup(_itemExpand, _navGroupRegistrationService, _navGroupService, _navService, commonStrings) {\n        var _this = this;\n        this._itemExpand = _itemExpand;\n        this._navGroupRegistrationService = _navGroupRegistrationService;\n        this._navGroupService = _navGroupService;\n        this._navService = _navService;\n        this.commonStrings = commonStrings;\n        this.wasExpanded = false;\n        this.expandedChange = new EventEmitter(true);\n        this._subscriptions = [];\n        this._expandAnimationState = COLLAPSED_STATE;\n        this._navGroupRegistrationService.registerNavGroup();\n        // FIXME: This subscription handles a corner case\n        // Vertical Nav collapse requires the animation to run first and then\n        // remove the nodes from the DOM. If the user directly sets the input\n        // on the clrIfExpanded directive, we have no chance to run the animation\n        // and wait for it to complete. This subscription makes sure that the\n        // animation states are correct for that edge case.\n        this._subscriptions.push(this._itemExpand.expandChange.subscribe(function (value) {\n            if (value && _this.expandAnimationState === COLLAPSED_STATE) {\n                if (_this._navService.collapsed) {\n                    _this._navService.collapsed = false;\n                }\n                _this.expandAnimationState = EXPANDED_STATE;\n            }\n            else if (!value && _this.expandAnimationState === EXPANDED_STATE) {\n                _this.expandAnimationState = COLLAPSED_STATE;\n            }\n        }));\n        // 1. If the nav is collapsing, close the open nav group + save its state\n        // 2. If the nav is expanding, expand the nav group if the previous state was expanded\n        this._subscriptions.push(this._navService.animateOnCollapsed.subscribe(function (goingToCollapse) {\n            if (goingToCollapse && _this.expanded) {\n                _this.wasExpanded = true;\n                _this.expandAnimationState = COLLAPSED_STATE;\n            }\n            else if (!goingToCollapse && _this.wasExpanded) {\n                _this.expandGroup();\n                _this.wasExpanded = false;\n            }\n        }));\n        // If a link is clicked, expand the nav group\n        this._subscriptions.push(this._navGroupService.expandChange.subscribe(function (expand) {\n            if (expand && !_this.expanded) {\n                _this.expandGroup();\n            }\n        }));\n    }\n    Object.defineProperty(ClrVerticalNavGroup.prototype, \"expanded\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._itemExpand.expanded;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this._itemExpand.expanded !== value) {\n                this._itemExpand.expanded = value;\n                this.expandedChange.emit(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrVerticalNavGroup.prototype, \"userExpandedInput\", {\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            value = !!value;\n            if (this.expanded !== value) {\n                // We have to call toggleExpand because some cases require animations to occur first\n                // Directly setting the Expand service value skips the animation and can result in\n                // nodes in the DOM but the nav group still being collapsed\n                this.toggleExpand();\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrVerticalNavGroup.prototype.expandGroup = /**\n     * @return {?}\n     */\n    function () {\n        this.expanded = true;\n        // Expanded animation occurs after Expand.expand is set to true\n        this.expandAnimationState = EXPANDED_STATE;\n    };\n    /**\n     * @return {?}\n     */\n    ClrVerticalNavGroup.prototype.collapseGroup = /**\n     * @return {?}\n     */\n    function () {\n        // If a Vertical Nav Group toggle button is clicked while the Vertical Nav is in Collapsed state,\n        // the Vertical Nav should be expanded first.\n        this.expandAnimationState = COLLAPSED_STATE;\n    };\n    // closes a group after the collapse animation\n    // closes a group after the collapse animation\n    /**\n     * @param {?} $event\n     * @return {?}\n     */\n    ClrVerticalNavGroup.prototype.expandAnimationDone = \n    // closes a group after the collapse animation\n    /**\n     * @param {?} $event\n     * @return {?}\n     */\n    function ($event) {\n        if ($event.toState === COLLAPSED_STATE) {\n            this.expanded = false;\n        }\n    };\n    Object.defineProperty(ClrVerticalNavGroup.prototype, \"expandAnimationState\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._expandAnimationState;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value !== this._expandAnimationState) {\n                this._expandAnimationState = value;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrVerticalNavGroup.prototype.toggleExpand = /**\n     * @return {?}\n     */\n    function () {\n        if (this.expanded) {\n            this.collapseGroup();\n        }\n        else {\n            // If nav is collasped, first open the nav\n            if (this._navService.collapsed) {\n                this._navService.collapsed = false;\n            }\n            // then expand the nav group\n            this.expandGroup();\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrVerticalNavGroup.prototype.ngAfterContentInit = /**\n     * @return {?}\n     */\n    function () {\n        // This makes sure that if someone marks a nav group expanded in a collapsed nav\n        // the expanded property is switched back to collapsed state.\n        if (this._navService.collapsed && this.expanded) {\n            this.wasExpanded = true;\n            this.expandAnimationState = COLLAPSED_STATE;\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrVerticalNavGroup.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._subscriptions.forEach(function (sub) { return sub.unsubscribe(); });\n        this._navGroupRegistrationService.unregisterNavGroup();\n    };\n    ClrVerticalNavGroup.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-vertical-nav-group',\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<div class=\\\"nav-group-content\\\">\\n    <ng-content select=\\\"[clrVerticalNavLink]\\\"></ng-content>\\n    <button\\n        class=\\\"nav-group-trigger\\\"\\n        type=\\\"button\\\"\\n        (click)=\\\"toggleExpand()\\\">\\n        <ng-content select=\\\"[clrVerticalNavIcon]\\\"></ng-content>\\n        <div class=\\\"nav-group-text\\\">\\n            <ng-content></ng-content>\\n        </div>\\n        <clr-icon shape=\\\"caret\\\"\\n                  class=\\\"nav-group-trigger-icon\\\"\\n                  [attr.dir]=\\\"(this.expanded) ? 'down' : 'right'\\\"\\n                  [attr.title]=\\\"(this.expanded) ? commonStrings.collapse : commonStrings.expand\\\">\\n        </clr-icon>\\n    </button>\\n</div>\\n<!--TODO: This animation needs to be added to the clr-vertical-nav-group-children component-->\\n<div class=\\\"nav-group-children\\\"\\n     [@clrExpand]=\\\"expandAnimationState\\\"\\n     (@clrExpand.done)=\\\"expandAnimationDone($event)\\\">\\n    <ng-content select=\\\"[clrIfExpanded], clr-vertical-nav-group-children\\\"></ng-content>\\n</div>\\n\",\n                    providers: [Expand, VerticalNavGroupService],\n                    animations: [\n                        trigger('clrExpand', [\n                            state(EXPANDED_STATE, style({ height: '*' })),\n                            state(COLLAPSED_STATE, style({ height: 0, 'overflow-y': 'hidden', visibility: 'hidden' })),\n                            transition(EXPANDED_STATE + \" <=> \" + COLLAPSED_STATE, animate('0.2s ease-in-out')),\n                        ]),\n                    ],\n                    host: { class: 'nav-group' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrVerticalNavGroup.ctorParameters = function () { return [\n        { type: Expand },\n        { type: VerticalNavGroupRegistrationService },\n        { type: VerticalNavGroupService },\n        { type: VerticalNavService },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrVerticalNavGroup.propDecorators = {\n        expanded: [{ type: HostBinding, args: ['class.is-expanded',] }],\n        userExpandedInput: [{ type: Input, args: ['clrVerticalNavGroupExpanded',] }],\n        expandedChange: [{ type: Output, args: ['clrVerticalNavGroupExpandedChange',] }]\n    };\n    return ClrVerticalNavGroup;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrVerticalNavGroupChildren = /** @class */ (function () {\n    function ClrVerticalNavGroupChildren() {\n    }\n    ClrVerticalNavGroupChildren.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-vertical-nav-group-children',\n                    template: \"\\n        <ng-content></ng-content>\\n    \"\n                }] }\n    ];\n    return ClrVerticalNavGroupChildren;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrVerticalNavIcon = /** @class */ (function () {\n    function ClrVerticalNavIcon(_verticalNavIconService) {\n        this._verticalNavIconService = _verticalNavIconService;\n        this._verticalNavIconService.registerIcon();\n    }\n    /**\n     * @return {?}\n     */\n    ClrVerticalNavIcon.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._verticalNavIconService.unregisterIcon();\n    };\n    ClrVerticalNavIcon.decorators = [\n        { type: Directive, args: [{ selector: '[clrVerticalNavIcon]', host: { class: 'nav-icon' } },] }\n    ];\n    /** @nocollapse */\n    ClrVerticalNavIcon.ctorParameters = function () { return [\n        { type: VerticalNavIconService }\n    ]; };\n    return ClrVerticalNavIcon;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrVerticalNavLink = /** @class */ (function () {\n    function ClrVerticalNavLink(_navGroupService) {\n        this._navGroupService = _navGroupService;\n    }\n    /**\n     * @return {?}\n     */\n    ClrVerticalNavLink.prototype.expandParentNavGroup = /**\n     * @return {?}\n     */\n    function () {\n        if (this._navGroupService) {\n            this._navGroupService.expand();\n        }\n    };\n    ClrVerticalNavLink.decorators = [\n        { type: Component, args: [{\n                    selector: '[clrVerticalNavLink]',\n                    template: \"\\n        <ng-content select=\\\"[clrVerticalNavIcon]\\\"></ng-content>\\n        <span class=\\\"nav-text\\\">\\n            <ng-content></ng-content>    \\n        </span>\\n    \",\n                    host: { class: 'nav-link' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrVerticalNavLink.ctorParameters = function () { return [\n        { type: VerticalNavGroupService, decorators: [{ type: Optional }] }\n    ]; };\n    ClrVerticalNavLink.propDecorators = {\n        expandParentNavGroup: [{ type: HostListener, args: ['click',] }]\n    };\n    return ClrVerticalNavLink;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_VERTICAL_NAV_DIRECTIVES = [\n    ClrVerticalNav,\n    ClrVerticalNavLink,\n    ClrVerticalNavGroup,\n    ClrVerticalNavGroupChildren,\n    ClrVerticalNavIcon,\n];\nvar ClrVerticalNavModule = /** @class */ (function () {\n    function ClrVerticalNavModule() {\n    }\n    ClrVerticalNavModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule, ClrIfExpandModule],\n                    declarations: [CLR_VERTICAL_NAV_DIRECTIVES],\n                    exports: [CLR_VERTICAL_NAV_DIRECTIVES, ClrIfExpandModule, ClrIconModule],\n                },] }\n    ];\n    return ClrVerticalNavModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrLayoutModule = /** @class */ (function () {\n    function ClrLayoutModule() {\n    }\n    ClrLayoutModule.decorators = [\n        { type: NgModule, args: [{ exports: [ClrMainContainerModule, ClrNavigationModule, ClrTabsModule, ClrVerticalNavModule] },] }\n    ];\n    return ClrLayoutModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ScrollingService = /** @class */ (function () {\n    function ScrollingService(_document) {\n        this._document = _document;\n    }\n    /**\n     * @return {?}\n     */\n    ScrollingService.prototype.stopScrolling = /**\n     * @return {?}\n     */\n    function () {\n        this._document.body.classList.add('no-scrolling');\n    };\n    /**\n     * @return {?}\n     */\n    ScrollingService.prototype.resumeScrolling = /**\n     * @return {?}\n     */\n    function () {\n        if (this._document.body.classList.contains('no-scrolling')) {\n            this._document.body.classList.remove('no-scrolling');\n        }\n    };\n    ScrollingService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    ScrollingService.ctorParameters = function () { return [\n        { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }\n    ]; };\n    return ScrollingService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrModal = /** @class */ (function () {\n    function ClrModal(_scrollingService, commonStrings, modalId) {\n        this._scrollingService = _scrollingService;\n        this.commonStrings = commonStrings;\n        this.modalId = modalId;\n        this._open = false;\n        this._openChanged = new EventEmitter(false);\n        this.closable = true;\n        this.staticBackdrop = true;\n        this.skipAnimation = 'false';\n        // presently this is only used by wizards\n        this.bypassScrollService = false;\n        this.stopClose = false;\n        this.altClose = new EventEmitter(false);\n    }\n    Object.defineProperty(ClrModal.prototype, \"sizeClass\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (this.size) {\n                return 'modal-' + this.size;\n            }\n            else {\n                return '';\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    // Detect when _open is set to true and set no-scrolling to true\n    // Detect when _open is set to true and set no-scrolling to true\n    /**\n     * @param {?} changes\n     * @return {?}\n     */\n    ClrModal.prototype.ngOnChanges = \n    // Detect when _open is set to true and set no-scrolling to true\n    /**\n     * @param {?} changes\n     * @return {?}\n     */\n    function (changes) {\n        if (!this.bypassScrollService && changes && changes.hasOwnProperty('_open')) {\n            if (changes._open.currentValue) {\n                this._scrollingService.stopScrolling();\n            }\n            else {\n                this._scrollingService.resumeScrolling();\n            }\n        }\n    };\n    /**\n     * @return {?}\n     */\n    ClrModal.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        this._scrollingService.resumeScrolling();\n    };\n    /**\n     * @return {?}\n     */\n    ClrModal.prototype.open = /**\n     * @return {?}\n     */\n    function () {\n        if (this._open) {\n            return;\n        }\n        this._open = true;\n        this._openChanged.emit(true);\n    };\n    /**\n     * @return {?}\n     */\n    ClrModal.prototype.close = /**\n     * @return {?}\n     */\n    function () {\n        if (this.stopClose) {\n            this.altClose.emit(false);\n            return;\n        }\n        if (!this.closable || !this._open) {\n            return;\n        }\n        this._open = false;\n        // todo: remove this after animation bug is fixed https://github.com/angular/angular/issues/15798\n        // this was handled by the fadeDone event below, but that AnimationEvent is not firing in Angular 4.0.\n        this._openChanged.emit(false);\n        // SPECME\n        this.focusTrap.setPreviousFocus(); // Handles moving focus back to the element that had it before.\n    };\n    /**\n     * @param {?} e\n     * @return {?}\n     */\n    ClrModal.prototype.fadeDone = /**\n     * @param {?} e\n     * @return {?}\n     */\n    function (e) {\n        if (e.toState === 'void') {\n            this._openChanged.emit(false);\n        }\n    };\n    ClrModal.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-modal',\n                    viewProviders: [ScrollingService],\n                    template: \"\\n<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<div clrFocusTrap class=\\\"modal\\\" *ngIf=\\\"_open\\\">\\n    <!--fixme: revisit when ngClass works with exit animation-->\\n    <div [@fadeDown]=\\\"skipAnimation\\\" (@fadeDown.done)=\\\"fadeDone($event)\\\"\\n         class=\\\"modal-dialog\\\"\\n         [class.modal-sm]=\\\"size == 'sm'\\\"\\n         [class.modal-lg]=\\\"size == 'lg'\\\"\\n         [class.modal-xl]=\\\"size == 'xl'\\\"\\n         role=\\\"dialog\\\"\\n         [attr.aria-hidden]=\\\"!_open\\\"\\n         [attr.aria-labelledby]=\\\"modalId\\\">\\n\\n      <div class=\\\"modal-content-wrapper\\\">\\n        <!-- only used in wizards -->\\n        <ng-content select=\\\".modal-nav\\\"></ng-content>\\n\\n        <div class=\\\"modal-content\\\">\\n          <div class=\\\"modal-header\\\">\\n            <button type=\\\"button\\\" class=\\\"close\\\" *ngIf=\\\"closable\\\" (click)=\\\"close()\\\">\\n              <clr-icon shape=\\\"close\\\" [attr.title]=\\\"commonStrings.close\\\"></clr-icon>\\n            </button>\\n            <div class=\\\"modal-title-wrapper\\\" id=\\\"{{modalId}}\\\">\\n              <ng-content select=\\\".modal-title\\\"></ng-content>\\n            </div>\\n          </div>\\n          <ng-content select=\\\".modal-body\\\"></ng-content>\\n          <ng-content select=\\\".modal-footer\\\"></ng-content>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div [@fade] class=\\\"modal-backdrop\\\"\\n         aria-hidden=\\\"true\\\"\\n         (click)=\\\"staticBackdrop || close()\\\"></div>\\n</div>\\n\\n\",\n                    animations: [\n                        trigger('fadeDown', [\n                            transition('* => false', [style({ opacity: 0, transform: 'translate(0, -25%)' }), animate('0.2s ease-in-out')]),\n                            transition('false => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, -25%)' }))]),\n                        ]),\n                        trigger('fade', [\n                            transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),\n                            transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),\n                        ]),\n                    ],\n                    providers: [UNIQUE_ID_PROVIDER],\n                    styles: [\"\\n        :host { display: none; }\\n        :host.open { display: inline; }\\n    \"]\n                }] }\n    ];\n    /** @nocollapse */\n    ClrModal.ctorParameters = function () { return [\n        { type: ScrollingService },\n        { type: ClrCommonStrings },\n        { type: String, decorators: [{ type: Inject, args: [UNIQUE_ID,] }] }\n    ]; };\n    ClrModal.propDecorators = {\n        focusTrap: [{ type: ViewChild, args: [FocusTrapDirective,] }],\n        _open: [{ type: HostBinding, args: ['class.open',] }, { type: Input, args: ['clrModalOpen',] }],\n        _openChanged: [{ type: Output, args: ['clrModalOpenChange',] }],\n        closable: [{ type: Input, args: ['clrModalClosable',] }],\n        size: [{ type: Input, args: ['clrModalSize',] }],\n        staticBackdrop: [{ type: Input, args: ['clrModalStaticBackdrop',] }],\n        skipAnimation: [{ type: Input, args: ['clrModalSkipAnimation',] }],\n        bypassScrollService: [{ type: Input, args: ['clrModalOverrideScrollService',] }],\n        stopClose: [{ type: Input, args: ['clrModalPreventClose',] }],\n        altClose: [{ type: Output, args: ['clrModalAlternateClose',] }],\n        close: [{ type: HostListener, args: ['body:keyup.escape',] }]\n    };\n    return ClrModal;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_MODAL_DIRECTIVES = [ClrModal];\nvar ClrModalModule = /** @class */ (function () {\n    function ClrModalModule() {\n    }\n    ClrModalModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrIconModule, ClrFocusTrapModule],\n                    declarations: [CLR_MODAL_DIRECTIVES],\n                    exports: [CLR_MODAL_DIRECTIVES],\n                },] }\n    ];\n    return ClrModalModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar SIGNPOST_POSITIONS = {\n    'top-left': { anchorPoint: Point.TOP_CENTER, popoverPoint: Point.BOTTOM_RIGHT, offsetY: -10, offsetX: 0 },\n    'top-middle': { anchorPoint: Point.TOP_CENTER, popoverPoint: Point.BOTTOM_CENTER, offsetY: -10, offsetX: 0 },\n    'top-right': { anchorPoint: Point.TOP_CENTER, popoverPoint: Point.BOTTOM_LEFT, offsetY: -10, offsetX: 0 },\n    'right-top': { anchorPoint: Point.RIGHT_CENTER, popoverPoint: Point.LEFT_BOTTOM, offsetY: 2, offsetX: 14 },\n    'right-middle': { anchorPoint: Point.RIGHT_CENTER, popoverPoint: Point.LEFT_CENTER, offsetY: 6, offsetX: 14 },\n    'right-bottom': { anchorPoint: Point.RIGHT_CENTER, popoverPoint: Point.LEFT_TOP, offsetY: -1, offsetX: 14 },\n    'bottom-right': { anchorPoint: Point.BOTTOM_CENTER, popoverPoint: Point.TOP_LEFT, offsetY: 9, offsetX: -1 },\n    'bottom-middle': { anchorPoint: Point.BOTTOM_CENTER, popoverPoint: Point.TOP_CENTER, offsetY: 9, offsetX: 12 },\n    'bottom-left': { anchorPoint: Point.BOTTOM_CENTER, popoverPoint: Point.TOP_RIGHT, offsetY: 9, offsetX: 0 },\n    'left-bottom': { anchorPoint: Point.LEFT_CENTER, popoverPoint: Point.RIGHT_TOP, offsetY: 0, offsetX: -14 },\n    'left-middle': { anchorPoint: Point.LEFT_CENTER, popoverPoint: Point.RIGHT_CENTER, offsetY: 4, offsetX: -14 },\n    'left-top': { anchorPoint: Point.LEFT_CENTER, popoverPoint: Point.RIGHT_BOTTOM, offsetY: 0, offsetX: -14 },\n    default: { anchorPoint: Point.RIGHT_CENTER, popoverPoint: Point.LEFT_CENTER, offsetY: 6, offsetX: 14 },\n};\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n// aka where the arrow / pointer is at in relation to the anchor\n/** @type {?} */\nvar POSITIONS = [\n    'top-left',\n    'top-middle',\n    'top-right',\n    'right-top',\n    'right-middle',\n    'right-bottom',\n    'bottom-right',\n    'bottom-middle',\n    'bottom-left',\n    'left-bottom',\n    'left-middle',\n    'left-top',\n];\nvar ClrSignpostContent = /** @class */ (function (_super) {\n    __extends(ClrSignpostContent, _super);\n    function ClrSignpostContent(injector, parentHost, commonStrings) {\n        var _this = this;\n        if (!parentHost) {\n            throw new Error('clr-signpost-content should only be used inside of a clr-signpost');\n        }\n        _this = _super.call(this, injector, parentHost) || this;\n        _this.commonStrings = commonStrings;\n        // Defaults\n        _this.position = 'right-middle';\n        _this.closeOnOutsideClick = true;\n        return _this;\n    }\n    /**********\n     *\n     * @description\n     * Close function that uses the signpost instance to toggle the state of the content popover.\n     *\n     */\n    /**\n     * *******\n     *\n     * \\@description\n     * Close function that uses the signpost instance to toggle the state of the content popover.\n     *\n     * @return {?}\n     */\n    ClrSignpostContent.prototype.close = /**\n     * *******\n     *\n     * \\@description\n     * Close function that uses the signpost instance to toggle the state of the content popover.\n     *\n     * @return {?}\n     */\n    function () {\n        this.ifOpenService.open = false;\n    };\n    Object.defineProperty(ClrSignpostContent.prototype, \"position\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._position;\n        },\n        /*********\n         *\n         * @description\n         * A setter for the position of the ClrSignpostContent popover. This is a combination of the following:\n         * - anchorPoint - where on the trigger to anchor the ClrSignpostContent\n         * - popoverPoint - where on the ClrSignpostContent container to align with the anchorPoint\n         * - offsetY - where on the Y axis to align the ClrSignpostContent so it meets specs\n         * - offsetX - where on the X axis to align the ClrSignpostContent so it meets specs\n         * There are 12 possible positions to place a ClrSignpostContent container:\n         * - top-left\n         * - top-middle\n         * - top-right\n         * - right-top\n         * - right-middle\n         * - right-bottom\n         * - bottom-right\n         * - bottom-middle\n         * - bottom-left\n         * - left-bottom\n         * - left-middle\n         * - left-top\n         *\n         * I think of it as follows for 'top-left' -> CONTAINER_SIDE-SIDE_POSITION. In this case CONTAINER_SIDE is 'top'\n         * meaning the top of the trigger icon (above the icon that hides/shows) the ClrSignpostContent. And, SIDE_POSITION\n         * is 'left' meaning two things: 1) the ClrSignpostContent container extends to the left and 2) the 'arrow/pointer'\n         * linking the SingpostContent to the trigger points down at the horizontal center of the trigger icon.\n         *\n         * @param newPosition\n         */\n        set: /**\n         * ******\n         *\n         * \\@description\n         * A setter for the position of the ClrSignpostContent popover. This is a combination of the following:\n         * - anchorPoint - where on the trigger to anchor the ClrSignpostContent\n         * - popoverPoint - where on the ClrSignpostContent container to align with the anchorPoint\n         * - offsetY - where on the Y axis to align the ClrSignpostContent so it meets specs\n         * - offsetX - where on the X axis to align the ClrSignpostContent so it meets specs\n         * There are 12 possible positions to place a ClrSignpostContent container:\n         * - top-left\n         * - top-middle\n         * - top-right\n         * - right-top\n         * - right-middle\n         * - right-bottom\n         * - bottom-right\n         * - bottom-middle\n         * - bottom-left\n         * - left-bottom\n         * - left-middle\n         * - left-top\n         *\n         * I think of it as follows for 'top-left' -> CONTAINER_SIDE-SIDE_POSITION. In this case CONTAINER_SIDE is 'top'\n         * meaning the top of the trigger icon (above the icon that hides/shows) the ClrSignpostContent. And, SIDE_POSITION\n         * is 'left' meaning two things: 1) the ClrSignpostContent container extends to the left and 2) the 'arrow/pointer'\n         * linking the SingpostContent to the trigger points down at the horizontal center of the trigger icon.\n         *\n         * @param {?} position\n         * @return {?}\n         */\n        function (position) {\n            // Ugh\n            this.renderer.removeClass(this.el.nativeElement, this.position);\n            if (position && POSITIONS.indexOf(position) > -1) {\n                this._position = position;\n            }\n            else {\n                this._position = 'right-middle';\n            }\n            // Ugh\n            this.renderer.addClass(this.el.nativeElement, this.position);\n            /** @type {?} */\n            var setPosition = SIGNPOST_POSITIONS[this.position];\n            this.anchorPoint = setPosition.anchorPoint;\n            this.popoverPoint = setPosition.popoverPoint;\n            this.popoverOptions.offsetY = setPosition.offsetY;\n            this.popoverOptions.offsetX = setPosition.offsetX;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrSignpostContent.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-signpost-content',\n                    template: \"\\n        <div class=\\\"signpost-flex-wrap\\\">\\n            <div class=\\\"popover-pointer\\\"></div>\\n            <div class=\\\"signpost-content-header\\\">\\n                <button type=\\\"button\\\" class=\\\"signpost-action close\\\" (click)=\\\"close()\\\">\\n                    <clr-icon shape=\\\"close\\\" [attr.title]=\\\"commonStrings.close\\\"></clr-icon>\\n                </button>\\n            </div>\\n            <div class=\\\"signpost-content-body\\\">\\n                <ng-content></ng-content>\\n            </div>\\n        </div>\\n    \",\n                    host: { '[class.signpost-content]': 'true' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrSignpostContent.ctorParameters = function () { return [\n        { type: Injector },\n        { type: ElementRef, decorators: [{ type: Optional }, { type: Inject, args: [POPOVER_HOST_ANCHOR,] }] },\n        { type: ClrCommonStrings }\n    ]; };\n    ClrSignpostContent.propDecorators = {\n        position: [{ type: Input, args: ['clrPosition',] }]\n    };\n    return ClrSignpostContent;\n}(AbstractPopover));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_SIGNPOST_DIRECTIVES = [ClrSignpost, ClrSignpostContent, ClrSignpostTrigger];\nvar ClrSignpostModule = /** @class */ (function () {\n    function ClrSignpostModule() {\n    }\n    ClrSignpostModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrCommonPopoverModule, ClrIconModule],\n                    declarations: [CLR_SIGNPOST_DIRECTIVES],\n                    exports: [CLR_SIGNPOST_DIRECTIVES, ClrConditionalModule],\n                },] }\n    ];\n    return ClrSignpostModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTooltip = /** @class */ (function () {\n    function ClrTooltip() {\n    }\n    ClrTooltip.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tooltip',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    host: {\n                        '[class.tooltip]': 'true',\n                    },\n                    providers: [IfOpenService, { provide: POPOVER_HOST_ANCHOR, useExisting: ElementRef }]\n                }] }\n    ];\n    return ClrTooltip;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar POSITIONS$1 = ['bottom-left', 'bottom-right', 'top-left', 'top-right', 'right', 'left'];\n/** @type {?} */\nvar SIZES = ['xs', 'sm', 'md', 'lg'];\nvar ClrTooltipContent = /** @class */ (function (_super) {\n    __extends(ClrTooltipContent, _super);\n    function ClrTooltipContent(injector, parentHost) {\n        var _this = this;\n        if (!parentHost) {\n            throw new Error('clr-tooltip-content should only be used inside of a clr-tooltip');\n        }\n        _this = _super.call(this, injector, parentHost) || this;\n        // Defaults\n        _this.position = 'right';\n        _this.size = 'sm';\n        return _this;\n    }\n    Object.defineProperty(ClrTooltipContent.prototype, \"position\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._position;\n        },\n        set: /**\n         * @param {?} position\n         * @return {?}\n         */\n        function (position) {\n            // Ugh\n            this.renderer.removeClass(this.el.nativeElement, 'tooltip-' + this.position);\n            if (position && POSITIONS$1.indexOf(position) > -1) {\n                this._position = position;\n            }\n            else {\n                this._position = 'right';\n            }\n            // Ugh\n            this.renderer.addClass(this.el.nativeElement, 'tooltip-' + this.position);\n            // set the popover values based on direction\n            switch (position) {\n                case 'top-right':\n                    this.anchorPoint = Point.TOP_CENTER;\n                    this.popoverPoint = Point.LEFT_BOTTOM;\n                    break;\n                case 'top-left':\n                    this.anchorPoint = Point.TOP_CENTER;\n                    this.popoverPoint = Point.RIGHT_BOTTOM;\n                    break;\n                case 'bottom-right':\n                    this.anchorPoint = Point.BOTTOM_CENTER;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n                case 'bottom-left':\n                    this.anchorPoint = Point.BOTTOM_CENTER;\n                    this.popoverPoint = Point.RIGHT_TOP;\n                    break;\n                case 'right':\n                    this.anchorPoint = Point.RIGHT_CENTER;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n                case 'left':\n                    this.anchorPoint = Point.LEFT_CENTER;\n                    this.popoverPoint = Point.RIGHT_TOP;\n                    break;\n                default:\n                    this.anchorPoint = Point.RIGHT_CENTER;\n                    this.popoverPoint = Point.LEFT_TOP;\n                    break;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrTooltipContent.prototype, \"size\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._size;\n        },\n        set: /**\n         * @param {?} size\n         * @return {?}\n         */\n        function (size) {\n            // Ugh\n            this.renderer.removeClass(this.el.nativeElement, 'tooltip-' + this.size);\n            if (size && SIZES.indexOf(size) > -1) {\n                this._size = size;\n            }\n            else {\n                this._size = 'sm';\n            }\n            // Ugh\n            this.renderer.addClass(this.el.nativeElement, 'tooltip-' + this.size);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrTooltipContent.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-tooltip-content',\n                    template: \"\\n        <ng-content></ng-content>\\n    \",\n                    host: {\n                        '[class.tooltip-content]': 'true',\n                        // I'm giving up on animation, they did not work before and will not work now.\n                        // Too many conflicts with Clarity UI.\n                        '[style.opacity]': '1',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrTooltipContent.ctorParameters = function () { return [\n        { type: Injector },\n        { type: ElementRef, decorators: [{ type: Optional }, { type: Inject, args: [POPOVER_HOST_ANCHOR,] }] }\n    ]; };\n    ClrTooltipContent.propDecorators = {\n        position: [{ type: Input, args: ['clrPosition',] }],\n        size: [{ type: Input, args: ['clrSize',] }]\n    };\n    return ClrTooltipContent;\n}(AbstractPopover));\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrTooltipTrigger = /** @class */ (function () {\n    function ClrTooltipTrigger(ifOpenService) {\n        this.ifOpenService = ifOpenService;\n    }\n    /**\n     * @return {?}\n     */\n    ClrTooltipTrigger.prototype.showTooltip = /**\n     * @return {?}\n     */\n    function () {\n        this.ifOpenService.open = true;\n    };\n    /**\n     * @return {?}\n     */\n    ClrTooltipTrigger.prototype.hideTooltip = /**\n     * @return {?}\n     */\n    function () {\n        this.ifOpenService.open = false;\n    };\n    ClrTooltipTrigger.decorators = [\n        { type: Directive, args: [{ selector: '[clrTooltipTrigger]', host: { '[attr.tabindex]': '0', '[class.tooltip-trigger]': 'true' } },] }\n    ];\n    /** @nocollapse */\n    ClrTooltipTrigger.ctorParameters = function () { return [\n        { type: IfOpenService }\n    ]; };\n    ClrTooltipTrigger.propDecorators = {\n        showTooltip: [{ type: HostListener, args: ['mouseenter',] }, { type: HostListener, args: ['focus',] }],\n        hideTooltip: [{ type: HostListener, args: ['mouseleave',] }, { type: HostListener, args: ['blur',] }]\n    };\n    return ClrTooltipTrigger;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_TOOLTIP_DIRECTIVES = [ClrTooltip, ClrTooltipTrigger, ClrTooltipContent];\nvar ClrTooltipModule = /** @class */ (function () {\n    function ClrTooltipModule() {\n    }\n    ClrTooltipModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrCommonPopoverModule],\n                    declarations: [CLR_TOOLTIP_DIRECTIVES],\n                    exports: [CLR_TOOLTIP_DIRECTIVES, ClrConditionalModule, ClrIconModule],\n                },] }\n    ];\n    return ClrTooltipModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrPopoverModule = /** @class */ (function () {\n    function ClrPopoverModule() {\n    }\n    ClrPopoverModule.decorators = [\n        { type: NgModule, args: [{ exports: [ClrDropdownModule, ClrSignpostModule, ClrTooltipModule] },] }\n    ];\n    return ClrPopoverModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ButtonHubService = /** @class */ (function () {\n    function ButtonHubService() {\n        this.buttonsReady = false;\n        this._previousBtnClicked = new Subject();\n        this._nextBtnClicked = new Subject();\n        this._dangerBtnClicked = new Subject();\n        this._cancelBtnClicked = new Subject();\n        this._finishBtnClicked = new Subject();\n        this._customBtnClicked = new Subject();\n    }\n    Object.defineProperty(ButtonHubService.prototype, \"previousBtnClicked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._previousBtnClicked.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ButtonHubService.prototype, \"nextBtnClicked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._nextBtnClicked.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ButtonHubService.prototype, \"dangerBtnClicked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._dangerBtnClicked.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ButtonHubService.prototype, \"cancelBtnClicked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._cancelBtnClicked.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ButtonHubService.prototype, \"finishBtnClicked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._finishBtnClicked.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ButtonHubService.prototype, \"customBtnClicked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._customBtnClicked.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} buttonType\n     * @return {?}\n     */\n    ButtonHubService.prototype.buttonClicked = /**\n     * @param {?} buttonType\n     * @return {?}\n     */\n    function (buttonType) {\n        if ('previous' === buttonType) {\n            this._previousBtnClicked.next();\n        }\n        else if ('next' === buttonType) {\n            this._nextBtnClicked.next();\n        }\n        else if ('finish' === buttonType) {\n            this._finishBtnClicked.next();\n        }\n        else if ('danger' === buttonType) {\n            this._dangerBtnClicked.next();\n        }\n        else if ('cancel' === buttonType) {\n            this._cancelBtnClicked.next();\n        }\n        else {\n            this._customBtnClicked.next(buttonType);\n        }\n    };\n    ButtonHubService.decorators = [\n        { type: Injectable }\n    ];\n    return ButtonHubService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * PageCollectionService manages the collection of pages assigned to the wizard and offers\n * a number of functions useful across the wizards providers and subcomponents -- all related\n * to essentially lookups on the collection of pages.\n *\n * The easiest way to access PageCollectionService is via the wizard. The\n * following example would allow you to access your instance of the wizard from your host\n * component and thereby access the page collection via YourHostComponent.wizard.pageCollection.\n *\n * \\@example\n * <clr-wizard #wizard ...>\n *\n * \\@example\n * export class YourHostComponent {\n * \\@ViewChild(\"wizard\") wizard: Wizard;\n *   ...\n * }\n *\n * The heart of the page collection is the query list of pages, which it is assigned as a\n * reference to the Wizard.pages QueryList when the wizard is created.\n *\n */\nvar PageCollectionService = /** @class */ (function () {\n    function PageCollectionService() {\n        // used by the navService to navigate back to first possible step after\n        // pages are reset\n        /**\n         *\n         * \\@memberof PageCollectionService\n         */\n        this._pagesReset = new Subject();\n    }\n    Object.defineProperty(PageCollectionService.prototype, \"pagesAsArray\", {\n        /**\n         * Converts the PageCollectionService.pages QueryList to an array and returns it.\n         *\n         * Useful for many instances when you would prefer a QueryList to act like an array.\n         *\n         * @memberof PageCollectionService\n         */\n        get: /**\n         * Converts the PageCollectionService.pages QueryList to an array and returns it.\n         *\n         * Useful for many instances when you would prefer a QueryList to act like an array.\n         *\n         * \\@memberof PageCollectionService\n         * @return {?}\n         */\n        function () {\n            return this.pages ? this.pages.toArray() : [];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(PageCollectionService.prototype, \"pagesCount\", {\n        /**\n         * Returns the length of the pages query list.\n         *\n         * @memberof PageCollectionService\n         */\n        get: /**\n         * Returns the length of the pages query list.\n         *\n         * \\@memberof PageCollectionService\n         * @return {?}\n         */\n        function () {\n            return this.pages ? this.pages.length : 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(PageCollectionService.prototype, \"penultimatePage\", {\n        /**\n         * Returns the next-to-last page in the query list of pages. Operates as a getter\n         * so that it isn't working with stale data.\n         *\n         * @memberof PageCollectionService\n         */\n        get: /**\n         * Returns the next-to-last page in the query list of pages. Operates as a getter\n         * so that it isn't working with stale data.\n         *\n         * \\@memberof PageCollectionService\n         * @return {?}\n         */\n        function () {\n            /** @type {?} */\n            var pageCount = this.pagesCount;\n            if (pageCount < 2) {\n                return;\n            }\n            return this.pagesAsArray[pageCount - 2];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(PageCollectionService.prototype, \"lastPage\", {\n        /**\n         * Returns the last page in the query list of pages. Operates as a getter\n         * so that it isn't working with stale data.\n         *\n         * @memberof PageCollectionService\n         */\n        get: /**\n         * Returns the last page in the query list of pages. Operates as a getter\n         * so that it isn't working with stale data.\n         *\n         * \\@memberof PageCollectionService\n         * @return {?}\n         */\n        function () {\n            /** @type {?} */\n            var pageCount = this.pagesCount;\n            if (pageCount < 1) {\n                return;\n            }\n            return this.pagesAsArray[pageCount - 1];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(PageCollectionService.prototype, \"firstPage\", {\n        /**\n         * Returns the first page in the query list of pages. Operates as a getter\n         * so that it isn't working with stale data.\n         *\n         * @memberof PageCollectionService\n         */\n        get: /**\n         * Returns the first page in the query list of pages. Operates as a getter\n         * so that it isn't working with stale data.\n         *\n         * \\@memberof PageCollectionService\n         * @return {?}\n         */\n        function () {\n            if (!this.pagesCount) {\n                return;\n            }\n            return this.pagesAsArray[0];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Used mostly internally, but accepts a string ID and returns a ClrWizardPage\n     * object that matches the ID passed. Note that IDs here should include the prefix\n     * \"clr-wizard-page-\".\n     *\n     * Returns the next-to-last page in the query list of pages. Operates as a getter\n     * so that it isn't working with stale data.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Used mostly internally, but accepts a string ID and returns a ClrWizardPage\n     * object that matches the ID passed. Note that IDs here should include the prefix\n     * \"clr-wizard-page-\".\n     *\n     * Returns the next-to-last page in the query list of pages. Operates as a getter\n     * so that it isn't working with stale data.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} id\n     * @return {?}\n     */\n    PageCollectionService.prototype.getPageById = /**\n     * Used mostly internally, but accepts a string ID and returns a ClrWizardPage\n     * object that matches the ID passed. Note that IDs here should include the prefix\n     * \"clr-wizard-page-\".\n     *\n     * Returns the next-to-last page in the query list of pages. Operates as a getter\n     * so that it isn't working with stale data.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} id\n     * @return {?}\n     */\n    function (id) {\n        /** @type {?} */\n        var foundPages = this.pages.filter(function (page) { return id === page.id; });\n        return this.checkResults(foundPages, id);\n    };\n    /**\n     * Accepts s number as a parameter and treats that number as the index of the page\n     * you're looking for in the collection of pages. Returns a  wizard page object.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Accepts s number as a parameter and treats that number as the index of the page\n     * you're looking for in the collection of pages. Returns a  wizard page object.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} index\n     * @return {?}\n     */\n    PageCollectionService.prototype.getPageByIndex = /**\n     * Accepts s number as a parameter and treats that number as the index of the page\n     * you're looking for in the collection of pages. Returns a  wizard page object.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} index\n     * @return {?}\n     */\n    function (index) {\n        /** @type {?} */\n        var pageCount = this.pagesCount;\n        /** @type {?} */\n        var pagesLastIndex = pageCount > 1 ? pageCount - 1 : 0;\n        if (index < 0) {\n            throw new Error('Cannot retrieve page with index of ' + index);\n        }\n        if (index > pagesLastIndex) {\n            throw new Error('Page index is greater than length of pages array.');\n        }\n        return this.pagesAsArray[index];\n    };\n    /**\n     * Takes a wizard page object as a parameter and returns its index in the\n     * collection of pages.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Takes a wizard page object as a parameter and returns its index in the\n     * collection of pages.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    PageCollectionService.prototype.getPageIndex = /**\n     * Takes a wizard page object as a parameter and returns its index in the\n     * collection of pages.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    function (page) {\n        /** @type {?} */\n        var index = this.pagesAsArray.indexOf(page);\n        if (index < 0) {\n            throw new Error('Requested page cannot be found in collection of pages.');\n        }\n        return index;\n    };\n    /**\n     * Consolidates guard logic that prevents a couple of unfortunate edge cases with\n     * look ups on the collection of pages.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Consolidates guard logic that prevents a couple of unfortunate edge cases with\n     * look ups on the collection of pages.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} results\n     * @param {?} requestedPageId\n     * @return {?}\n     */\n    PageCollectionService.prototype.checkResults = /**\n     * Consolidates guard logic that prevents a couple of unfortunate edge cases with\n     * look ups on the collection of pages.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} results\n     * @param {?} requestedPageId\n     * @return {?}\n     */\n    function (results, requestedPageId) {\n        /** @type {?} */\n        var foundPagesCount = results.length || 0;\n        if (foundPagesCount > 1) {\n            throw new Error('More than one page has the requested id ' + requestedPageId + '.');\n        }\n        else if (foundPagesCount < 1) {\n            throw new Error('No page can be found with the id ' + requestedPageId + '.');\n        }\n        else {\n            return results[0];\n        }\n    };\n    /**\n     * Accepts two numeric indexes and returns an array of wizard page objects that include\n     * all wizard pages in the page collection from the first index to the second.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Accepts two numeric indexes and returns an array of wizard page objects that include\n     * all wizard pages in the page collection from the first index to the second.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} start\n     * @param {?} end\n     * @return {?}\n     */\n    PageCollectionService.prototype.pageRange = /**\n     * Accepts two numeric indexes and returns an array of wizard page objects that include\n     * all wizard pages in the page collection from the first index to the second.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} start\n     * @param {?} end\n     * @return {?}\n     */\n    function (start, end) {\n        /** @type {?} */\n        var pages = [];\n        if (start < 0 || end < 0) {\n            return [];\n        }\n        if (start === null || typeof start === undefined || isNaN(start)) {\n            return [];\n        }\n        if (end === null || typeof end === undefined || isNaN(end)) {\n            return [];\n        }\n        if (end > this.pagesCount) {\n            end = this.pagesCount;\n        }\n        pages = this.pagesAsArray;\n        if (end - start === 0) {\n            // just return the one page they want\n            return [this.getPageByIndex(start)];\n        }\n        // slice end does not include item referenced by end index, which is weird for users\n        // incrementing end index here to correct that so users and other methods\n        // don't have to think about it\n        end = end + 1;\n        // slice does not return the last one in the range but it does include the first one\n        // does not modify original array\n        return pages.slice(start, end);\n    };\n    /**\n     * Accepts two wizard page objects and returns those page objects with all other page\n     * objects between them in the page collection. It doesn't care which page is ahead of the\n     * other in the parameters. It will be smart enough to figure that out  on its own.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Accepts two wizard page objects and returns those page objects with all other page\n     * objects between them in the page collection. It doesn't care which page is ahead of the\n     * other in the parameters. It will be smart enough to figure that out  on its own.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @param {?} otherPage\n     * @return {?}\n     */\n    PageCollectionService.prototype.getPageRangeFromPages = /**\n     * Accepts two wizard page objects and returns those page objects with all other page\n     * objects between them in the page collection. It doesn't care which page is ahead of the\n     * other in the parameters. It will be smart enough to figure that out  on its own.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @param {?} otherPage\n     * @return {?}\n     */\n    function (page, otherPage) {\n        /** @type {?} */\n        var pageIndex = this.getPageIndex(page);\n        /** @type {?} */\n        var otherPageIndex = this.getPageIndex(otherPage);\n        /** @type {?} */\n        var startIndex;\n        /** @type {?} */\n        var endIndex;\n        if (pageIndex <= otherPageIndex) {\n            startIndex = pageIndex;\n            endIndex = otherPageIndex;\n        }\n        else {\n            startIndex = otherPageIndex;\n            endIndex = pageIndex;\n        }\n        return this.pageRange(startIndex, endIndex);\n    };\n    /**\n     * Takes a wizard page object as a parameter and returns the wizard page object of\n     * the page immediately before it in the page collection. Returns null if there is\n     * no page before the page it is passed.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Takes a wizard page object as a parameter and returns the wizard page object of\n     * the page immediately before it in the page collection. Returns null if there is\n     * no page before the page it is passed.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    PageCollectionService.prototype.getPreviousPage = /**\n     * Takes a wizard page object as a parameter and returns the wizard page object of\n     * the page immediately before it in the page collection. Returns null if there is\n     * no page before the page it is passed.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    function (page) {\n        /** @type {?} */\n        var myPageIndex = this.getPageIndex(page);\n        /** @type {?} */\n        var previousPageIndex = myPageIndex - 1;\n        if (previousPageIndex < 0) {\n            return null;\n        }\n        return this.getPageByIndex(previousPageIndex);\n    };\n    /**\n     * Accepts a wizard page object as a parameter and returns a Boolean that says if\n     * the page you sent it is complete.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Accepts a wizard page object as a parameter and returns a Boolean that says if\n     * the page you sent it is complete.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    PageCollectionService.prototype.previousPageIsCompleted = /**\n     * Accepts a wizard page object as a parameter and returns a Boolean that says if\n     * the page you sent it is complete.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    function (page) {\n        /** @type {?} */\n        var previousPage;\n        if (!page) {\n            return false;\n        }\n        previousPage = this.getPreviousPage(page);\n        if (null === previousPage) {\n            // page is the first page. no previous page.\n            return true;\n        }\n        return previousPage.completed;\n    };\n    /**\n     * Takes a wizard page object as a parameter and returns the wizard page object of\n     * the page immediately after it in the page collection. Returns null if there is\n     * no page after the page it is passed.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Takes a wizard page object as a parameter and returns the wizard page object of\n     * the page immediately after it in the page collection. Returns null if there is\n     * no page after the page it is passed.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    PageCollectionService.prototype.getNextPage = /**\n     * Takes a wizard page object as a parameter and returns the wizard page object of\n     * the page immediately after it in the page collection. Returns null if there is\n     * no page after the page it is passed.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    function (page) {\n        /** @type {?} */\n        var myPageIndex = this.getPageIndex(page);\n        /** @type {?} */\n        var nextPageIndex = myPageIndex + 1;\n        if (nextPageIndex >= this.pagesAsArray.length) {\n            return null;\n        }\n        return this.getPageByIndex(nextPageIndex);\n    };\n    /**\n     * Takes a wizard page object as a parameter and generates a step item id from the\n     * page ID. Returns the generated step item ID as a string.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Takes a wizard page object as a parameter and generates a step item id from the\n     * page ID. Returns the generated step item ID as a string.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    PageCollectionService.prototype.getStepItemIdForPage = /**\n     * Takes a wizard page object as a parameter and generates a step item id from the\n     * page ID. Returns the generated step item ID as a string.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    function (page) {\n        /** @type {?} */\n        var pageId = page.id;\n        /** @type {?} */\n        var pageIdParts = pageId.split('-').reverse();\n        pageIdParts[1] = 'step';\n        return pageIdParts.reverse().join('-');\n    };\n    /**\n     * Generally only used internally to mark that a specific page has been \"committed\".\n     * This involves marking the page complete and firing the ClrWizardPage.onCommit\n     * (clrWizardPageOnCommit) output. Takes the wizard page object that you intend to\n     * mark completed as a parameter.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Generally only used internally to mark that a specific page has been \"committed\".\n     * This involves marking the page complete and firing the ClrWizardPage.onCommit\n     * (clrWizardPageOnCommit) output. Takes the wizard page object that you intend to\n     * mark completed as a parameter.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    PageCollectionService.prototype.commitPage = /**\n     * Generally only used internally to mark that a specific page has been \"committed\".\n     * This involves marking the page complete and firing the ClrWizardPage.onCommit\n     * (clrWizardPageOnCommit) output. Takes the wizard page object that you intend to\n     * mark completed as a parameter.\n     *\n     * \\@memberof PageCollectionService\n     * @param {?} page\n     * @return {?}\n     */\n    function (page) {\n        /** @type {?} */\n        var pageHasOverrides = page.stopNext || page.preventDefault;\n        page.completed = true;\n        if (!pageHasOverrides) {\n            // prevent loop of event emission; alternate flows work off\n            // of event emitters this is how they break that cycle.\n            page.onCommit.emit(page.id);\n        }\n    };\n    Object.defineProperty(PageCollectionService.prototype, \"pagesReset\", {\n        /**\n         * An observable that the navigation service listens to in order to know when\n         * the page collection completed states have been reset to false so that way it\n         * can also reset the navigation to make the first page in the page collection\n         * current/active.\n         *\n         * @memberof PageCollectionService\n         */\n        get: /**\n         * An observable that the navigation service listens to in order to know when\n         * the page collection completed states have been reset to false so that way it\n         * can also reset the navigation to make the first page in the page collection\n         * current/active.\n         *\n         * \\@memberof PageCollectionService\n         * @return {?}\n         */\n        function () {\n            return this._pagesReset.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Sets all completed states of the pages in the page collection to false and\n     * notifies the navigation service to likewise reset the navigation.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Sets all completed states of the pages in the page collection to false and\n     * notifies the navigation service to likewise reset the navigation.\n     *\n     * \\@memberof PageCollectionService\n     * @return {?}\n     */\n    PageCollectionService.prototype.reset = /**\n     * Sets all completed states of the pages in the page collection to false and\n     * notifies the navigation service to likewise reset the navigation.\n     *\n     * \\@memberof PageCollectionService\n     * @return {?}\n     */\n    function () {\n        this.pagesAsArray.forEach(function (page) {\n            page.completed = false;\n        });\n        this._pagesReset.next(true);\n    };\n    /**\n     * Rolls through all the pages in the page collection to make sure there are no\n     * incomplete pages sandwiched between completed pages in the workflow. Identifies\n     * the first incomplete page index and sets all pages behind it to a completed\n     * state of false.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Rolls through all the pages in the page collection to make sure there are no\n     * incomplete pages sandwiched between completed pages in the workflow. Identifies\n     * the first incomplete page index and sets all pages behind it to a completed\n     * state of false.\n     *\n     * \\@memberof PageCollectionService\n     * @return {?}\n     */\n    PageCollectionService.prototype.updateCompletedStates = /**\n     * Rolls through all the pages in the page collection to make sure there are no\n     * incomplete pages sandwiched between completed pages in the workflow. Identifies\n     * the first incomplete page index and sets all pages behind it to a completed\n     * state of false.\n     *\n     * \\@memberof PageCollectionService\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var firstIncompleteIndex = this.findFirstIncompletePageIndex();\n        if (firstIncompleteIndex === this.pagesAsArray.length - 1) {\n            // all complete no need to do anything\n            return;\n        }\n        this.pagesAsArray.forEach(function (page, index) {\n            if (index > firstIncompleteIndex) {\n                page.completed = false;\n            }\n        });\n    };\n    /**\n     * Retrieves the index of the first incomplete page in the page collection.\n     *\n     * @memberof PageCollectionService\n     */\n    /**\n     * Retrieves the index of the first incomplete page in the page collection.\n     *\n     * \\@memberof PageCollectionService\n     * @return {?}\n     */\n    PageCollectionService.prototype.findFirstIncompletePageIndex = /**\n     * Retrieves the index of the first incomplete page in the page collection.\n     *\n     * \\@memberof PageCollectionService\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var returnIndex = null;\n        this.pagesAsArray.forEach(function (page, index) {\n            if (null === returnIndex && false === page.completed) {\n                returnIndex = index;\n            }\n        });\n        // fallthrough, all completed, return last page\n        if (null === returnIndex) {\n            returnIndex = this.pagesCount - 1;\n        }\n        return returnIndex;\n    };\n    /**\n     * @return {?}\n     */\n    PageCollectionService.prototype.findFirstIncompletePage = /**\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var myIncompleteIndex = this.findFirstIncompletePageIndex();\n        return this.pagesAsArray[myIncompleteIndex];\n    };\n    PageCollectionService.decorators = [\n        { type: Injectable }\n    ];\n    return PageCollectionService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * Performs navigation functions for a wizard and manages the current page. Presented as a\n * separate service to encapsulate the behavior of navigating and completing the wizard so\n * that it can be shared across the wizard and its sub-components.\n *\n * The easiest way to access the navigation service is there a reference on your wizard. The\n * Following example would allow you to access your instance of the wizard from your host\n * component and thereby access the navigation service via YourHostComponent.wizard.navService.\n *\n * \\@example\n * <clr-wizard #wizard ...>\n *\n * \\@example\n * export class YourHostComponent {\n * \\@ViewChild(\"wizard\") wizard: Wizard;\n *   ...\n * }\n *\n */\nvar WizardNavigationService = /** @class */ (function () {\n    /**\n     * Creates an instance of WizardNavigationService. Also sets up subscriptions\n     * that listen to the button service to determine when a button has been clicked\n     * in the wizard. Is also responsible for taking action when the page collection\n     * requests that navigation be reset to its pristine state.\n     *\n     * @memberof WizardNavigationService\n     */\n    function WizardNavigationService(pageCollection, buttonService) {\n        var _this = this;\n        this.pageCollection = pageCollection;\n        this.buttonService = buttonService;\n        /**\n         *\n         * \\@memberof WizardNavigationService\n         */\n        this._currentChanged = new Subject();\n        /**\n         * A Boolean flag used by the ClrWizardPage to avoid a race condition when pages are\n         * loading and there is no current page defined.\n         *\n         * \\@memberof WizardNavigationService\n         */\n        this.navServiceLoaded = false;\n        /**\n         * A boolean flag shared across the Wizard subcomponents that follows the value\n         * of the Wizard.forceForward (clrWizardForceForwardNavigation) input. When true,\n         * navigating backwards in the stepnav menu will reset any skipped pages' completed\n         * state to false.\n         *\n         * This is useful when a wizard executes validation on a page-by-page basis when\n         * the next button is clicked.\n         *\n         * \\@memberof WizardNavigationService\n         */\n        this.forceForwardNavigation = false;\n        /**\n         * \\@memberof WizardNavigationService\n         */\n        this._movedToNextPage = new Subject();\n        /**\n         * \\@memberof WizardNavigationService\n         */\n        this._wizardFinished = new Subject();\n        /**\n         * \\@memberof WizardNavigationService\n         */\n        this._movedToPreviousPage = new Subject();\n        /**\n         * \\@memberof WizardNavigationService\n         */\n        this._cancelWizard = new Subject();\n        /**\n         * A boolean flag shared across the Wizard subcomponents that follows the value\n         * of the Wizard.stopCancel (clrWizardPreventDefaultCancel) input. When true, the cancel\n         * routine is subverted and must be reinstated in the host component calling Wizard.close()\n         * at some point.\n         *\n         * \\@memberof WizardNavigationService\n         */\n        this.wizardHasAltCancel = false;\n        /**\n         * A boolean flag shared across the Wizard subcomponents that follows the value\n         * of the Wizard.stopNext (clrWizardPreventDefaultNext) input. When true, the next and finish\n         * routines are subverted and must be reinstated in the host component calling Wizard.next(),\n         * Wizard.forceNext(), Wizard.finish(), or Wizard.forceFinish().\n         *\n         * \\@memberof WizardNavigationService\n         */\n        this.wizardHasAltNext = false;\n        /**\n         * A boolean flag shared across the Wizard subcomponents that follows the value\n         * of the Wizard.stopNavigation (clrWizardPreventNavigation) input. When true, all\n         * navigational elements in the wizard are disabled.\n         *\n         * This is intended to freeze the wizard in place. Events are not fired so this is\n         * not a way to implement alternate functionality for navigation.\n         *\n         * \\@memberof WizardNavigationService\n         */\n        this.wizardStopNavigation = false;\n        /**\n         * A boolean flag shared with the stepnav items that prevents user clicks on\n         * stepnav items from navigating the wizard.\n         *\n         * \\@memberof WizardNavigationService\n         */\n        this.wizardDisableStepnav = false;\n        this.previousButtonSubscription = this.buttonService.previousBtnClicked.subscribe(function () {\n            /** @type {?} */\n            var currentPage = _this.currentPage;\n            if (_this.currentPageIsFirst || currentPage.previousStepDisabled) {\n                return;\n            }\n            currentPage.previousButtonClicked.emit(currentPage);\n            if (!currentPage.preventDefault) {\n                _this.previous();\n            }\n        });\n        this.nextButtonSubscription = this.buttonService.nextBtnClicked.subscribe(function () {\n            _this.checkAndCommitCurrentPage('next');\n        });\n        this.dangerButtonSubscription = this.buttonService.dangerBtnClicked.subscribe(function () {\n            _this.checkAndCommitCurrentPage('danger');\n        });\n        this.finishButtonSubscription = this.buttonService.finishBtnClicked.subscribe(function () {\n            _this.checkAndCommitCurrentPage('finish');\n        });\n        this.customButtonSubscription = this.buttonService.customBtnClicked.subscribe(function (type) {\n            if (!_this.wizardStopNavigation) {\n                _this.currentPage.customButtonClicked.emit(type);\n            }\n        });\n        this.cancelButtonSubscription = this.buttonService.cancelBtnClicked.subscribe(function () {\n            if (_this.wizardStopNavigation) {\n                return;\n            }\n            if (_this.currentPage.preventDefault) {\n                _this.currentPage.pageOnCancel.emit(_this.currentPage);\n            }\n            else {\n                _this.cancel();\n            }\n        });\n        this.pagesResetSubscription = this.pageCollection.pagesReset.subscribe(function () {\n            _this.setFirstPageCurrent();\n        });\n    }\n    /**\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.ngOnDestroy = /**\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        this.previousButtonSubscription.unsubscribe();\n        this.nextButtonSubscription.unsubscribe();\n        this.dangerButtonSubscription.unsubscribe();\n        this.finishButtonSubscription.unsubscribe();\n        this.customButtonSubscription.unsubscribe();\n        this.cancelButtonSubscription.unsubscribe();\n        this.pagesResetSubscription.unsubscribe();\n    };\n    Object.defineProperty(WizardNavigationService.prototype, \"currentPageChanged\", {\n        /**\n         * An Observable that is predominantly used amongst the subcomponents and services\n         * of the wizard. It is recommended that users listen to the ClrWizardPage.onLoad\n         * (clrWizardPageOnLoad) output instead of this Observable.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * An Observable that is predominantly used amongst the subcomponents and services\n         * of the wizard. It is recommended that users listen to the ClrWizardPage.onLoad\n         * (clrWizardPageOnLoad) output instead of this Observable.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            // TODO: MAKE SURE EXTERNAL OUTPUTS SAY 'CHANGE' NOT 'CHANGED'\n            // A BREAKING CHANGE SO AWAITING MINOR RELEASE\n            return this._currentChanged.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(WizardNavigationService.prototype, \"currentPageTitle\", {\n        /**\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            // when the querylist of pages is empty. this is the first place it fails...\n            if (!this.currentPage) {\n                return null;\n            }\n            return this.currentPage.title;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(WizardNavigationService.prototype, \"currentPageIsFirst\", {\n        /**\n         * Returns a Boolean that tells you whether or not the current page is the first\n         * page in the Wizard.\n         *\n         * This is helpful for determining whether a page is navigable.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * Returns a Boolean that tells you whether or not the current page is the first\n         * page in the Wizard.\n         *\n         * This is helpful for determining whether a page is navigable.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            return this.pageCollection.firstPage === this.currentPage;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(WizardNavigationService.prototype, \"currentPageIsLast\", {\n        /**\n         * Returns a Boolean that tells you whether or not the current page is the\n         * last page in the Wizard.\n         *\n         * This is used to determine which buttons should display in the wizard footer.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * Returns a Boolean that tells you whether or not the current page is the\n         * last page in the Wizard.\n         *\n         * This is used to determine which buttons should display in the wizard footer.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            return this.pageCollection.lastPage === this.currentPage;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(WizardNavigationService.prototype, \"currentPage\", {\n        /**\n         * Returns the ClrWizardPage object of the current page or null.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * Returns the ClrWizardPage object of the current page or null.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            if (!this._currentPage) {\n                return null;\n            }\n            return this._currentPage;\n        },\n        /**\n         * Accepts a ClrWizardPage object, since that object to be the current/active\n         * page in the wizard, and emits the ClrWizardPage.onLoad (clrWizardPageOnLoad)\n         * event for that page.\n         *\n         * Note that all of this work is bypassed if the ClrWizardPage object is already\n         * the current page.\n         *\n         * @memberof WizardNavigationService\n         */\n        set: /**\n         * Accepts a ClrWizardPage object, since that object to be the current/active\n         * page in the wizard, and emits the ClrWizardPage.onLoad (clrWizardPageOnLoad)\n         * event for that page.\n         *\n         * Note that all of this work is bypassed if the ClrWizardPage object is already\n         * the current page.\n         *\n         * \\@memberof WizardNavigationService\n         * @param {?} page\n         * @return {?}\n         */\n        function (page) {\n            if (this._currentPage !== page && !this.wizardStopNavigation) {\n                this._currentPage = page;\n                page.onLoad.emit(page.id);\n                this._currentChanged.next(page);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(WizardNavigationService.prototype, \"movedToNextPage\", {\n        /**\n         * An observable used internally to alert the wizard that forward navigation\n         * has occurred. It is recommended that you use the Wizard.onMoveNext\n         * (clrWizardOnNext) output instead of this one.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * An observable used internally to alert the wizard that forward navigation\n         * has occurred. It is recommended that you use the Wizard.onMoveNext\n         * (clrWizardOnNext) output instead of this one.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            return this._movedToNextPage.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(WizardNavigationService.prototype, \"wizardFinished\", {\n        /**\n         * An observable used internally to alert the wizard that the nav service\n         * has approved completion of the wizard.\n         *\n         * It is recommended that you use the Wizard.wizardFinished (clrWizardOnFinish)\n         * output instead of this one.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * An observable used internally to alert the wizard that the nav service\n         * has approved completion of the wizard.\n         *\n         * It is recommended that you use the Wizard.wizardFinished (clrWizardOnFinish)\n         * output instead of this one.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            return this._wizardFinished.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * This is a public function that can be used to programmatically advance\n     * the user to the next page.\n     *\n     * When invoked, this method will move the wizard to the next page after\n     * successful validation. Note that this method goes through all checks\n     * and event emissions as if Wizard.next(false) had been called.\n     *\n     * In most cases, it makes more sense to use Wizard.next(false).\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * This is a public function that can be used to programmatically advance\n     * the user to the next page.\n     *\n     * When invoked, this method will move the wizard to the next page after\n     * successful validation. Note that this method goes through all checks\n     * and event emissions as if Wizard.next(false) had been called.\n     *\n     * In most cases, it makes more sense to use Wizard.next(false).\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.next = /**\n     * This is a public function that can be used to programmatically advance\n     * the user to the next page.\n     *\n     * When invoked, this method will move the wizard to the next page after\n     * successful validation. Note that this method goes through all checks\n     * and event emissions as if Wizard.next(false) had been called.\n     *\n     * In most cases, it makes more sense to use Wizard.next(false).\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        if (this.currentPageIsLast) {\n            this.checkAndCommitCurrentPage('finish');\n            return;\n        }\n        this.checkAndCommitCurrentPage('next');\n        if (!this.wizardHasAltNext && !this.wizardStopNavigation) {\n            this._movedToNextPage.next(true);\n        }\n    };\n    /**\n     * Bypasses checks and most event emissions to force a page to navigate forward.\n     *\n     * Comparable to calling Wizard.next() or Wizard.forceNext().\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Bypasses checks and most event emissions to force a page to navigate forward.\n     *\n     * Comparable to calling Wizard.next() or Wizard.forceNext().\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.forceNext = /**\n     * Bypasses checks and most event emissions to force a page to navigate forward.\n     *\n     * Comparable to calling Wizard.next() or Wizard.forceNext().\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var currentPage = this.currentPage;\n        /** @type {?} */\n        var nextPage = this.pageCollection.getNextPage(currentPage);\n        // catch errant null or undefineds that creep in\n        if (!nextPage) {\n            throw new Error('The wizard has no next page to go to.');\n        }\n        if (this.wizardStopNavigation) {\n            return;\n        }\n        if (!currentPage.completed) {\n            // this is a state that alt next flows can get themselves in...\n            this.pageCollection.commitPage(currentPage);\n        }\n        this.currentPage = nextPage;\n    };\n    /**\n     * Accepts a button/action type as a parameter. Encapsulates all logic for\n     * event emissions, state of the current page, and wizard and page level overrides.\n     *\n     * Avoid calling this function directly unless you really know what you're doing.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Accepts a button/action type as a parameter. Encapsulates all logic for\n     * event emissions, state of the current page, and wizard and page level overrides.\n     *\n     * Avoid calling this function directly unless you really know what you're doing.\n     *\n     * \\@memberof WizardNavigationService\n     * @param {?} buttonType\n     * @return {?}\n     */\n    WizardNavigationService.prototype.checkAndCommitCurrentPage = /**\n     * Accepts a button/action type as a parameter. Encapsulates all logic for\n     * event emissions, state of the current page, and wizard and page level overrides.\n     *\n     * Avoid calling this function directly unless you really know what you're doing.\n     *\n     * \\@memberof WizardNavigationService\n     * @param {?} buttonType\n     * @return {?}\n     */\n    function (buttonType) {\n        /** @type {?} */\n        var currentPage = this.currentPage;\n        /** @type {?} */\n        var iAmTheLastPage;\n        /** @type {?} */\n        var isNext;\n        /** @type {?} */\n        var isDanger;\n        /** @type {?} */\n        var isDangerNext;\n        /** @type {?} */\n        var isDangerFinish;\n        /** @type {?} */\n        var isFinish;\n        if (!currentPage.readyToComplete || this.wizardStopNavigation) {\n            return;\n        }\n        iAmTheLastPage = this.currentPageIsLast;\n        isNext = buttonType === 'next';\n        isDanger = buttonType === 'danger';\n        isDangerNext = isDanger && !iAmTheLastPage;\n        isDangerFinish = isDanger && iAmTheLastPage;\n        isFinish = buttonType === 'finish' || isDangerFinish;\n        if (isFinish && !iAmTheLastPage) {\n            return;\n        }\n        currentPage.primaryButtonClicked.emit(buttonType);\n        if (isFinish) {\n            currentPage.finishButtonClicked.emit(currentPage);\n        }\n        else if (isDanger) {\n            currentPage.dangerButtonClicked.emit();\n        }\n        else if (isNext) {\n            currentPage.nextButtonClicked.emit();\n        }\n        if (currentPage.stopNext || currentPage.preventDefault) {\n            currentPage.onCommit.emit(currentPage.id);\n            return;\n        }\n        // order is very important with these emitters!\n        if (isFinish) {\n            // mark page as complete\n            if (!this.wizardHasAltNext) {\n                this.pageCollection.commitPage(currentPage);\n            }\n            this._wizardFinished.next();\n        }\n        if (this.wizardHasAltNext) {\n            this.pageCollection.commitPage(currentPage);\n            if (isNext || isDangerNext) {\n                this._movedToNextPage.next(true);\n            }\n            // jump out here, no matter what type we're looking at\n            return;\n        }\n        if (isNext || isDangerNext) {\n            this.forceNext();\n        }\n    };\n    /**\n     * This is a public function that can be used to programmatically conclude\n     * the wizard.\n     *\n     * When invoked, this method will  initiate the work involved with finalizing\n     * and finishing the wizard workflow. Note that this method goes through all\n     * checks and event emissions as if Wizard.finish(false) had been called.\n     *\n     * In most cases, it makes more sense to use Wizard.finish(false).\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * This is a public function that can be used to programmatically conclude\n     * the wizard.\n     *\n     * When invoked, this method will  initiate the work involved with finalizing\n     * and finishing the wizard workflow. Note that this method goes through all\n     * checks and event emissions as if Wizard.finish(false) had been called.\n     *\n     * In most cases, it makes more sense to use Wizard.finish(false).\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.finish = /**\n     * This is a public function that can be used to programmatically conclude\n     * the wizard.\n     *\n     * When invoked, this method will  initiate the work involved with finalizing\n     * and finishing the wizard workflow. Note that this method goes through all\n     * checks and event emissions as if Wizard.finish(false) had been called.\n     *\n     * In most cases, it makes more sense to use Wizard.finish(false).\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        this.checkAndCommitCurrentPage('finish');\n    };\n    Object.defineProperty(WizardNavigationService.prototype, \"movedToPreviousPage\", {\n        /**\n         * Notifies the wizard when backwards navigation has occurred via the\n         * previous button.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * Notifies the wizard when backwards navigation has occurred via the\n         * previous button.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            return this._movedToPreviousPage.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Programmatically moves the wizard to the page before the current page.\n     *\n     * In most instances, it makes more sense to call Wizard.previous()\n     * which does the same thing.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Programmatically moves the wizard to the page before the current page.\n     *\n     * In most instances, it makes more sense to call Wizard.previous()\n     * which does the same thing.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.previous = /**\n     * Programmatically moves the wizard to the page before the current page.\n     *\n     * In most instances, it makes more sense to call Wizard.previous()\n     * which does the same thing.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var previousPage;\n        if (this.currentPageIsFirst || this.wizardStopNavigation) {\n            return;\n        }\n        previousPage = this.pageCollection.getPreviousPage(this.currentPage);\n        if (!previousPage) {\n            return;\n        }\n        this._movedToPreviousPage.next(true);\n        if (this.forceForwardNavigation) {\n            this.currentPage.completed = false;\n        }\n        this.currentPage = previousPage;\n    };\n    Object.defineProperty(WizardNavigationService.prototype, \"notifyWizardCancel\", {\n        /**\n         * Notifies the wizard that a user is trying to cancel it.\n         *\n         * @memberof WizardNavigationService\n         */\n        get: /**\n         * Notifies the wizard that a user is trying to cancel it.\n         *\n         * \\@memberof WizardNavigationService\n         * @return {?}\n         */\n        function () {\n            return this._cancelWizard.asObservable();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Allows a hook into the cancel workflow of the wizard from the nav service. Note that\n     * this route goes through all checks and event emissions as if a cancel button had\n     * been clicked.\n     *\n     * In most cases, users looking for a hook into the cancel routine are actually looking\n     * for a way to close the wizard from their host component because they have prevented\n     * the default cancel action.\n     *\n     * In this instance, it is recommended that you use Wizard.close() to avoid any event\n     * emission loop resulting from an event handler calling back into routine that will\n     * again evoke the events it handles.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Allows a hook into the cancel workflow of the wizard from the nav service. Note that\n     * this route goes through all checks and event emissions as if a cancel button had\n     * been clicked.\n     *\n     * In most cases, users looking for a hook into the cancel routine are actually looking\n     * for a way to close the wizard from their host component because they have prevented\n     * the default cancel action.\n     *\n     * In this instance, it is recommended that you use Wizard.close() to avoid any event\n     * emission loop resulting from an event handler calling back into routine that will\n     * again evoke the events it handles.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.cancel = /**\n     * Allows a hook into the cancel workflow of the wizard from the nav service. Note that\n     * this route goes through all checks and event emissions as if a cancel button had\n     * been clicked.\n     *\n     * In most cases, users looking for a hook into the cancel routine are actually looking\n     * for a way to close the wizard from their host component because they have prevented\n     * the default cancel action.\n     *\n     * In this instance, it is recommended that you use Wizard.close() to avoid any event\n     * emission loop resulting from an event handler calling back into routine that will\n     * again evoke the events it handles.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        this._cancelWizard.next();\n    };\n    /**\n     * Performs all required checks to determine if a user can navigate to a page. Checking at each\n     * point if a page is navigable -- completed where the page immediately after the last completed\n     * page.\n     *\n     * Takes two parameters. The first one must be either the ClrWizardPage object or the ID of the\n     * ClrWizardPage object that you want to make the current page.\n     *\n     * The second parameter is optional and is a Boolean flag for \"lazy completion\". What this means\n     * is the Wizard will mark all pages between the current page and the page you want to navigate\n     * to as completed. This is useful for informational wizards that do not require user action,\n     * allowing an easy means for users to jump ahead.\n     *\n     * To avoid checks on navigation, use ClrWizardPage.makeCurrent() instead.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Performs all required checks to determine if a user can navigate to a page. Checking at each\n     * point if a page is navigable -- completed where the page immediately after the last completed\n     * page.\n     *\n     * Takes two parameters. The first one must be either the ClrWizardPage object or the ID of the\n     * ClrWizardPage object that you want to make the current page.\n     *\n     * The second parameter is optional and is a Boolean flag for \"lazy completion\". What this means\n     * is the Wizard will mark all pages between the current page and the page you want to navigate\n     * to as completed. This is useful for informational wizards that do not require user action,\n     * allowing an easy means for users to jump ahead.\n     *\n     * To avoid checks on navigation, use ClrWizardPage.makeCurrent() instead.\n     *\n     * \\@memberof WizardNavigationService\n     * @param {?} pageToGoToOrId\n     * @param {?=} lazyComplete\n     * @return {?}\n     */\n    WizardNavigationService.prototype.goTo = /**\n     * Performs all required checks to determine if a user can navigate to a page. Checking at each\n     * point if a page is navigable -- completed where the page immediately after the last completed\n     * page.\n     *\n     * Takes two parameters. The first one must be either the ClrWizardPage object or the ID of the\n     * ClrWizardPage object that you want to make the current page.\n     *\n     * The second parameter is optional and is a Boolean flag for \"lazy completion\". What this means\n     * is the Wizard will mark all pages between the current page and the page you want to navigate\n     * to as completed. This is useful for informational wizards that do not require user action,\n     * allowing an easy means for users to jump ahead.\n     *\n     * To avoid checks on navigation, use ClrWizardPage.makeCurrent() instead.\n     *\n     * \\@memberof WizardNavigationService\n     * @param {?} pageToGoToOrId\n     * @param {?=} lazyComplete\n     * @return {?}\n     */\n    function (pageToGoToOrId, lazyComplete) {\n        if (lazyComplete === void 0) { lazyComplete = false; }\n        /** @type {?} */\n        var pageToGoTo;\n        /** @type {?} */\n        var currentPage;\n        /** @type {?} */\n        var myPages;\n        /** @type {?} */\n        var pagesToCheck;\n        /** @type {?} */\n        var okayToMove = true;\n        /** @type {?} */\n        var goingForward;\n        /** @type {?} */\n        var currentPageIndex;\n        /** @type {?} */\n        var goToPageIndex;\n        myPages = this.pageCollection;\n        pageToGoTo = typeof pageToGoToOrId === 'string' ? myPages.getPageById(pageToGoToOrId) : pageToGoToOrId;\n        currentPage = this.currentPage;\n        // no point in going to the current page. you're there already!\n        // also hard block on any navigation when stopNavigation is true\n        if (pageToGoTo === currentPage || this.wizardStopNavigation) {\n            return;\n        }\n        currentPageIndex = myPages.getPageIndex(currentPage);\n        goToPageIndex = myPages.getPageIndex(pageToGoTo);\n        goingForward = goToPageIndex > currentPageIndex;\n        pagesToCheck = myPages.getPageRangeFromPages(this.currentPage, pageToGoTo);\n        okayToMove = lazyComplete || this.canGoTo(pagesToCheck);\n        if (!okayToMove) {\n            return;\n        }\n        if (goingForward && lazyComplete) {\n            pagesToCheck.forEach(function (page) {\n                if (page !== pageToGoTo) {\n                    page.completed = true;\n                }\n            });\n        }\n        else if (!goingForward && this.forceForwardNavigation) {\n            pagesToCheck.forEach(function (page) {\n                page.completed = false;\n            });\n        }\n        this.currentPage = pageToGoTo;\n    };\n    /**\n     * Accepts a range of ClrWizardPage objects as a parameter. Performs the work of checking\n     * those objects to determine if navigation can be accomplished.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Accepts a range of ClrWizardPage objects as a parameter. Performs the work of checking\n     * those objects to determine if navigation can be accomplished.\n     *\n     * \\@memberof WizardNavigationService\n     * @param {?} pagesToCheck\n     * @return {?}\n     */\n    WizardNavigationService.prototype.canGoTo = /**\n     * Accepts a range of ClrWizardPage objects as a parameter. Performs the work of checking\n     * those objects to determine if navigation can be accomplished.\n     *\n     * \\@memberof WizardNavigationService\n     * @param {?} pagesToCheck\n     * @return {?}\n     */\n    function (pagesToCheck) {\n        /** @type {?} */\n        var okayToMove = true;\n        /** @type {?} */\n        var myPages = this.pageCollection;\n        // previous page can be important when moving because if it's completed it\n        // allows us to move to the page even if it's incomplete...\n        /** @type {?} */\n        var previousPagePasses;\n        if (!pagesToCheck || pagesToCheck.length < 1) {\n            return false;\n        }\n        pagesToCheck.forEach(function (page) {\n            /** @type {?} */\n            var previousPage;\n            if (!okayToMove) {\n                return;\n            }\n            if (page.completed) {\n                // default is true. just jump out instead of complicating it.\n                return;\n            }\n            // so we know our page is not completed...\n            previousPage = myPages.getPageIndex(page) > 0 ? myPages.getPreviousPage(page) : null;\n            previousPagePasses = previousPage === null || previousPage.completed === true;\n            // we are false if not the current page AND previous page is not completed\n            // (but must have a previous page)\n            if (!page.current && !previousPagePasses) {\n                okayToMove = false;\n            }\n            // falls through to true as default\n        });\n        return okayToMove;\n    };\n    /**\n     * Looks through the collection of pages to find the first one that is incomplete\n     * and makes that page the current/active page.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Looks through the collection of pages to find the first one that is incomplete\n     * and makes that page the current/active page.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.setLastEnabledPageCurrent = /**\n     * Looks through the collection of pages to find the first one that is incomplete\n     * and makes that page the current/active page.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var allPages = this.pageCollection.pagesAsArray;\n        /** @type {?} */\n        var lastCompletedPageIndex = null;\n        allPages.forEach(function (page, index) {\n            if (page.completed) {\n                lastCompletedPageIndex = index;\n            }\n        });\n        if (lastCompletedPageIndex === null) {\n            // always is at least the first item...\n            lastCompletedPageIndex = 0;\n        }\n        else if (lastCompletedPageIndex + 1 < allPages.length) {\n            lastCompletedPageIndex = lastCompletedPageIndex + 1;\n        }\n        this.currentPage = allPages[lastCompletedPageIndex];\n    };\n    /**\n     * Finds the first page in the collection of pages and makes that page the\n     * current/active page.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Finds the first page in the collection of pages and makes that page the\n     * current/active page.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.setFirstPageCurrent = /**\n     * Finds the first page in the collection of pages and makes that page the\n     * current/active page.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        this.currentPage = this.pageCollection.pagesAsArray[0];\n    };\n    /**\n     * Updates the stepnav on the left side of the wizard when pages are dynamically\n     * added or removed from the collection of pages.\n     *\n     * @memberof WizardNavigationService\n     */\n    /**\n     * Updates the stepnav on the left side of the wizard when pages are dynamically\n     * added or removed from the collection of pages.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    WizardNavigationService.prototype.updateNavigation = /**\n     * Updates the stepnav on the left side of the wizard when pages are dynamically\n     * added or removed from the collection of pages.\n     *\n     * \\@memberof WizardNavigationService\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var toSetCurrent;\n        /** @type {?} */\n        var currentPageRemoved;\n        this.pageCollection.updateCompletedStates();\n        currentPageRemoved = this.pageCollection.pagesAsArray.indexOf(this.currentPage) < 0;\n        if (currentPageRemoved) {\n            toSetCurrent = this.pageCollection.findFirstIncompletePage();\n            this.currentPage = toSetCurrent;\n        }\n    };\n    WizardNavigationService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    WizardNavigationService.ctorParameters = function () { return [\n        { type: PageCollectionService },\n        { type: ButtonHubService }\n    ]; };\n    return WizardNavigationService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar HeaderActionService = /** @class */ (function () {\n    // this service communicates information about the presence/display of header actions\n    // across the wizard\n    function HeaderActionService(navService) {\n        this.navService = navService;\n    }\n    Object.defineProperty(HeaderActionService.prototype, \"wizardHasHeaderActions\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            /** @type {?} */\n            var wizardHdrActions = this.wizardHeaderActions;\n            if (!wizardHdrActions) {\n                return false;\n            }\n            return wizardHdrActions.toArray().length > 0;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(HeaderActionService.prototype, \"currentPageHasHeaderActions\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.navService.currentPage ? this.navService.currentPage.hasHeaderActions : false;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(HeaderActionService.prototype, \"showWizardHeaderActions\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return !this.currentPageHasHeaderActions && this.wizardHasHeaderActions;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(HeaderActionService.prototype, \"displayHeaderActionsWrapper\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.currentPageHasHeaderActions || this.wizardHasHeaderActions;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    HeaderActionService.decorators = [\n        { type: Injectable }\n    ];\n    /** @nocollapse */\n    HeaderActionService.ctorParameters = function () { return [\n        { type: WizardNavigationService }\n    ]; };\n    return HeaderActionService;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar wizardHeaderActionIndex = 0;\nvar ClrWizardHeaderAction = /** @class */ (function () {\n    function ClrWizardHeaderAction() {\n        // title is explanatory text added to the header action\n        this.title = '';\n        // If our host has an ID attribute, we use this instead of our index.\n        this._id = (wizardHeaderActionIndex++).toString();\n        this.disabled = false;\n        this.headerActionClicked = new EventEmitter(false);\n    }\n    Object.defineProperty(ClrWizardHeaderAction.prototype, \"id\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return \"clr-wizard-header-action-\" + this._id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrWizardHeaderAction.prototype.click = /**\n     * @return {?}\n     */\n    function () {\n        if (this.disabled) {\n            return;\n        }\n        // passing the header action id allows users to have one method that\n        // routes to many different actions based on the type of header action\n        // clicked. this is further aided by users being able to specify ids\n        // for their header actions.\n        this.headerActionClicked.emit(this._id);\n    };\n    ClrWizardHeaderAction.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-wizard-header-action',\n                    template: \"\\n        <button \\n            type=\\\"button\\\"\\n            class=\\\"btn clr-wizard-header-action btn-link\\\"\\n            [id]=\\\"id\\\"\\n            [class.disabled]=\\\"disabled\\\"\\n            (click)=\\\"click()\\\"\\n            [title]=\\\"title\\\">\\n            <ng-content></ng-content>\\n        </button>\\n    \",\n                    host: { class: 'clr-wizard-header-action-wrapper' }\n                }] }\n    ];\n    ClrWizardHeaderAction.propDecorators = {\n        title: [{ type: Input, args: ['title',] }],\n        _id: [{ type: Input, args: ['id',] }],\n        disabled: [{ type: Input, args: ['clrWizardHeaderActionDisabled',] }],\n        headerActionClicked: [{ type: Output, args: ['actionClicked',] }]\n    };\n    return ClrWizardHeaderAction;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrWizardPageButtons = /** @class */ (function () {\n    function ClrWizardPageButtons(pageButtonsTemplateRef) {\n        this.pageButtonsTemplateRef = pageButtonsTemplateRef;\n    }\n    ClrWizardPageButtons.decorators = [\n        { type: Directive, args: [{ selector: '[clrPageButtons]' },] }\n    ];\n    /** @nocollapse */\n    ClrWizardPageButtons.ctorParameters = function () { return [\n        { type: TemplateRef }\n    ]; };\n    return ClrWizardPageButtons;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrWizardPageHeaderActions = /** @class */ (function () {\n    function ClrWizardPageHeaderActions(pageHeaderActionsTemplateRef) {\n        this.pageHeaderActionsTemplateRef = pageHeaderActionsTemplateRef;\n    }\n    ClrWizardPageHeaderActions.decorators = [\n        { type: Directive, args: [{ selector: '[clrPageHeaderActions]' },] }\n    ];\n    /** @nocollapse */\n    ClrWizardPageHeaderActions.ctorParameters = function () { return [\n        { type: TemplateRef }\n    ]; };\n    return ClrWizardPageHeaderActions;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrWizardPageNavTitle = /** @class */ (function () {\n    function ClrWizardPageNavTitle(pageNavTitleTemplateRef) {\n        this.pageNavTitleTemplateRef = pageNavTitleTemplateRef;\n    }\n    ClrWizardPageNavTitle.decorators = [\n        { type: Directive, args: [{ selector: '[clrPageNavTitle]' },] }\n    ];\n    /** @nocollapse */\n    ClrWizardPageNavTitle.ctorParameters = function () { return [\n        { type: TemplateRef }\n    ]; };\n    return ClrWizardPageNavTitle;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrWizardPageTitle = /** @class */ (function () {\n    function ClrWizardPageTitle(pageTitleTemplateRef) {\n        this.pageTitleTemplateRef = pageTitleTemplateRef;\n    }\n    ClrWizardPageTitle.decorators = [\n        { type: Directive, args: [{ selector: '[clrPageTitle]' },] }\n    ];\n    /** @nocollapse */\n    ClrWizardPageTitle.ctorParameters = function () { return [\n        { type: TemplateRef }\n    ]; };\n    return ClrWizardPageTitle;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar wizardPageIndex = 0;\n/**\n * The ClrWizardPage component is responsible for displaying the content of each step\n * in the wizard workflow.\n *\n * ClrWizardPage component has hooks into the navigation service (ClrWizardPage.navService),\n * page collection (ClrWizardPage.pageCollection), and button service\n * (ClrWizardPage.buttonService). These three providers are shared across the components\n * within each instance of a Wizard.\n *\n */\nvar ClrWizardPage = /** @class */ (function () {\n    /**\n     * Creates an instance of ClrWizardPage.\n     *\n     * @memberof WizardPage\n     */\n    function ClrWizardPage(navService, pageCollection, buttonService) {\n        this.navService = navService;\n        this.pageCollection = pageCollection;\n        this.buttonService = buttonService;\n        /**\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this._nextStepDisabled = false;\n        /**\n         * Emits when the value of ClrWizardPage.nextStepDisabled changes.\n         * Should emit the new value of nextStepDisabled.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.nextStepDisabledChange = new EventEmitter();\n        /**\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this._previousStepDisabled = false;\n        /**\n         * Emits when the value of ClrWizardPage.previousStepDisabled changes.\n         * Should emit the new value of previousStepDisabled.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.previousStepDisabledChange = new EventEmitter();\n        /**\n         * Overrides all actions from the page level, so you can use an alternate function for\n         * validation or data-munging with a ClrWizardPage.onCommit (clrWizardPageOnCommit output),\n         * ClrWizardPage.onCancel (clrWizardPageOnCancel output), or one\n         * of the granular page-level button click event emitters.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.preventDefault = false;\n        /**\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this._stopCancel = false;\n        /**\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.stopCancelChange = new EventEmitter();\n        /**\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this._stopNext = false;\n        /**\n         * An event emitter carried over from a legacy version of ClrWizardPage.\n         * Fires an event on ClrWizardPage whenever the next or finish buttons\n         * are clicked and the page is the current page of the Wizard.\n         *\n         * Note that this does not automatically emit an event when a custom\n         * button is used in place of a next or finish button.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.onCommit = new EventEmitter(false);\n        /**\n         * Emits an event when ClrWizardPage becomes the current page of the\n         * Wizard.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.onLoad = new EventEmitter();\n        /**\n         * Emits an event when the ClrWizardPage invokes the cancel routine for the wizard.\n         *\n         * Can be used in conjunction with the ClrWizardPage.stopCancel\n         * (clrWizardPagePreventDefaultCancel) or ClrWizardPage.preventDefault\n         * (clrWizardPagePagePreventDefault) inputs to implement custom cancel\n         * functionality at the page level. This is useful if you would like to do\n         * validation, save data, or warn users before cancelling the wizard.\n         *\n         * Note that this requires you to call Wizard.close() from the host component.\n         * This constitues a full replacement of the cancel functionality.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.pageOnCancel = new EventEmitter();\n        /**\n         * Emits an event when the finish button is clicked and the ClrWizardPage is\n         * the wizard's current page.\n         *\n         * Can be used in conjunction with the ClrWizardPage.preventDefault\n         * (clrWizardPagePagePreventDefault) input to implement custom finish\n         * functionality at the page level. This is useful if you would like to do\n         * validation, save data, or warn users before allowing them to complete\n         * the wizard.\n         *\n         * Note that this requires you to call Wizard.finish() or Wizard.forceFinish()\n         * from the host component. This combination creates a full replacement of\n         * the finish functionality.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.finishButtonClicked = new EventEmitter();\n        /**\n         * Emits an event when the previous button is clicked and the ClrWizardPage is\n         * the wizard's current page.\n         *\n         * Can be used in conjunction with the ClrWizardPage.preventDefault\n         * (clrWizardPagePagePreventDefault) input to implement custom backwards\n         * navigation at the page level. This is useful if you would like to do\n         * validation, save data, or warn users before allowing them to go\n         * backwards in the wizard.\n         *\n         * Note that this requires you to call Wizard.previous()\n         * from the host component. This combination creates a full replacement of\n         * the backwards navigation functionality.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.previousButtonClicked = new EventEmitter();\n        /**\n         * Emits an event when the next button is clicked and the ClrWizardPage is\n         * the wizard's current page.\n         *\n         * Can be used in conjunction with the ClrWizardPage.preventDefault\n         * (clrWizardPagePagePreventDefault) input to implement custom forwards\n         * navigation at the page level. This is useful if you would like to do\n         * validation, save data, or warn users before allowing them to go\n         * to the next page in the wizard.\n         *\n         * Note that this requires you to call Wizard.forceNext() or Wizard.next()\n         * from the host component. This combination creates a full replacement of\n         * the forward navigation functionality.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.nextButtonClicked = new EventEmitter();\n        /**\n         * Emits an event when a danger button is clicked and the ClrWizardPage is\n         * the wizard's current page. By default, a danger button will act as\n         * either a \"next\" or \"finish\" button depending on if the ClrWizardPage is the\n         * last page or not.\n         *\n         * Can be used in conjunction with the ClrWizardPage.preventDefault\n         * (clrWizardPagePagePreventDefault) input to implement custom forwards\n         * or finish navigation at the page level when the danger button is clicked.\n         * This is useful if you would like to do validation, save data, or warn\n         * users before allowing them to go to the next page in the wizard or\n         * finish the wizard.\n         *\n         * Note that this requires you to call Wizard.finish(), Wizard.forceFinish(),\n         * Wizard.forceNext() or Wizard.next() from the host component. This\n         * combination creates a full replacement of the forward navigation and\n         * finish functionality.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.dangerButtonClicked = new EventEmitter();\n        /**\n         * Emits an event when a next, finish, or danger button is clicked and the\n         * ClrWizardPage is the wizard's current page.\n         *\n         * Can be used in conjunction with the ClrWizardPage.preventDefault\n         * (clrWizardPagePagePreventDefault) input to implement custom forwards\n         * or finish navigation at the page level, regardless of the type of\n         * primary button.\n         *\n         * This is useful if you would like to do validation, save data, or warn\n         * users before allowing them to go to the next page in the wizard or\n         * finish the wizard.\n         *\n         * Note that this requires you to call Wizard.finish(), Wizard.forceFinish(),\n         * Wizard.forceNext() or Wizard.next() from the host component. This\n         * combination creates a full replacement of the forward navigation and\n         * finish functionality.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this.primaryButtonClicked = new EventEmitter();\n        this.customButtonClicked = new EventEmitter();\n        /**\n         * An input value that is used internally to generate the ClrWizardPage ID as\n         * well as the step nav item ID.\n         *\n         * Typed as any because it should be able to accept numbers as well as\n         * strings. Passing an index for wizard whose pages are created with an\n         * ngFor loop is a common use case.\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this._id = (wizardPageIndex++).toString();\n        /**\n         *\n         * \\@memberof WizardPage\n         *\n         */\n        this._complete = false;\n    }\n    Object.defineProperty(ClrWizardPage.prototype, \"nextStepDisabled\", {\n        /**\n         * A getter that tells whether or not the wizard should be allowed\n         * to move to the next page.\n         *\n         * Useful for in-page validation because it prevents forward navigation\n         * and visibly disables the next button.\n         *\n         * Does not require that you re-implement navigation routines like you\n         * would if you were using ClrWizardPage.preventDefault or\n         * Wizard.preventDefault.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A getter that tells whether or not the wizard should be allowed\n         * to move to the next page.\n         *\n         * Useful for in-page validation because it prevents forward navigation\n         * and visibly disables the next button.\n         *\n         * Does not require that you re-implement navigation routines like you\n         * would if you were using ClrWizardPage.preventDefault or\n         * Wizard.preventDefault.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this._nextStepDisabled;\n        },\n        /**\n         * Sets whether the page should allow forward navigation.\n         *\n         * @memberof WizardPage\n         *\n         */\n        set: /**\n         * Sets whether the page should allow forward navigation.\n         *\n         * \\@memberof WizardPage\n         *\n         * @param {?} val\n         * @return {?}\n         */\n        function (val) {\n            /** @type {?} */\n            var valBool = !!val;\n            if (valBool !== this._nextStepDisabled) {\n                this._nextStepDisabled = valBool;\n                this.nextStepDisabledChange.emit(valBool);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"previousStepDisabled\", {\n        /**\n         * A getter that tells whether or not the wizard should be allowed\n         * to move to the previous page.\n         *\n         * Useful for in-page validation because it prevents backward navigation\n         * and visibly disables the previous button.\n         *\n         * Does not require that you re-implement navigation routines like you\n         * would if you were using ClrWizardPage.preventDefault or\n         * Wizard.preventDefault.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A getter that tells whether or not the wizard should be allowed\n         * to move to the previous page.\n         *\n         * Useful for in-page validation because it prevents backward navigation\n         * and visibly disables the previous button.\n         *\n         * Does not require that you re-implement navigation routines like you\n         * would if you were using ClrWizardPage.preventDefault or\n         * Wizard.preventDefault.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this._previousStepDisabled;\n        },\n        /**\n         * Sets whether the page should allow backward navigation.\n         *\n         * @memberof WizardPage\n         *\n         */\n        set: /**\n         * Sets whether the page should allow backward navigation.\n         *\n         * \\@memberof WizardPage\n         *\n         * @param {?} val\n         * @return {?}\n         */\n        function (val) {\n            /** @type {?} */\n            var valBool = !!val;\n            if (valBool !== this._previousStepDisabled) {\n                this._previousStepDisabled = valBool;\n                this.previousStepDisabledChange.emit(valBool);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"stopCancel\", {\n        /**\n         * A getter that retrieves whether the page is preventing the cancel action.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A getter that retrieves whether the page is preventing the cancel action.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this._stopCancel;\n        },\n        /**\n         * Overrides the cancel action from the page level. Allows you to use an\n         * alternate function for validation or data-munging before cancelling the\n         * wizard when combined with the ClrWizardPage.onCancel\n         * (the clrWizardPageOnCancel output).\n         *\n         * Requires that you manually close the wizard from your host component,\n         * usually with a call to Wizard.forceNext() or wizard.next();\n         *\n         * @memberof ClrWizardPage\n         */\n        set: /**\n         * Overrides the cancel action from the page level. Allows you to use an\n         * alternate function for validation or data-munging before cancelling the\n         * wizard when combined with the ClrWizardPage.onCancel\n         * (the clrWizardPageOnCancel output).\n         *\n         * Requires that you manually close the wizard from your host component,\n         * usually with a call to Wizard.forceNext() or wizard.next();\n         *\n         * \\@memberof ClrWizardPage\n         * @param {?} val\n         * @return {?}\n         */\n        function (val) {\n            /** @type {?} */\n            var valBool = !!val;\n            if (valBool !== this._stopCancel) {\n                this._stopCancel = valBool;\n                this.stopCancelChange.emit(valBool);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"stopNext\", {\n        /**\n         * A getter that tells you whether the page is preventing the next action.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A getter that tells you whether the page is preventing the next action.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this._stopNext;\n        },\n        /**\n         * Overrides forward navigation from the page level. Allows you to use an\n         * alternate function for validation or data-munging before moving the\n         * wizard to the next pagewhen combined with the ClrWizardPage.onCommit\n         * (clrWizardPageOnCommit) or ClrWizardPage.nextButtonClicked\n         * (clrWizardPageNext) outputs.\n         *\n         * Requires that you manually tell the wizard to navigate forward from\n         * the hostComponent, usually with a call to Wizard.forceNext() or\n         * wizard.next();\n         *\n         * @memberof ClrWizardPage\n         */\n        set: /**\n         * Overrides forward navigation from the page level. Allows you to use an\n         * alternate function for validation or data-munging before moving the\n         * wizard to the next pagewhen combined with the ClrWizardPage.onCommit\n         * (clrWizardPageOnCommit) or ClrWizardPage.nextButtonClicked\n         * (clrWizardPageNext) outputs.\n         *\n         * Requires that you manually tell the wizard to navigate forward from\n         * the hostComponent, usually with a call to Wizard.forceNext() or\n         * wizard.next();\n         *\n         * \\@memberof ClrWizardPage\n         * @param {?} val\n         * @return {?}\n         */\n        function (val) {\n            /** @type {?} */\n            var valBool = !!val;\n            if (valBool !== this._stopNext) {\n                this._stopNext = valBool;\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"id\", {\n        /**\n         * A read-only getter that generates an ID string for the wizard page from\n         * either the value passed to the ClrWizardPage \"id\" input or a wizard page\n         * counter shared across all wizard pages in the application.\n         *\n         * Note that the value passed into the ID input Will be prefixed with\n         * \"clr-wizard-page-\".\n         *\n         * @readonly\n         *\n         * @memberof ClrWizardPage\n         */\n        get: /**\n         * A read-only getter that generates an ID string for the wizard page from\n         * either the value passed to the ClrWizardPage \"id\" input or a wizard page\n         * counter shared across all wizard pages in the application.\n         *\n         * Note that the value passed into the ID input Will be prefixed with\n         * \"clr-wizard-page-\".\n         *\n         * \\@readonly\n         *\n         * \\@memberof ClrWizardPage\n         * @return {?}\n         */\n        function () {\n            // covers things like null, undefined, false, and empty string\n            // while allowing zero to pass\n            /** @type {?} */\n            var idIsNonZeroFalsy = !this._id && this._id !== 0;\n            // in addition to non-zero falsy we also want to make sure _id is not a negative\n            // number.\n            if (idIsNonZeroFalsy || this._id < 0) {\n                // guard here in the event that input becomes undefined or null by accident\n                this._id = (wizardPageIndex++).toString();\n            }\n            return \"clr-wizard-page-\" + this._id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"readyToComplete\", {\n        /**\n         * A read-only getter that serves as a convenience for those who would rather\n         * not think in the terms of !ClrWizardPage.nextStepDisabled. For some use cases,\n         * ClrWizardPage.readyToComplete is more logical and declarative.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A read-only getter that serves as a convenience for those who would rather\n         * not think in the terms of !ClrWizardPage.nextStepDisabled. For some use cases,\n         * ClrWizardPage.readyToComplete is more logical and declarative.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return !this.nextStepDisabled;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"completed\", {\n        /**\n         * A page is marked as completed if it is both readyToComplete and completed,\n         * as in the next or finish action has been executed while this page was current.\n         *\n         * Note there is and open question about how to handle pages that are marked\n         * complete but who are no longer readyToComplete. This might indicate an error\n         * state for the ClrWizardPage. Currently, the wizard does not acknowledge this state\n         * and only returns that the page is incomplete.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A page is marked as completed if it is both readyToComplete and completed,\n         * as in the next or finish action has been executed while this page was current.\n         *\n         * Note there is and open question about how to handle pages that are marked\n         * complete but who are no longer readyToComplete. This might indicate an error\n         * state for the ClrWizardPage. Currently, the wizard does not acknowledge this state\n         * and only returns that the page is incomplete.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this._complete && this.readyToComplete;\n            // FOR V2: UNWIND COMPLETED, READYTOCOMPLETE, AND ERRORS\n            // SUCH THAT ERRORS IS ITS OWN INPUT. IF A STEP IS\n            // INCOMPLETE AND ERRORED, ERRORED WILL NOT SHOW.\n            // FIRST QUESTION: AM I GREY OR COLORED?\n            // SECOND QUESTION: AM I GREEN OR RED?\n        },\n        /**\n         * A ClrWizardPage can be manually set to completed using this boolean setter.\n         * It is recommended that users rely on the convenience functions in the wizard\n         * and navigation service instead of manually setting pages’ completion state.\n         *\n         * @memberof ClrWizardPage\n         */\n        set: /**\n         * A ClrWizardPage can be manually set to completed using this boolean setter.\n         * It is recommended that users rely on the convenience functions in the wizard\n         * and navigation service instead of manually setting pages’ completion state.\n         *\n         * \\@memberof ClrWizardPage\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._complete = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"current\", {\n        /**\n         * Checks with the navigation service to see if it is the current page.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * Checks with the navigation service to see if it is the current page.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this.navService.currentPage === this;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"disabled\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return !this.enabled;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"enabled\", {\n        /**\n         * A read-only getter that returns whether or not the page is navigable\n         * in the wizard. A wizard page can be navigated to if it is completed\n         * or the page before it is completed.\n         *\n         * This getter handles the logic for enabling or disabling the links in\n         * the step nav on the left Side of the wizard.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A read-only getter that returns whether or not the page is navigable\n         * in the wizard. A wizard page can be navigated to if it is completed\n         * or the page before it is completed.\n         *\n         * This getter handles the logic for enabling or disabling the links in\n         * the step nav on the left Side of the wizard.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this.current || this.completed || this.previousCompleted;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"previousCompleted\", {\n        /**\n         * A read-only getter that returns whether or not the page before this\n         * ClrWizardPage is completed. This is useful for determining whether or not\n         * a page is navigable if it is not current or already completed.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A read-only getter that returns whether or not the page before this\n         * ClrWizardPage is completed. This is useful for determining whether or not\n         * a page is navigable if it is not current or already completed.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            /** @type {?} */\n            var previousPage = this.pageCollection.getPreviousPage(this);\n            if (!previousPage) {\n                return true;\n            }\n            return previousPage.completed;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"title\", {\n        /**\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this.pageTitle.pageTitleTemplateRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"navTitle\", {\n        /**\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            if (this.pageNavTitle) {\n                return this.pageNavTitle.pageNavTitleTemplateRef;\n            }\n            return this.pageTitle.pageTitleTemplateRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"headerActions\", {\n        /**\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            if (!this._headerActions) {\n                return;\n            }\n            return this._headerActions.pageHeaderActionsTemplateRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"hasHeaderActions\", {\n        /**\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return !!this._headerActions;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"buttons\", {\n        /**\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            if (!this._buttons) {\n                return;\n            }\n            return this._buttons.pageButtonsTemplateRef;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardPage.prototype, \"hasButtons\", {\n        /**\n         * A read-only getter that returns a boolean that says whether or\n         * not the ClrWizardPage includes buttons. Used to determine if the\n         * Wizard should override the default button set defined as\n         * its direct children.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A read-only getter that returns a boolean that says whether or\n         * not the ClrWizardPage includes buttons. Used to determine if the\n         * Wizard should override the default button set defined as\n         * its direct children.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return !!this._buttons;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Uses the nav service to make the ClrWizardPage the current page in the\n     * wizard. Bypasses all checks but still emits the ClrWizardPage.onLoad\n     * (clrWizardPageOnLoad) output.\n     *\n     * In most cases, it is better to use the default navigation functions\n     * in Wizard.\n     *\n     * @memberof WizardPage\n     *\n     */\n    /**\n     * Uses the nav service to make the ClrWizardPage the current page in the\n     * wizard. Bypasses all checks but still emits the ClrWizardPage.onLoad\n     * (clrWizardPageOnLoad) output.\n     *\n     * In most cases, it is better to use the default navigation functions\n     * in Wizard.\n     *\n     * \\@memberof WizardPage\n     *\n     * @return {?}\n     */\n    ClrWizardPage.prototype.makeCurrent = /**\n     * Uses the nav service to make the ClrWizardPage the current page in the\n     * wizard. Bypasses all checks but still emits the ClrWizardPage.onLoad\n     * (clrWizardPageOnLoad) output.\n     *\n     * In most cases, it is better to use the default navigation functions\n     * in Wizard.\n     *\n     * \\@memberof WizardPage\n     *\n     * @return {?}\n     */\n    function () {\n        this.navService.currentPage = this;\n    };\n    /**\n     * Links the nav service and establishes the current page if one is not defined.\n     *\n     * @memberof WizardPage\n     *\n     */\n    /**\n     * Links the nav service and establishes the current page if one is not defined.\n     *\n     * \\@memberof WizardPage\n     *\n     * @return {?}\n     */\n    ClrWizardPage.prototype.ngOnInit = /**\n     * Links the nav service and establishes the current page if one is not defined.\n     *\n     * \\@memberof WizardPage\n     *\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var navService = this.navService;\n        if (!navService.currentPage && !navService.navServiceLoaded) {\n            this.makeCurrent();\n            this.navService.navServiceLoaded = true;\n        }\n    };\n    Object.defineProperty(ClrWizardPage.prototype, \"stepItemId\", {\n        /**\n         * A read-only getter that returns the id used by the step nav item associated with the page.\n         *\n         * ClrWizardPage needs this ID string for aria information.\n         *\n         * @memberof WizardPage\n         *\n         */\n        get: /**\n         * A read-only getter that returns the id used by the step nav item associated with the page.\n         *\n         * ClrWizardPage needs this ID string for aria information.\n         *\n         * \\@memberof WizardPage\n         *\n         * @return {?}\n         */\n        function () {\n            return this.pageCollection.getStepItemIdForPage(this);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ClrWizardPage.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-wizard-page',\n                    template: '<ng-content></ng-content>',\n                    host: {\n                        '[id]': 'id',\n                        role: 'tabpanel',\n                        '[attr.aria-hidden]': '!current',\n                        '[attr.aria-labelledby]': 'stepItemId',\n                        '[class.active]': 'current',\n                        '[class.clr-wizard-page]': 'true',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrWizardPage.ctorParameters = function () { return [\n        { type: WizardNavigationService },\n        { type: PageCollectionService },\n        { type: ButtonHubService }\n    ]; };\n    ClrWizardPage.propDecorators = {\n        pageTitle: [{ type: ContentChild, args: [ClrWizardPageTitle,] }],\n        pageNavTitle: [{ type: ContentChild, args: [ClrWizardPageNavTitle,] }],\n        _buttons: [{ type: ContentChild, args: [ClrWizardPageButtons,] }],\n        _headerActions: [{ type: ContentChild, args: [ClrWizardPageHeaderActions,] }],\n        nextStepDisabled: [{ type: Input, args: ['clrWizardPageNextDisabled',] }],\n        nextStepDisabledChange: [{ type: Output, args: ['clrWizardPageNextDisabledChange',] }],\n        previousStepDisabled: [{ type: Input, args: ['clrWizardPagePreviousDisabled',] }],\n        previousStepDisabledChange: [{ type: Output, args: ['clrWizardPagePreviousDisabledChange',] }],\n        preventDefault: [{ type: Input, args: ['clrWizardPagePreventDefault',] }],\n        stopCancel: [{ type: Input, args: ['clrWizardPagePreventDefaultCancel',] }],\n        stopCancelChange: [{ type: Output, args: ['clrWizardPagePreventDefaultCancelChange',] }],\n        stopNext: [{ type: Input, args: ['clrWizardPagePreventDefaultNext',] }],\n        onCommit: [{ type: Output, args: ['clrWizardPageOnCommit',] }],\n        onLoad: [{ type: Output, args: ['clrWizardPageOnLoad',] }],\n        pageOnCancel: [{ type: Output, args: ['clrWizardPageOnCancel',] }],\n        finishButtonClicked: [{ type: Output, args: ['clrWizardPageFinish',] }],\n        previousButtonClicked: [{ type: Output, args: ['clrWizardPagePrevious',] }],\n        nextButtonClicked: [{ type: Output, args: ['clrWizardPageNext',] }],\n        dangerButtonClicked: [{ type: Output, args: ['clrWizardPageDanger',] }],\n        primaryButtonClicked: [{ type: Output, args: ['clrWizardPagePrimary',] }],\n        customButtonClicked: [{ type: Output, args: ['clrWizardPageCustomButton',] }],\n        _id: [{ type: Input, args: ['id',] }]\n    };\n    return ClrWizardPage;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n *\n * The Wizard component\n *\n */\nvar ClrWizard = /** @class */ (function () {\n    /**\n     * Creates an instance of Wizard.\n     *\n     * @memberof Wizard\n     *\n     */\n    function ClrWizard(navService, pageCollection, buttonService, headerActionService, elementRef, differs) {\n        var _this = this;\n        this.navService = navService;\n        this.pageCollection = pageCollection;\n        this.buttonService = buttonService;\n        this.headerActionService = headerActionService;\n        this.elementRef = elementRef;\n        /**\n         * Contains the size defined by the clrWizardSize input\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.size = 'xl';\n        this._forceForward = false;\n        /**\n         * Tells the modal part of the wizard whether it should have a close \"X\"\n         * in the top right corner. Set with the clrWizardClosable input.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.closable = true;\n        /**\n         * Toggles open/close of the wizard component. Set using the clrWizardOpen\n         * input.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this._open = false;\n        /**\n         * Emits when the wizard is opened or closed. Emits through the\n         * clrWizardOpenChange output. Works in conjunction with the\n         * clrWizardOpen binding so you can use...\n         *\n         * <clr-wizard [(clrWizardOpen)]=\"blah\"\n         * ...or...\n         * <clr-wizard [clrWizardOpen]=\"something\" (clrWizardOpenChange)=\"doSomethign($event)\">\n         *\n         * ...for two-way binding.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this._openChanged = new EventEmitter(false);\n        /**\n         * Emits when the wizard is canceled. Can be observed through the clrWizardOnCancel\n         * output.\n         *\n         * Can be combined with the clrWizardPreventDefaultCancel input to create\n         * wizard-level custom cancel routines.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.onCancel = new EventEmitter(false);\n        /**\n         * Emits when the wizard is completed. Can be observed through the clrWizardOnFinish\n         * output.\n         *\n         * Can be combined with the clrWizardPreventDefaultNext input to create\n         * wizard-level custom completion routines.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.wizardFinished = new EventEmitter(false);\n        /**\n         * Emits when the wizard is reset. See .reset(). Can be observed through\n         * the clrWizardOnReset output.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.onReset = new EventEmitter(false);\n        /**\n         * Emits when the current page has changed. Can be observed through the clrWizardCurrentPageChanged\n         * output. This can happen on .next() or .previous().\n         * Useful for non-blocking validation.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.currentPageChanged = new EventEmitter(false);\n        /**\n         * Emits when the wizard moves to the next page. Can be observed through the clrWizardOnNext\n         * output.\n         *\n         * Can be combined with the clrWizardPreventDefaultNext input to create\n         * wizard-level custom navigation routines, which are useful for validation.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.onMoveNext = new EventEmitter(false);\n        /**\n         * Emits when the wizard moves to the previous page. Can be observed through the\n         * clrWizardOnPrevious output.\n         *\n         * Can be useful for validation.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this.onMovePrevious = new EventEmitter(false);\n        this._stopNext = false;\n        this._stopCancel = false;\n        this._stopNavigation = false;\n        this._disableStepnav = false;\n        /**\n         * Used only to communicate to the underlying modal that animations are not\n         * wanted. Primary use is for the display of static/inline wizards.\n         *\n         * Set using clrWizardPreventModalAnimation input. But you should never set it.\n         *\n         * \\@memberof Wizard\n         *\n         */\n        this._stopModalAnimations = false;\n        this.goNextSubscription = this.navService.movedToNextPage.subscribe(function () {\n            _this.onMoveNext.emit();\n        });\n        this.goPreviousSubscription = this.navService.movedToPreviousPage.subscribe(function () {\n            _this.onMovePrevious.emit();\n        });\n        this.cancelSubscription = this.navService.notifyWizardCancel.subscribe(function () {\n            _this.checkAndCancel();\n        });\n        this.wizardFinishedSubscription = this.navService.wizardFinished.subscribe(function () {\n            if (!_this.stopNext) {\n                _this.forceFinish();\n            }\n            _this.wizardFinished.emit();\n        });\n        this.differ = differs.find([]).create(null);\n    }\n    Object.defineProperty(ClrWizard.prototype, \"forceForward\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._forceForward;\n        },\n        /**\n         * Resets page completed states when navigating backwards. Can be set using\n         * the clrWizardForceForwardNavigation input.\n         *\n         * @memberof Wizard\n         *\n         */\n        set: /**\n         * Resets page completed states when navigating backwards. Can be set using\n         * the clrWizardForceForwardNavigation input.\n         *\n         * \\@memberof Wizard\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._forceForward = !!value;\n            this.navService.forceForwardNavigation = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"clrWizardOpen\", {\n        set: /**\n         * @param {?} open\n         * @return {?}\n         */\n        function (open) {\n            if (open) {\n                this.buttonService.buttonsReady = true;\n            }\n            this._open = open;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"stopNext\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._stopNext;\n        },\n        /**\n         * Prevents ClrWizard from moving to the next page or closing itself on finishing.\n         * Set using the clrWizardPreventDefaultNext input.\n         *\n         * Note that using stopNext will require you to create your own calls to\n         * .next() and .finish() in your host component to make the ClrWizard work as\n         * expected.\n         *\n         * Primarily used for validation.\n         *\n         * @memberof Wizard\n         *\n         */\n        set: /**\n         * Prevents ClrWizard from moving to the next page or closing itself on finishing.\n         * Set using the clrWizardPreventDefaultNext input.\n         *\n         * Note that using stopNext will require you to create your own calls to\n         * .next() and .finish() in your host component to make the ClrWizard work as\n         * expected.\n         *\n         * Primarily used for validation.\n         *\n         * \\@memberof Wizard\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._stopNext = !!value;\n            this.navService.wizardHasAltNext = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"stopCancel\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._stopCancel;\n        },\n        /**\n         * Prevents ClrWizard from closing when the cancel button or close \"X\" is clicked.\n         * Set using the clrWizardPreventDefaultCancel input.\n         *\n         * Note that using stopCancel will require you to create your own calls to\n         * .close() in your host component to make the ClrWizard work as expected.\n         *\n         * Useful for doing checks or prompts before closing a ClrWizard.\n         *\n         * @memberof Wizard\n         *\n         */\n        set: /**\n         * Prevents ClrWizard from closing when the cancel button or close \"X\" is clicked.\n         * Set using the clrWizardPreventDefaultCancel input.\n         *\n         * Note that using stopCancel will require you to create your own calls to\n         * .close() in your host component to make the ClrWizard work as expected.\n         *\n         * Useful for doing checks or prompts before closing a ClrWizard.\n         *\n         * \\@memberof Wizard\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._stopCancel = !!value;\n            this.navService.wizardHasAltCancel = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"stopNavigation\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._stopNavigation;\n        },\n        /**\n         * Prevents ClrWizard from performing any form of navigation away from the current\n         * page. Set using the clrWizardPreventNavigation input.\n         *\n         * Note that stopNavigation is meant to freeze the wizard in place, typically\n         * during a long validation or background action where you want the wizard to\n         * display loading content but not allow the user to execute navigation in\n         * the stepnav, close X, or the  back, finish, or next buttons.\n         *\n         * @memberof Wizard\n         *\n         */\n        set: /**\n         * Prevents ClrWizard from performing any form of navigation away from the current\n         * page. Set using the clrWizardPreventNavigation input.\n         *\n         * Note that stopNavigation is meant to freeze the wizard in place, typically\n         * during a long validation or background action where you want the wizard to\n         * display loading content but not allow the user to execute navigation in\n         * the stepnav, close X, or the  back, finish, or next buttons.\n         *\n         * \\@memberof Wizard\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._stopNavigation = !!value;\n            this.navService.wizardStopNavigation = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"disableStepnav\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._disableStepnav;\n        },\n        /**\n         * Prevents clicks on the links in the stepnav from working.\n         *\n         * A more granular bypassing of navigation which can be useful when your\n         * ClrWizard is in a state of completion and you don't want users to be\n         * able to jump backwards and change things.\n         *\n         * @memberof Wizard\n         *\n         */\n        set: /**\n         * Prevents clicks on the links in the stepnav from working.\n         *\n         * A more granular bypassing of navigation which can be useful when your\n         * ClrWizard is in a state of completion and you don't want users to be\n         * able to jump backwards and change things.\n         *\n         * \\@memberof Wizard\n         *\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            this._disableStepnav = !!value;\n            this.navService.wizardDisableStepnav = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"stopModalAnimations\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (this._stopModalAnimations) {\n                return 'true';\n            }\n            return 'false';\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrWizard.prototype.ngOnInit = /**\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        this.currentPageSubscription = this.navService.currentPageChanged.subscribe(function (page) {\n            _this.currentPageChanged.emit();\n        });\n    };\n    /**\n     * @return {?}\n     */\n    ClrWizard.prototype.ngOnDestroy = /**\n     * @return {?}\n     */\n    function () {\n        if (this.goNextSubscription) {\n            this.goNextSubscription.unsubscribe();\n        }\n        if (this.goPreviousSubscription) {\n            this.goPreviousSubscription.unsubscribe();\n        }\n        if (this.cancelSubscription) {\n            this.cancelSubscription.unsubscribe();\n        }\n        if (this.currentPageSubscription) {\n            this.currentPageSubscription.unsubscribe();\n        }\n        if (this.wizardFinishedSubscription) {\n            this.wizardFinishedSubscription.unsubscribe();\n        }\n    };\n    /**\n     * Sets up references that are needed by the providers.\n     *\n     * @name ngAfterContentInit\n     * @memberof Wizard\n     *\n     */\n    /**\n     * Sets up references that are needed by the providers.\n     *\n     * \\@name ngAfterContentInit\n     * \\@memberof Wizard\n     *\n     * @return {?}\n     */\n    ClrWizard.prototype.ngAfterContentInit = /**\n     * Sets up references that are needed by the providers.\n     *\n     * \\@name ngAfterContentInit\n     * \\@memberof Wizard\n     *\n     * @return {?}\n     */\n    function () {\n        this.pageCollection.pages = this.pages;\n        this.headerActionService.wizardHeaderActions = this.headerActions;\n        // Only trigger buttons ready if default is open (inlined)\n        if (this._open) {\n            this.buttonService.buttonsReady = true;\n        }\n    };\n    /**\n     * Used for keeping track of when pages are added or removed from this.pages\n     *\n     * @name ngDoCheck\n     * @memberof Wizard\n     *\n     */\n    /**\n     * Used for keeping track of when pages are added or removed from this.pages\n     *\n     * \\@name ngDoCheck\n     * \\@memberof Wizard\n     *\n     * @return {?}\n     */\n    ClrWizard.prototype.ngDoCheck = /**\n     * Used for keeping track of when pages are added or removed from this.pages\n     *\n     * \\@name ngDoCheck\n     * \\@memberof Wizard\n     *\n     * @return {?}\n     */\n    function () {\n        var _this = this;\n        /** @type {?} */\n        var changes = this.differ.diff(this.pages);\n        if (changes) {\n            changes.forEachAddedItem(function (r) {\n                _this.navService.updateNavigation();\n            });\n            changes.forEachRemovedItem(function (r) {\n                _this.navService.updateNavigation();\n            });\n        }\n    };\n    Object.defineProperty(ClrWizard.prototype, \"isStatic\", {\n        /**\n         * Convenient property for determining whether a wizard is static/in-line or not.\n         *\n         * @name isStatic\n         *\n         * @memberof Wizard\n         *\n         */\n        get: /**\n         * Convenient property for determining whether a wizard is static/in-line or not.\n         *\n         * \\@name isStatic\n         *\n         * \\@memberof Wizard\n         *\n         * @return {?}\n         */\n        function () {\n            return this.elementRef.nativeElement.classList.contains('clr-wizard--inline');\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"currentPage\", {\n        /**\n         * As a getter, current page is a convenient way to retrieve the current page from\n         * the WizardNavigationService.\n         *\n         * As a setter, current page accepts a ClrWizardPage and passes it to WizardNavigationService\n         * to be made the current page. currentPage performs checks to make sure it can navigate\n         * to the designated page.\n         *\n         * @name currentPage\n         *\n         * @memberof Wizard\n         *\n         */\n        get: /**\n         * As a getter, current page is a convenient way to retrieve the current page from\n         * the WizardNavigationService.\n         *\n         * As a setter, current page accepts a ClrWizardPage and passes it to WizardNavigationService\n         * to be made the current page. currentPage performs checks to make sure it can navigate\n         * to the designated page.\n         *\n         * \\@name currentPage\n         *\n         * \\@memberof Wizard\n         *\n         * @return {?}\n         */\n        function () {\n            return this.navService.currentPage;\n        },\n        set: /**\n         * @param {?} page\n         * @return {?}\n         */\n        function (page) {\n            this.navService.goTo(page, true);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"isLast\", {\n        /**\n         * Convenient property for determining if the current page is the last page of\n         * the wizard.\n         *\n         * @name isLast\n         *\n         * @memberof Wizard\n         *\n         */\n        get: /**\n         * Convenient property for determining if the current page is the last page of\n         * the wizard.\n         *\n         * \\@name isLast\n         *\n         * \\@memberof Wizard\n         *\n         * @return {?}\n         */\n        function () {\n            return this.navService.currentPageIsLast;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizard.prototype, \"isFirst\", {\n        /**\n         * Convenient property for determining if the current page is the first page of\n         * the wizard.\n         *\n         * @name isFirst\n         *\n         * @memberof Wizard\n         *\n         */\n        get: /**\n         * Convenient property for determining if the current page is the first page of\n         * the wizard.\n         *\n         * \\@name isFirst\n         *\n         * \\@memberof Wizard\n         *\n         * @return {?}\n         */\n        function () {\n            return this.navService.currentPageIsFirst;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Performs the actions needed to open the wizard. If there is no current\n     * page defined, sets the first page in the wizard to be current.\n     *\n     * @name open\n     * @memberof ClrWizard\n     */\n    /**\n     * Performs the actions needed to open the wizard. If there is no current\n     * page defined, sets the first page in the wizard to be current.\n     *\n     * \\@name open\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.open = /**\n     * Performs the actions needed to open the wizard. If there is no current\n     * page defined, sets the first page in the wizard to be current.\n     *\n     * \\@name open\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        this._open = true;\n        if (!this.currentPage) {\n            this.navService.setFirstPageCurrent();\n        }\n        // Only render buttons when wizard is opened, to avoid chocolate errors\n        this.buttonService.buttonsReady = true;\n        this._openChanged.emit(true);\n    };\n    /**\n     * Does the work involved with closing the wizard. Call this directly instead\n     * of cancel() to implement alternative cancel functionality.\n     *\n     * @name close\n     * @memberof ClrWizard\n     */\n    /**\n     * Does the work involved with closing the wizard. Call this directly instead\n     * of cancel() to implement alternative cancel functionality.\n     *\n     * \\@name close\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.close = /**\n     * Does the work involved with closing the wizard. Call this directly instead\n     * of cancel() to implement alternative cancel functionality.\n     *\n     * \\@name close\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        if (this.stopNavigation) {\n            return;\n        }\n        this._open = false;\n        this._openChanged.emit(false);\n    };\n    /**\n     * Convenient function that can be used to open and close the wizard. It operates\n     * by checking a Boolean parameter. If true, the wizard is opened. If false,\n     * it is closed.\n     *\n     * There is no default value for this parameter, so by default the wizard will\n     * close if invoked with no parameter.\n     *\n     * @name toggle\n     *\n     * @memberof ClrWizard\n     */\n    /**\n     * Convenient function that can be used to open and close the wizard. It operates\n     * by checking a Boolean parameter. If true, the wizard is opened. If false,\n     * it is closed.\n     *\n     * There is no default value for this parameter, so by default the wizard will\n     * close if invoked with no parameter.\n     *\n     * \\@name toggle\n     *\n     * \\@memberof ClrWizard\n     * @param {?} value\n     * @return {?}\n     */\n    ClrWizard.prototype.toggle = /**\n     * Convenient function that can be used to open and close the wizard. It operates\n     * by checking a Boolean parameter. If true, the wizard is opened. If false,\n     * it is closed.\n     *\n     * There is no default value for this parameter, so by default the wizard will\n     * close if invoked with no parameter.\n     *\n     * \\@name toggle\n     *\n     * \\@memberof ClrWizard\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        if (value) {\n            this.open();\n        }\n        else {\n            this.close();\n        }\n    };\n    /**\n     * Moves the wizard to the previous page.\n     *\n     * @name previous\n     * @memberof ClrWizard\n     */\n    /**\n     * Moves the wizard to the previous page.\n     *\n     * \\@name previous\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.previous = /**\n     * Moves the wizard to the previous page.\n     *\n     * \\@name previous\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        this.navService.previous();\n    };\n    /**\n     * Includes a Boolean parameter that will skip checks and event emissions.\n     * If true, the wizard will move to the next page regardless of the state of\n     * its current page. This is useful for alternative navigation where event\n     * emissions have already been done and firing them again may cause an event loop.\n     *\n     * Generally, with alternative navigation, users are supplying their own checks\n     * and validation. So there is no point in superseding their business logic\n     * with our default behavior.\n     *\n     * If false, the wizard will execute default checks and emit events as normal.\n     * This is useful for custom buttons or programmatic workflows that are not\n     * executing the wizards default checks and emissions. It is another way to\n     * navigate without having to rewrite the wizard’s default functionality\n     * from scratch.\n     *\n     * By default, next() does not execute event emissions or checks because the\n     * 80% case is that this method will be called as part of an alternative\n     * navigation with clrWizardPreventDefaultNext.\n     *\n     * @name next\n     * @memberof ClrWizard\n     */\n    /**\n     * Includes a Boolean parameter that will skip checks and event emissions.\n     * If true, the wizard will move to the next page regardless of the state of\n     * its current page. This is useful for alternative navigation where event\n     * emissions have already been done and firing them again may cause an event loop.\n     *\n     * Generally, with alternative navigation, users are supplying their own checks\n     * and validation. So there is no point in superseding their business logic\n     * with our default behavior.\n     *\n     * If false, the wizard will execute default checks and emit events as normal.\n     * This is useful for custom buttons or programmatic workflows that are not\n     * executing the wizards default checks and emissions. It is another way to\n     * navigate without having to rewrite the wizard’s default functionality\n     * from scratch.\n     *\n     * By default, next() does not execute event emissions or checks because the\n     * 80% case is that this method will be called as part of an alternative\n     * navigation with clrWizardPreventDefaultNext.\n     *\n     * \\@name next\n     * \\@memberof ClrWizard\n     * @param {?=} skipChecksAndEmits\n     * @return {?}\n     */\n    ClrWizard.prototype.next = /**\n     * Includes a Boolean parameter that will skip checks and event emissions.\n     * If true, the wizard will move to the next page regardless of the state of\n     * its current page. This is useful for alternative navigation where event\n     * emissions have already been done and firing them again may cause an event loop.\n     *\n     * Generally, with alternative navigation, users are supplying their own checks\n     * and validation. So there is no point in superseding their business logic\n     * with our default behavior.\n     *\n     * If false, the wizard will execute default checks and emit events as normal.\n     * This is useful for custom buttons or programmatic workflows that are not\n     * executing the wizards default checks and emissions. It is another way to\n     * navigate without having to rewrite the wizard’s default functionality\n     * from scratch.\n     *\n     * By default, next() does not execute event emissions or checks because the\n     * 80% case is that this method will be called as part of an alternative\n     * navigation with clrWizardPreventDefaultNext.\n     *\n     * \\@name next\n     * \\@memberof ClrWizard\n     * @param {?=} skipChecksAndEmits\n     * @return {?}\n     */\n    function (skipChecksAndEmits) {\n        if (skipChecksAndEmits === void 0) { skipChecksAndEmits = true; }\n        if (skipChecksAndEmits) {\n            this.forceNext();\n        }\n        else {\n            this.navService.next();\n        }\n    };\n    /**\n     * Includes a Boolean parameter that will skip checks and event emissions.\n     * If true, the wizard will  complete and close regardless of the state of\n     * its current page. This is useful for alternative navigation where event\n     * emissions have already been done and firing them again may cause an event loop.\n     *\n     * If false, the wizard will execute default checks and emit events before\n     * completing and closing.\n     *\n     * By default, finish() does not execute event emissions or checks because the\n     * 80% case is that this method will be called as part of an alternative\n     * navigation with clrWizardPreventDefaultNext.\n     *\n     * @name finish\n     * @memberof ClrWizard\n     */\n    /**\n     * Includes a Boolean parameter that will skip checks and event emissions.\n     * If true, the wizard will  complete and close regardless of the state of\n     * its current page. This is useful for alternative navigation where event\n     * emissions have already been done and firing them again may cause an event loop.\n     *\n     * If false, the wizard will execute default checks and emit events before\n     * completing and closing.\n     *\n     * By default, finish() does not execute event emissions or checks because the\n     * 80% case is that this method will be called as part of an alternative\n     * navigation with clrWizardPreventDefaultNext.\n     *\n     * \\@name finish\n     * \\@memberof ClrWizard\n     * @param {?=} skipChecksAndEmits\n     * @return {?}\n     */\n    ClrWizard.prototype.finish = /**\n     * Includes a Boolean parameter that will skip checks and event emissions.\n     * If true, the wizard will  complete and close regardless of the state of\n     * its current page. This is useful for alternative navigation where event\n     * emissions have already been done and firing them again may cause an event loop.\n     *\n     * If false, the wizard will execute default checks and emit events before\n     * completing and closing.\n     *\n     * By default, finish() does not execute event emissions or checks because the\n     * 80% case is that this method will be called as part of an alternative\n     * navigation with clrWizardPreventDefaultNext.\n     *\n     * \\@name finish\n     * \\@memberof ClrWizard\n     * @param {?=} skipChecksAndEmits\n     * @return {?}\n     */\n    function (skipChecksAndEmits) {\n        if (skipChecksAndEmits === void 0) { skipChecksAndEmits = true; }\n        if (skipChecksAndEmits) {\n            this.forceFinish();\n        }\n        else {\n            this.navService.finish();\n        }\n    };\n    /**\n     * Does the work of finishing up the wizard and closing it but doesn't do the\n     * checks and emissions that other paths do. Good for a last step in an\n     * alternate workflow.\n     *\n     * Does the same thing as calling ClrWizard.finish(true) or ClrWizard.finish()\n     * without a parameter.\n     *\n     * @name forceFinish\n     * @memberof ClrWizard\n     */\n    /**\n     * Does the work of finishing up the wizard and closing it but doesn't do the\n     * checks and emissions that other paths do. Good for a last step in an\n     * alternate workflow.\n     *\n     * Does the same thing as calling ClrWizard.finish(true) or ClrWizard.finish()\n     * without a parameter.\n     *\n     * \\@name forceFinish\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.forceFinish = /**\n     * Does the work of finishing up the wizard and closing it but doesn't do the\n     * checks and emissions that other paths do. Good for a last step in an\n     * alternate workflow.\n     *\n     * Does the same thing as calling ClrWizard.finish(true) or ClrWizard.finish()\n     * without a parameter.\n     *\n     * \\@name forceFinish\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        if (this.stopNavigation) {\n            return;\n        }\n        this.close();\n    };\n    /**\n     * Does the work of moving the wizard to the next page without the\n     * checks and emissions that other paths do. Good for a last step in an\n     * alternate workflow.\n     *\n     * Does the same thing as calling ClrWizard.next(true) or ClrWizard.next()\n     * without a parameter.\n     *\n     * @name forceNext\n     * @memberof ClrWizard\n     */\n    /**\n     * Does the work of moving the wizard to the next page without the\n     * checks and emissions that other paths do. Good for a last step in an\n     * alternate workflow.\n     *\n     * Does the same thing as calling ClrWizard.next(true) or ClrWizard.next()\n     * without a parameter.\n     *\n     * \\@name forceNext\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.forceNext = /**\n     * Does the work of moving the wizard to the next page without the\n     * checks and emissions that other paths do. Good for a last step in an\n     * alternate workflow.\n     *\n     * Does the same thing as calling ClrWizard.next(true) or ClrWizard.next()\n     * without a parameter.\n     *\n     * \\@name forceNext\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        this.navService.forceNext();\n    };\n    /**\n     * Initiates the functionality that cancels and closes the wizard.\n     *\n     * Do not use this for an override of the cancel the functionality\n     * with clrWizardPreventDefaultCancel, clrWizardPreventPageDefaultCancel,\n     * or clrWizardPagePreventDefault because it will initiate the same checks\n     * and event emissions that invoked your event handler.\n     *\n     * Use ClrWizard.close() instead.\n     *\n     * @name cancel\n     * @memberof ClrWizard\n     */\n    /**\n     * Initiates the functionality that cancels and closes the wizard.\n     *\n     * Do not use this for an override of the cancel the functionality\n     * with clrWizardPreventDefaultCancel, clrWizardPreventPageDefaultCancel,\n     * or clrWizardPagePreventDefault because it will initiate the same checks\n     * and event emissions that invoked your event handler.\n     *\n     * Use ClrWizard.close() instead.\n     *\n     * \\@name cancel\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.cancel = /**\n     * Initiates the functionality that cancels and closes the wizard.\n     *\n     * Do not use this for an override of the cancel the functionality\n     * with clrWizardPreventDefaultCancel, clrWizardPreventPageDefaultCancel,\n     * or clrWizardPagePreventDefault because it will initiate the same checks\n     * and event emissions that invoked your event handler.\n     *\n     * Use ClrWizard.close() instead.\n     *\n     * \\@name cancel\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        this.navService.cancel();\n    };\n    /**\n     * Overrides behavior of the underlying modal to avoid collisions with\n     * alternative cancel functionality.\n     *\n     * In most cases, use ClrWizard.cancel() instead.\n     *\n     * @name modalCancel\n     * @memberof ClrWizard\n     */\n    /**\n     * Overrides behavior of the underlying modal to avoid collisions with\n     * alternative cancel functionality.\n     *\n     * In most cases, use ClrWizard.cancel() instead.\n     *\n     * \\@name modalCancel\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.modalCancel = /**\n     * Overrides behavior of the underlying modal to avoid collisions with\n     * alternative cancel functionality.\n     *\n     * In most cases, use ClrWizard.cancel() instead.\n     *\n     * \\@name modalCancel\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        this.checkAndCancel();\n    };\n    /**\n     * Checks for alternative cancel flows defined at the current page or\n     * wizard level. Performs a canceled if not. Emits events that initiate\n     * the alternative cancel outputs (clrWizardPageOnCancel and\n     * clrWizardOnCancel) if so.\n     *\n     * @name checkAndCancel\n     * @memberof ClrWizard\n     */\n    /**\n     * Checks for alternative cancel flows defined at the current page or\n     * wizard level. Performs a canceled if not. Emits events that initiate\n     * the alternative cancel outputs (clrWizardPageOnCancel and\n     * clrWizardOnCancel) if so.\n     *\n     * \\@name checkAndCancel\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.checkAndCancel = /**\n     * Checks for alternative cancel flows defined at the current page or\n     * wizard level. Performs a canceled if not. Emits events that initiate\n     * the alternative cancel outputs (clrWizardPageOnCancel and\n     * clrWizardOnCancel) if so.\n     *\n     * \\@name checkAndCancel\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        /** @type {?} */\n        var currentPage = this.currentPage;\n        /** @type {?} */\n        var currentPageHasOverrides = currentPage.stopCancel || currentPage.preventDefault;\n        if (this.stopNavigation) {\n            return;\n        }\n        currentPage.pageOnCancel.emit();\n        if (!currentPageHasOverrides) {\n            this.onCancel.emit();\n        }\n        if (!this.stopCancel && !currentPageHasOverrides) {\n            this.close();\n        }\n    };\n    /**\n     * Accepts the wizard ID as a string parameter and calls to WizardNavigationService\n     * to navigate to the page with that ID. Navigation will invoke the wizard’s default\n     * checks and event emissions.\n     *\n     * Probably less useful than calling directly to ClrWizard.navService.goTo() because the\n     * nav service method can accept either a string ID or a page object.\n     *\n     * The format of the expected ID parameter can be found in the return of the\n     * ClrWizardPage.id getter, usually prefixed with “clr-wizard-page-“ and then either a\n     * numeric ID or the ID specified for the ClrWizardPage component’s “id” input.\n     *\n     * @name goTo\n     *\n     * @memberof ClrWizard\n     */\n    /**\n     * Accepts the wizard ID as a string parameter and calls to WizardNavigationService\n     * to navigate to the page with that ID. Navigation will invoke the wizard’s default\n     * checks and event emissions.\n     *\n     * Probably less useful than calling directly to ClrWizard.navService.goTo() because the\n     * nav service method can accept either a string ID or a page object.\n     *\n     * The format of the expected ID parameter can be found in the return of the\n     * ClrWizardPage.id getter, usually prefixed with “clr-wizard-page-“ and then either a\n     * numeric ID or the ID specified for the ClrWizardPage component’s “id” input.\n     *\n     * \\@name goTo\n     *\n     * \\@memberof ClrWizard\n     * @param {?} pageId\n     * @return {?}\n     */\n    ClrWizard.prototype.goTo = /**\n     * Accepts the wizard ID as a string parameter and calls to WizardNavigationService\n     * to navigate to the page with that ID. Navigation will invoke the wizard’s default\n     * checks and event emissions.\n     *\n     * Probably less useful than calling directly to ClrWizard.navService.goTo() because the\n     * nav service method can accept either a string ID or a page object.\n     *\n     * The format of the expected ID parameter can be found in the return of the\n     * ClrWizardPage.id getter, usually prefixed with “clr-wizard-page-“ and then either a\n     * numeric ID or the ID specified for the ClrWizardPage component’s “id” input.\n     *\n     * \\@name goTo\n     *\n     * \\@memberof ClrWizard\n     * @param {?} pageId\n     * @return {?}\n     */\n    function (pageId) {\n        if (!pageId) {\n            return;\n        }\n        this.navService.goTo(pageId);\n    };\n    /**\n     * A convenience function that calls to PageCollectionService.reset() and emits the\n     * ClrWizard.onReset event.\n     *\n     * Reset sets all WizardPages to incomplete and sets the first page in the ClrWizard to\n     * be the current page, essentially resetting the wizard navigation.\n     *\n     * Users would then use the onReset event to reset the data or model in their\n     * host component.\n     *\n     * It could be useful to call a reset without firing the onReset event. To do this,\n     * just call ClrWizard.pageCollection.reset() directly.\n     *\n     * @name reset\n     * @memberof ClrWizard\n     */\n    /**\n     * A convenience function that calls to PageCollectionService.reset() and emits the\n     * ClrWizard.onReset event.\n     *\n     * Reset sets all WizardPages to incomplete and sets the first page in the ClrWizard to\n     * be the current page, essentially resetting the wizard navigation.\n     *\n     * Users would then use the onReset event to reset the data or model in their\n     * host component.\n     *\n     * It could be useful to call a reset without firing the onReset event. To do this,\n     * just call ClrWizard.pageCollection.reset() directly.\n     *\n     * \\@name reset\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    ClrWizard.prototype.reset = /**\n     * A convenience function that calls to PageCollectionService.reset() and emits the\n     * ClrWizard.onReset event.\n     *\n     * Reset sets all WizardPages to incomplete and sets the first page in the ClrWizard to\n     * be the current page, essentially resetting the wizard navigation.\n     *\n     * Users would then use the onReset event to reset the data or model in their\n     * host component.\n     *\n     * It could be useful to call a reset without firing the onReset event. To do this,\n     * just call ClrWizard.pageCollection.reset() directly.\n     *\n     * \\@name reset\n     * \\@memberof ClrWizard\n     * @return {?}\n     */\n    function () {\n        this.pageCollection.reset();\n        this.onReset.next();\n    };\n    ClrWizard.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-wizard',\n                    providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService],\n                    template: \"<!--\\n  ~ Copyright (c) 2016-2018 VMware, Inc. All Rights Reserved.\\n  ~ This software is released under MIT license.\\n  ~ The full license information can be found in LICENSE in the root directory of this project.\\n  -->\\n\\n<clr-modal\\n    [clrModalOpen]=\\\"_open\\\"\\n    [clrModalSize]=\\\"size\\\"\\n    [clrModalClosable]=\\\"closable\\\"\\n    [clrModalStaticBackdrop]=\\\"true\\\"\\n    [clrModalSkipAnimation]=\\\"stopModalAnimations\\\"\\n    [clrModalOverrideScrollService]=\\\"isStatic\\\"\\n    [clrModalPreventClose]=\\\"true\\\"\\n    (clrModalAlternateClose)=\\\"modalCancel()\\\">\\n\\n    <nav class=\\\"modal-nav clr-wizard-stepnav-wrapper\\\">\\n        <h3 class=\\\"clr-wizard-title\\\"><ng-content select=\\\"clr-wizard-title\\\"></ng-content></h3>\\n        <clr-wizard-stepnav></clr-wizard-stepnav>\\n    </nav>\\n\\n    <h3 class=\\\"modal-title\\\">\\n        <span class=\\\"modal-title-text\\\">\\n            <ng-template [ngTemplateOutlet]=\\\"navService.currentPageTitle\\\"></ng-template>\\n        </span>\\n\\n        <div class=\\\"modal-header-actions-wrapper\\\" *ngIf=\\\"headerActionService.displayHeaderActionsWrapper\\\">\\n            <div *ngIf=\\\"headerActionService.showWizardHeaderActions\\\">\\n                <ng-content select=\\\"clr-wizard-header-action\\\"></ng-content>\\n            </div>\\n            <div *ngIf=\\\"headerActionService.currentPageHasHeaderActions\\\">\\n                <ng-template [ngTemplateOutlet]=\\\"navService.currentPage.headerActions\\\"></ng-template>\\n            </div>\\n        </div>\\n    </h3>\\n\\n    <div class=\\\"modal-body\\\">\\n        <main clr-wizard-pages-wrapper class=\\\"clr-wizard-content\\\">\\n            <ng-content></ng-content>\\n        </main>\\n    </div>\\n    <div class=\\\"modal-footer clr-wizard-footer\\\">\\n        <div class=\\\"clr-wizard-footer-buttons\\\">\\n            <div *ngIf=\\\"navService.currentPage && !navService.currentPage.hasButtons\\\"\\n                class=\\\"clr-wizard-footer-buttons-wrapper\\\">\\n                <ng-content select=\\\"clr-wizard-button\\\"></ng-content>\\n            </div>\\n            <div *ngIf=\\\"navService.currentPage && navService.currentPage.hasButtons\\\"\\n                class=\\\"clr-wizard-footer-buttons-wrapper\\\">\\n                <ng-template [ngTemplateOutlet]=\\\"navService.currentPage.buttons\\\"></ng-template>\\n            </div>\\n        </div>\\n    </div>\\n</clr-modal>\\n\",\n                    host: {\n                        '[class.clr-wizard]': 'true',\n                        '[class.wizard-md]': \"size == 'md'\",\n                        '[class.wizard-lg]': \"size == 'lg'\",\n                        '[class.wizard-xl]': \"size == 'xl'\",\n                        '[class.lastPage]': 'navService.currentPageIsLast',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrWizard.ctorParameters = function () { return [\n        { type: WizardNavigationService },\n        { type: PageCollectionService },\n        { type: ButtonHubService },\n        { type: HeaderActionService },\n        { type: ElementRef },\n        { type: IterableDiffers }\n    ]; };\n    ClrWizard.propDecorators = {\n        size: [{ type: Input, args: ['clrWizardSize',] }],\n        forceForward: [{ type: Input, args: ['clrWizardForceForwardNavigation',] }],\n        closable: [{ type: Input, args: ['clrWizardClosable',] }],\n        clrWizardOpen: [{ type: Input, args: ['clrWizardOpen',] }],\n        _openChanged: [{ type: Output, args: ['clrWizardOpenChange',] }],\n        onCancel: [{ type: Output, args: ['clrWizardOnCancel',] }],\n        wizardFinished: [{ type: Output, args: ['clrWizardOnFinish',] }],\n        onReset: [{ type: Output, args: ['clrWizardOnReset',] }],\n        pages: [{ type: ContentChildren, args: [ClrWizardPage,] }],\n        headerActions: [{ type: ContentChildren, args: [ClrWizardHeaderAction,] }],\n        currentPageChanged: [{ type: Output, args: ['clrWizardCurrentPageChanged',] }],\n        onMoveNext: [{ type: Output, args: ['clrWizardOnNext',] }],\n        onMovePrevious: [{ type: Output, args: ['clrWizardOnPrevious',] }],\n        stopNext: [{ type: Input, args: ['clrWizardPreventDefaultNext',] }],\n        stopCancel: [{ type: Input, args: ['clrWizardPreventDefaultCancel',] }],\n        stopNavigation: [{ type: Input, args: ['clrWizardPreventNavigation',] }],\n        disableStepnav: [{ type: Input, args: ['clrWizardDisableStepnav',] }],\n        _stopModalAnimations: [{ type: Input, args: ['clrWizardPreventModalAnimation',] }]\n    };\n    return ClrWizard;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar DEFAULT_BUTTON_TYPES = {\n    cancel: 'cancel',\n    previous: 'previous',\n    next: 'next',\n    finish: 'finish',\n    danger: 'danger',\n};\n/** @type {?} */\nvar CUSTOM_BUTTON_TYPES = {\n    cancel: 'custom-cancel',\n    previous: 'custom-previous',\n    next: 'custom-next',\n    finish: 'custom-finish',\n    danger: 'custom-danger',\n};\nvar ClrWizardButton = /** @class */ (function () {\n    function ClrWizardButton(navService, buttonService) {\n        this.navService = navService;\n        this.buttonService = buttonService;\n        this.type = '';\n        this.disabled = false;\n        this.hidden = false;\n        // EventEmitter which is emitted when a button is clicked.\n        this.wasClicked = new EventEmitter(false);\n    }\n    /**\n     * @param {?=} valueToCheck\n     * @param {?=} typeToLookUp\n     * @return {?}\n     */\n    ClrWizardButton.prototype.checkDefaultAndCustomType = /**\n     * @param {?=} valueToCheck\n     * @param {?=} typeToLookUp\n     * @return {?}\n     */\n    function (valueToCheck, typeToLookUp) {\n        if (valueToCheck === void 0) { valueToCheck = ''; }\n        if (DEFAULT_BUTTON_TYPES[typeToLookUp] === valueToCheck) {\n            return true;\n        }\n        if (CUSTOM_BUTTON_TYPES[typeToLookUp] === valueToCheck) {\n            return true;\n        }\n        return false;\n    };\n    Object.defineProperty(ClrWizardButton.prototype, \"isCancel\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.checkDefaultAndCustomType(this.type, 'cancel');\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"isNext\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.checkDefaultAndCustomType(this.type, 'next');\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"isPrevious\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.checkDefaultAndCustomType(this.type, 'previous');\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"isFinish\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.checkDefaultAndCustomType(this.type, 'finish');\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"isDanger\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.checkDefaultAndCustomType(this.type, 'danger');\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"isPrimaryAction\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this.isNext || this.isDanger || this.isFinish;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"_disabledAttribute\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            if (this.isDisabled) {\n                return '';\n            }\n            return null;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"isDisabled\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            // dealing with negatives here. cognitively easier to think of it like this...\n            /** @type {?} */\n            var disabled = true;\n            /** @type {?} */\n            var nav = this.navService;\n            /** @type {?} */\n            var page = this.navService.currentPage;\n            // Ensure we don't change the response until buttons are ready to avoid chocolate\n            if (!this.buttonService.buttonsReady) {\n                return !disabled;\n            }\n            if (this.disabled || nav.wizardStopNavigation || !page) {\n                return true;\n            }\n            if (this.isCancel) {\n                return !disabled;\n            }\n            if (this.isPrevious && (nav.currentPageIsFirst || page.previousStepDisabled)) {\n                return disabled;\n            }\n            if (this.isDanger && !page.readyToComplete) {\n                return disabled;\n            }\n            if (this.isNext && (nav.currentPageIsLast || !page.readyToComplete)) {\n                return disabled;\n            }\n            if (this.isFinish && (!nav.currentPageIsLast || !page.readyToComplete)) {\n                return disabled;\n            }\n            return !disabled;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardButton.prototype, \"isHidden\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            // dealing with negatives here. cognitively easier to think of it like this...\n            /** @type {?} */\n            var hidden = true;\n            /** @type {?} */\n            var nav = this.navService;\n            // Ensure we don't change the response until buttons are ready to avoid chocolate\n            if (!this.buttonService.buttonsReady) {\n                return !hidden;\n            }\n            if (this.hidden) {\n                return true;\n            }\n            if (this.isCancel) {\n                return !hidden;\n            }\n            if (this.isPrevious && nav.currentPageIsFirst) {\n                return hidden;\n            }\n            if (this.isNext && nav.currentPageIsLast) {\n                return hidden;\n            }\n            if (this.isFinish && !nav.currentPageIsLast) {\n                return hidden;\n            }\n            return !hidden;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrWizardButton.prototype.click = /**\n     * @return {?}\n     */\n    function () {\n        if (this.isDisabled) {\n            return;\n        }\n        this.wasClicked.emit(this.type);\n        this.buttonService.buttonClicked(this.type);\n    };\n    ClrWizardButton.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-wizard-button',\n                    template: \"\\n        <button\\n            type=\\\"button\\\"\\n            class=\\\"btn clr-wizard-btn\\\"\\n            [class.btn-link]=\\\"isCancel\\\"\\n            [class.clr-wizard-btn--tertiary]=\\\"isCancel\\\"\\n            [class.btn-outline]=\\\"isPrevious\\\"\\n            [class.clr-wizard-btn--secondary]=\\\"isPrevious\\\"\\n            [class.btn-primary]=\\\"isPrimaryAction\\\"\\n            [class.clr-wizard-btn--primary]=\\\"isPrimaryAction\\\"\\n            [class.btn-success]=\\\"isFinish\\\"\\n            [class.btn-danger]=\\\"isDanger\\\"\\n            [class.disabled]=\\\"isDisabled\\\"\\n            [attr.disabled]=\\\"_disabledAttribute\\\"\\n            (click)=\\\"click()\\\">\\n            <ng-content></ng-content>\\n        </button>\\n    \",\n                    host: { class: 'clr-wizard-btn-wrapper', '[attr.aria-hidden]': 'isHidden' },\n                    styles: ['[aria-hidden=\"true\"] { display: none; }']\n                }] }\n    ];\n    /** @nocollapse */\n    ClrWizardButton.ctorParameters = function () { return [\n        { type: WizardNavigationService },\n        { type: ButtonHubService }\n    ]; };\n    ClrWizardButton.propDecorators = {\n        type: [{ type: Input, args: ['type',] }],\n        disabled: [{ type: Input, args: ['clrWizardButtonDisabled',] }],\n        hidden: [{ type: Input, args: ['clrWizardButtonHidden',] }],\n        wasClicked: [{ type: Output, args: ['clrWizardButtonClicked',] }]\n    };\n    return ClrWizardButton;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrWizardCustomTags = /** @class */ (function () {\n    function ClrWizardCustomTags() {\n    }\n    ClrWizardCustomTags.decorators = [\n        { type: Directive, args: [{ selector: 'clr-wizard-title, clr-wizard-pagetitle' },] }\n    ];\n    return ClrWizardCustomTags;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrWizardStepnav = /** @class */ (function () {\n    function ClrWizardStepnav(pageService) {\n        this.pageService = pageService;\n    }\n    ClrWizardStepnav.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-wizard-stepnav',\n                    template: \"\\n        <ol class=\\\"clr-wizard-stepnav-list\\\" role=\\\"tablist\\\">\\n            <li *ngFor=\\\"let page of pageService.pages\\\" clr-wizard-stepnav-item \\n            [page]=\\\"page\\\" class=\\\"clr-wizard-stepnav-item\\\"></li>\\n        </ol>\\n    \",\n                    host: { class: 'clr-wizard-stepnav' }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrWizardStepnav.ctorParameters = function () { return [\n        { type: PageCollectionService }\n    ]; };\n    return ClrWizardStepnav;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrWizardStepnavItem = /** @class */ (function () {\n    function ClrWizardStepnavItem(navService, pageCollection) {\n        this.navService = navService;\n        this.pageCollection = pageCollection;\n    }\n    /**\n     * @return {?}\n     */\n    ClrWizardStepnavItem.prototype.pageGuard = /**\n     * @return {?}\n     */\n    function () {\n        if (!this.page) {\n            throw new Error('Wizard stepnav item is not associated with a wizard page.');\n        }\n    };\n    Object.defineProperty(ClrWizardStepnavItem.prototype, \"id\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            this.pageGuard();\n            return this.pageCollection.getStepItemIdForPage(this.page);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardStepnavItem.prototype, \"isDisabled\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            this.pageGuard();\n            return this.page.disabled || this.navService.wizardStopNavigation || this.navService.wizardDisableStepnav;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardStepnavItem.prototype, \"isCurrent\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            this.pageGuard();\n            return this.page.current;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardStepnavItem.prototype, \"isComplete\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            this.pageGuard();\n            return this.page.completed;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrWizardStepnavItem.prototype, \"canNavigate\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            this.pageGuard();\n            return this.pageCollection.previousPageIsCompleted(this.page);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @return {?}\n     */\n    ClrWizardStepnavItem.prototype.click = /**\n     * @return {?}\n     */\n    function () {\n        this.pageGuard();\n        // if we click on our own stepnav or a disabled stepnav, we don't want to do anything\n        if (this.isDisabled || this.isCurrent) {\n            return;\n        }\n        this.navService.goTo(this.page);\n    };\n    ClrWizardStepnavItem.decorators = [\n        { type: Component, args: [{\n                    selector: '[clr-wizard-stepnav-item]',\n                    template: \"\\n        <button type=\\\"button\\\" class=\\\"btn btn-link clr-wizard-stepnav-link\\\" (click)=\\\"click()\\\">\\n            <ng-template [ngTemplateOutlet]=\\\"page.navTitle\\\"></ng-template>\\n        </button>\\n    \",\n                    host: {\n                        '[id]': 'id',\n                        '[attr.aria-selected]': 'isCurrent',\n                        '[attr.aria-controls]': 'id',\n                        role: 'tab',\n                        '[class.clr-nav-link]': 'true',\n                        '[class.nav-item]': 'true',\n                        '[class.active]': 'isCurrent',\n                        '[class.disabled]': 'isDisabled',\n                        '[class.no-click]': '!canNavigate',\n                        '[class.complete]': 'isComplete',\n                    }\n                }] }\n    ];\n    /** @nocollapse */\n    ClrWizardStepnavItem.ctorParameters = function () { return [\n        { type: WizardNavigationService },\n        { type: PageCollectionService }\n    ]; };\n    ClrWizardStepnavItem.propDecorators = {\n        page: [{ type: Input, args: ['page',] }]\n    };\n    return ClrWizardStepnavItem;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_WIZARD_DIRECTIVES = [\n    ClrWizard,\n    ClrWizardPage,\n    ClrWizardStepnav,\n    ClrWizardStepnavItem,\n    ClrWizardButton,\n    ClrWizardHeaderAction,\n    ClrWizardCustomTags,\n    ClrWizardPageTitle,\n    ClrWizardPageNavTitle,\n    ClrWizardPageButtons,\n    ClrWizardPageHeaderActions,\n];\nvar ClrWizardModule = /** @class */ (function () {\n    function ClrWizardModule() {\n    }\n    ClrWizardModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule, ClrModalModule, ClrAlertModule],\n                    declarations: [CLR_WIZARD_DIRECTIVES],\n                    exports: [CLR_WIZARD_DIRECTIVES],\n                },] }\n    ];\n    return ClrWizardModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClarityModule = /** @class */ (function () {\n    function ClarityModule() {\n    }\n    ClarityModule.decorators = [\n        { type: NgModule, args: [{\n                    exports: [\n                        ClrEmphasisModule,\n                        ClrDataModule,\n                        ClrIconModule,\n                        ClrModalModule,\n                        ClrLoadingModule,\n                        ClrIfExpandModule,\n                        ClrConditionalModule,\n                        ClrFocusTrapModule,\n                        ClrButtonModule,\n                        ClrFormsModule,\n                        ClrLayoutModule,\n                        ClrPopoverModule,\n                        ClrWizardModule,\n                        ClrDragAndDropModule,\n                    ],\n                },] }\n    ];\n    return ClarityModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * Private counter to generate unique IDs for the checkboxes, to bind the labels to them.\n * @type {?}\n */\nvar latestId = 0;\n/**\n * @deprecated ClrCheckbox will be renamed to ClrCheckboxDeprecated in 0.12, and will be replaced with a new\n * implementation in 0.13, so if you import it you will need to update your references.\n */\nvar ClrCheckboxDeprecated = /** @class */ (function () {\n    function ClrCheckboxDeprecated() {\n        // If our host has an ID attribute, we use this instead of our index.\n        this._id = (latestId++).toString();\n        // If host provides an clrAriaLabeledBy input, we apply it to the checkbox\n        this.clrAriaLabeledBy = null;\n        // If our host has a name attribute, we apply it to the checkbox.\n        this.name = null;\n        // If the host is disabled we apply it to the checkbox\n        this.disabled = false;\n        // Support for inline checkboxes, adds the necessary class to the host\n        this.inline = false;\n        this._checked = false;\n        this._indeterminate = false;\n        this.indeterminateChange = new EventEmitter(false);\n        this.change = new EventEmitter(false);\n        /*\n             * These callbacks will be given to us through the ControlValueAccessor interface,\n             * and we need to call them when the user interacts with the checkbox.\n             */\n        this.onChangeCallback = function (_) { };\n        this.onTouchedCallback = function () { };\n    }\n    Object.defineProperty(ClrCheckboxDeprecated.prototype, \"id\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return \"clr-checkbox-\" + this._id;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrCheckboxDeprecated.prototype, \"checked\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._checked;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (value !== this._checked) {\n                if (this._indeterminate) {\n                    this.setIndeterminate(false);\n                }\n                this.setChecked(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ClrCheckboxDeprecated.prototype, \"indeterminate\", {\n        get: /**\n         * @return {?}\n         */\n        function () {\n            return this._indeterminate;\n        },\n        set: /**\n         * @param {?} value\n         * @return {?}\n         */\n        function (value) {\n            if (this._indeterminate !== value) {\n                if (this._checked) {\n                    this.setChecked(false);\n                }\n                this.setIndeterminate(value);\n            }\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.setIndeterminate = /**\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        this._indeterminate = value;\n        this.indeterminateChange.emit(this._indeterminate);\n    };\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.setChecked = /**\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        this._checked = value;\n        this.change.emit(this._checked);\n    };\n    /**\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.toggle = /**\n     * @return {?}\n     */\n    function () {\n        this.checked = !this.checked;\n        this.onChangeCallback(this.checked);\n    };\n    /**\n     * @param {?} value\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.writeValue = /**\n     * @param {?} value\n     * @return {?}\n     */\n    function (value) {\n        if (value === null) {\n            value = false;\n        }\n        if (value !== this.checked) {\n            this.checked = value;\n        }\n    };\n    /**\n     * @param {?} onChange\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.registerOnChange = /**\n     * @param {?} onChange\n     * @return {?}\n     */\n    function (onChange) {\n        this.onChangeCallback = onChange;\n    };\n    /**\n     * @param {?} onTouched\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.registerOnTouched = /**\n     * @param {?} onTouched\n     * @return {?}\n     */\n    function (onTouched) {\n        this.onTouchedCallback = onTouched;\n    };\n    /**\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.touch = /**\n     * @return {?}\n     */\n    function () {\n        this.onTouchedCallback();\n    };\n    /**\n     * @return {?}\n     */\n    ClrCheckboxDeprecated.prototype.checkIndeterminateState = /**\n     * @return {?}\n     */\n    function () {\n        if (!this.disabled) {\n            this.toggle();\n        }\n    };\n    ClrCheckboxDeprecated.decorators = [\n        { type: Component, args: [{\n                    selector: 'clr-checkbox',\n                    template: \"\\n        <!--\\n            FIXME: We are not subscribed to the change event but the click event here.\\n            The reason for that is because checkboxes behave differently on IE & Edge.\\n            https://stackoverflow.com/a/19447939\\n            \\n            To fix that, we listen to every click event and then toggle the checkbox manually\\n            to make it behave the same way across the browsers we support.\\n            \\n            This works for cases when users toggle the checkbox using the keyboard too:\\n            https://stackoverflow.com/questions/27878940/spacebar-triggering-click-event-on-checkbox\\n        -->\\n        <input type=\\\"checkbox\\\" [attr.aria-labelledby]=\\\"clrAriaLabeledBy\\\"\\n               [id]=\\\"id\\\" [name]=\\\"name\\\" [checked]=\\\"checked\\\"\\n               [indeterminate]=\\\"indeterminate\\\" [disabled]=\\\"disabled\\\"\\n               (blur)=\\\"touch()\\\" (click)=\\\"checkIndeterminateState()\\\">\\n        <label [attr.for]=\\\"id\\\">\\n            <ng-content></ng-content>\\n        </label>\\n    \",\n                    host: { '[class.checkbox]': '!inline', '[class.checkbox-inline]': 'inline', '[class.disabled]': 'disabled' },\n                    /*\n                         * This provider lets us declare our checkbox as a ControlValueAccessor,\n                         * which allows us to use [(ngModel)] directly on our component,\n                         * with all the automatic features wiring that come with it.\n                         */\n                    providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return ClrCheckboxDeprecated; }), multi: true }]\n                }] }\n    ];\n    ClrCheckboxDeprecated.propDecorators = {\n        _id: [{ type: Input, args: ['id',] }],\n        clrAriaLabeledBy: [{ type: Input, args: ['clrAriaLabeledBy',] }],\n        name: [{ type: Input, args: ['name',] }],\n        disabled: [{ type: Input, args: ['clrDisabled',] }],\n        inline: [{ type: Input, args: ['clrInline',] }],\n        checked: [{ type: Input, args: ['clrChecked',] }],\n        indeterminate: [{ type: Input, args: ['clrIndeterminate',] }],\n        indeterminateChange: [{ type: Output, args: ['clrIndeterminateChange',] }],\n        change: [{ type: Output, args: ['clrCheckedChange',] }]\n    };\n    return ClrCheckboxDeprecated;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/** @type {?} */\nvar CLR_CHECKBOX_DIRECTIVES = [ClrCheckboxDeprecated];\nvar ClrCheckboxDeprecatedModule = /** @class */ (function () {\n    function ClrCheckboxDeprecatedModule() {\n    }\n    ClrCheckboxDeprecatedModule.decorators = [\n        { type: NgModule, args: [{ imports: [CommonModule], declarations: [CLR_CHECKBOX_DIRECTIVES], exports: [CLR_CHECKBOX_DIRECTIVES] },] }\n    ];\n    return ClrCheckboxDeprecatedModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\nvar ClrFormsDeprecatedModule = /** @class */ (function () {\n    function ClrFormsDeprecatedModule() {\n    }\n    ClrFormsDeprecatedModule.decorators = [\n        { type: NgModule, args: [{\n                    imports: [CommonModule],\n                    exports: [ClrCheckboxDeprecatedModule, ClrDatepickerModule],\n                },] }\n    ];\n    return ClrFormsDeprecatedModule;\n}());\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @return {?}\n */\nfunction collapse() {\n    return [\n        state('true', style({ height: 0, 'overflow-y': 'hidden' })),\n        transition('true => false', [animate('0.2s ease-in-out', style({ height: '*', 'overflow-y': 'hidden' }))]),\n        transition('false => true', [style({ height: '*', 'overflow-y': 'hidden' }), animate('0.2s ease-in-out')]),\n    ];\n}\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @param {?=} opacity\n * @return {?}\n */\nfunction fade(opacity) {\n    if (opacity === void 0) { opacity = 1; }\n    return [\n        transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: opacity }))]),\n        transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),\n    ];\n}\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @param {?} direction\n * @return {?}\n */\nfunction fadeSlide(direction) {\n    /** @type {?} */\n    var transform = null;\n    if (direction === 'up') {\n        transform = 'translate(0, 25%)';\n    }\n    else if (direction === 'down') {\n        transform = 'translate(0, -25%)';\n    }\n    else if (direction === 'left') {\n        transform = 'translate(25%, 0)';\n    }\n    else if (direction === 'right') {\n        transform = 'translate(-25%, 0)';\n    }\n    else {\n        throw new Error('Unknown direction ' + direction + ' for slide animation.');\n    }\n    return [\n        transition('void => *', [style({ opacity: 0, transform: transform }), animate('0.2s ease-in-out')]),\n        transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0, transform: transform }))]),\n    ];\n}\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n/**\n * @param {?} direction\n * @return {?}\n */\nfunction slide(direction) {\n    /** @type {?} */\n    var transform = null;\n    if (direction === 'up') {\n        transform = 'translate(0, 25%)';\n    }\n    else if (direction === 'down') {\n        transform = 'translate(0, -25%)';\n    }\n    else if (direction === 'left') {\n        transform = 'translate(25%, 0)';\n    }\n    else if (direction === 'right') {\n        transform = 'translate(-25%, 0)';\n    }\n    else {\n        throw new Error('Unknown direction ' + direction + ' for slide animation.');\n    }\n    return [\n        transition('void => *', [style({ transform: transform }), animate('0.2s ease-in-out')]),\n        transition('* => void', [animate('0.2s ease-in-out', style({ transform: transform }))]),\n    ];\n}\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\n/**\n * @fileoverview added by tsickle\n * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc\n */\n\nexport { FocusTrapTracker as ÇlrFocusTrapTracker, ClarityModule, ClrButtonModule, ClrButton, ClrButtonGroup, CLR_BUTTON_GROUP_DIRECTIVES, ClrButtonGroupModule, ClrLoadingButton, CLR_LOADING_BUTTON_DIRECTIVES, ClrLoadingButtonModule, ClrDataModule, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridColumn, ClrDatagridColumnToggle, ClrDatagridHideableColumn, ClrDatagridFilter, ClrDatagridItems, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridCell, ClrDatagridFooter, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridSortOrder, DatagridStringFilter, DatagridPropertyStringFilter, DatagridPropertyComparator, CLR_DATAGRID_DIRECTIVES, ClrDatagridModule, ClrSelectedState, ClrTree, ClrTreeNode, ClrRecursiveForOf, CLR_TREE_VIEW_DIRECTIVES, ClrTreeViewModule, ClrStackView, ClrStackHeader, ClrStackBlock, ClrStackInput, ClrStackSelect, CLR_STACK_VIEW_DIRECTIVES, ClrStackViewModule, ClrStackViewCustomTags, ClrEmphasisModule, ClrAlert, ClrAlertItem, ClrAlerts, ClrAlertsPager, CLR_ALERT_DIRECTIVES, ClrAlertModule, ClrIfError, ClrControlError, ClrForm, ClrControlHelper, ClrLabel, ClrLayout, ClrCommonFormsModule, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxWrapper, ClrCheckboxModule, ClrDateContainer, ClrDateInput, ClrDatepickerViewManager, ClrDaypicker, ClrMonthpicker, ClrYearpicker, ClrCalendar, ClrDay, CLR_DATEPICKER_DIRECTIVES, ClrDatepickerModule, ClrInput, ClrInputContainer, ClrInputModule, ClrPassword, ToggleServiceProvider, ToggleService, ClrPasswordContainer, ClrPasswordModule, ClrRadio, ClrRadioContainer, ClrRadioWrapper, ClrRadioModule, ClrSelect, ClrSelectContainer, ClrSelectModule, ClrTextarea, ClrTextareaContainer, ClrTextareaModule, ClrFormsModule, ClrCheckboxDeprecated, CLR_CHECKBOX_DIRECTIVES, ClrCheckboxDeprecatedModule, ClrFormsDeprecatedModule, ClrIconCustomTag, CLR_ICON_DIRECTIVES, ClrIconModule, ClrLayoutModule, ClrMainContainer, CLR_LAYOUT_DIRECTIVES, ClrMainContainerModule, MainContainerWillyWonka, NavDetectionOompaLoompa, ClrHeader, ClrNavLevel, CLR_NAVIGATION_DIRECTIVES, ClrNavigationModule, ClrTabs, ClrTab, ClrTabContent, ClrTabOverflowContent, ClrTabLink, CLR_TABS_DIRECTIVES, ClrTabsModule, ClrVerticalNavGroupChildren, ClrVerticalNavGroup, ClrVerticalNav, ClrVerticalNavLink, ClrVerticalNavIcon, CLR_VERTICAL_NAV_DIRECTIVES, ClrVerticalNavModule, ClrModal, CLR_MODAL_DIRECTIVES, ClrModalModule, ClrDropdown, ClrDropdownMenu, ClrDropdownTrigger, ClrDropdownItem, CLR_MENU_POSITIONS, CLR_DROPDOWN_DIRECTIVES, ClrDropdownModule, ClrPopoverModule, ClrSignpost, ClrSignpostContent, ClrSignpostTrigger, CLR_SIGNPOST_DIRECTIVES, ClrSignpostModule, ClrTooltip, ClrTooltipTrigger, ClrTooltipContent, CLR_TOOLTIP_DIRECTIVES, ClrTooltipModule, collapse, fade, fadeSlide, slide, ClrLoadingState, ClrLoading, LoadingListener, CLR_LOADING_DIRECTIVES, ClrLoadingModule, CONDITIONAL_DIRECTIVES, ClrIfActive, ClrIfOpen, EXPAND_DIRECTIVES, ClrIfExpanded, ClrCommonStrings, ClrDraggable, ClrDroppable, ClrIfDragged, ClrDragHandle, ClrDraggableGhost, ClrDragEvent, CLR_DRAG_AND_DROP_DIRECTIVES, ClrDragAndDropModule, ClrWizard, ClrWizardPage, ClrWizardStepnav, ClrWizardStepnavItem, DEFAULT_BUTTON_TYPES, CUSTOM_BUTTON_TYPES, ClrWizardButton, ClrWizardHeaderAction, ClrWizardCustomTags, ClrWizardPageTitle, ClrWizardPageNavTitle, ClrWizardPageButtons, ClrWizardPageHeaderActions, CLR_WIZARD_DIRECTIVES, ClrWizardModule, ButtonInGroupService as ɵdm, DatagridRowExpandAnimation as ɵdb, ActionableOompaLoompa as ɵcy, DatagridWillyWonka as ɵcw, ExpandableOompaLoompa as ɵda, ClrDatagridColumnToggleButton as ɵci, ClrDatagridColumnToggleTitle as ɵch, DatagridDetailRegisterer as ɵck, ClrDatagridItemsTrackBy as ɵcj, ClrDatagridPageSize as ɵcl, ColumnToggleButtonsService as ɵca, CustomFilter as ɵcf, DisplayModeService as ɵcc, DragDispatcher as ɵce, FiltersProvider as ɵbr, ExpandableRowsCount as ɵbx, HideableColumnService as ɵby, Items as ɵbq, Page as ɵbs, RowActionService as ɵbw, Selection as ɵbp, Sort as ɵbu, StateDebouncer as ɵbt, StateProvider as ɵbz, TableSizeService as ɵcb, DatagridCellRenderer as ɵcv, DatagridColumnResizer as ɵct, DatagridHeaderRenderer as ɵcs, DatagridMainRenderer as ɵcq, domAdapterFactory as ɵcp, DatagridRenderOrganizer as ɵbv, DatagridRowRenderer as ɵcu, DatagridFilterRegistrar as ɵcd, WrappedCell as ɵcm, WrappedColumn as ɵcn, WrappedRow as ɵco, StackControl as ɵdd, RecursiveChildren as ɵdk, TREE_FEATURES_PROVIDER as ɵdg, TreeFeaturesService as ɵde, treeFeaturesFactory as ɵdf, AlertIconAndTypesService as ɵo, MultiAlertService as ɵp, IfErrorService as ɵt, ControlClassService as ɵba, ControlIdService as ɵq, FocusService as ɵbh, LayoutService as ɵr, MarkControlService as ɵu, IS_NEW_FORMS_LAYOUT as ɵv, IS_NEW_FORMS_LAYOUT_TRUE_PROVIDER as ɵw, NgControlService as ɵs, WrappedFormControl as ɵz, DateFormControlService as ɵbf, DateIOService as ɵbi, DateNavigationService as ɵbe, DatepickerEnabledService as ɵbj, DatepickerFocusService as ɵbl, LocaleHelperService as ɵbg, ViewManagerService as ɵbk, ResponsiveNavigationService as ɵdn, ActiveOompaLoompa as ɵdx, TabsWillyWonka as ɵdw, AriaService as ɵdr, TabsService as ɵdv, TABS_ID as ɵds, TABS_ID_PROVIDER as ɵdu, tokenFactory$1 as ɵdt, VerticalNavGroupRegistrationService as ɵea, VerticalNavGroupService as ɵeb, VerticalNavIconService as ɵdz, VerticalNavService as ɵdy, AbstractPopover as ɵi, POPOVER_DIRECTIVES as ɵb, POPOVER_HOST_ANCHOR as ɵh, PopoverDirectiveOld as ɵc, ClrCommonPopoverModule as ɵa, ROOT_DROPDOWN_PROVIDER as ɵg, RootDropdownService as ɵe, clrRootDropdownFactory as ɵf, OompaLoompa as ɵcz, WillyWonka as ɵcx, ClrConditionalModule as ɵj, IF_ACTIVE_ID as ɵk, IF_ACTIVE_ID_PROVIDER as ɵm, IfActiveService as ɵn, tokenFactory as ɵl, IfOpenService as ɵd, DomAdapter as ɵcr, DragAndDropEventBusService as ɵeh, DragEventListenerService as ɵeg, DragHandleRegistrarService as ɵei, DraggableSnapshotService as ɵej, GlobalDragModeService as ɵek, ClrIfExpandModule as ɵdc, Expand as ɵcg, FocusTrapDirective as ɵbd, ClrFocusTrapModule as ɵbb, FOCUS_TRAP_DIRECTIVES as ɵbc, EmptyAnchor as ɵy, ClrHostWrappingModule as ɵx, UNIQUE_ID as ɵdh, UNIQUE_ID_PROVIDER as ɵdj, uniqueIdFactory as ɵdi, OUSTIDE_CLICK_DIRECTIVES as ɵbn, OutsideClick as ɵbo, ClrOutsideClickModule as ɵbm, ScrollingService as ɵdl, TEMPLATE_REF_DIRECTIVES as ɵdp, TemplateRefContainer as ɵdq, ClrTemplateRefModule as ɵdo, ButtonHubService as ɵee, HeaderActionService as ɵef, PageCollectionService as ɵed, WizardNavigationService as ɵec };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xyLWFuZ3VsYXIuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BjbHIvYW5ndWxhci9pY29uL2ljb24udHMiLCJuZzovL0BjbHIvYW5ndWxhci9pY29uL2ljb24ubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvcG9wb3Zlci9jb21tb24vcG9wb3Zlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvY29tbW9uL3BvcG92ZXItb2xkLmRpcmVjdGl2ZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvY29tbW9uL2luZGV4LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvcG9wb3Zlci9jb21tb24vcG9wb3Zlci5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9sb2FkaW5nL2xvYWRpbmctbGlzdGVuZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9sb2FkaW5nL2xvYWRpbmcudHMiLCJuZzovL0BjbHIvYW5ndWxhci9idXR0b24vcHJvdmlkZXJzL2J1dHRvbi1pbi1ncm91cC5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvYnV0dG9uL2J1dHRvbi1ncm91cC9idXR0b24udHMiLCJuZzovL0BjbHIvYW5ndWxhci9wb3BvdmVyL2Ryb3Bkb3duL21lbnUtcG9zaXRpb25zLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9idXR0b24vYnV0dG9uLWdyb3VwL2J1dHRvbi1ncm91cC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2J1dHRvbi9idXR0b24tZ3JvdXAvYnV0dG9uLWdyb3VwLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2J1dHRvbi9idXR0b24tbG9hZGluZy9sb2FkaW5nLWJ1dHRvbi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2J1dHRvbi9idXR0b24tbG9hZGluZy9sb2FkaW5nLWJ1dHRvbi5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci9idXR0b24vYnV0dG9uLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2hvc3Qtd3JhcHBpbmcvZW1wdHktYW5jaG9yLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvaG9zdC13cmFwcGluZy9ob3N0LXdyYXBwaW5nLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NvbW1vbi9lcnJvci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NvbW1vbi9oZWxwZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9jb21tb24vcHJvdmlkZXJzL25nLWNvbnRyb2wuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NvbW1vbi9pZi1lcnJvci9pZi1lcnJvci5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY29tbW9uL2lmLWVycm9yL2lmLWVycm9yLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY29tbW9uL3Byb3ZpZGVycy9jb250cm9sLWlkLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9jb21tb24vcHJvdmlkZXJzL2xheW91dC5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY29tbW9uL2xhYmVsLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY29tbW9uL3Byb3ZpZGVycy9uZXctZm9ybXMuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NvbW1vbi9wcm92aWRlcnMvbWFyay1jb250cm9sLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9jb21tb24vZm9ybS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NvbW1vbi9sYXlvdXQudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9jb21tb24vY29tbW9uLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NoZWNrYm94L2NoZWNrYm94LXdyYXBwZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9ob3N0LXdyYXBwaW5nL2hvc3Qtd3JhcHBlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1jbGFzcy5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY29tbW9uL3dyYXBwZWQtY29udHJvbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2NoZWNrYm94L2NoZWNrYm94LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY2hlY2tib3gvY2hlY2tib3gtY29udGFpbmVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY2hlY2tib3gvY2hlY2tib3gubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvY29uZGl0aW9uYWwvaWYtYWN0aXZlLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9jb25kaXRpb25hbC9pZi1hY3RpdmUuZGlyZWN0aXZlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvY29uZGl0aW9uYWwvaWYtb3Blbi5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvY29uZGl0aW9uYWwvaWYtb3Blbi5kaXJlY3RpdmUudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9jb25kaXRpb25hbC9pbmRleC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2NvbmRpdGlvbmFsL2NvbmRpdGlvbmFsLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC10cmFja2VyLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9mb2N1cy10cmFwL2ZvY3VzLXRyYXAuZGlyZWN0aXZlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZm9jdXMtdHJhcC9pbmRleC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9rZXktY29kZXMva2V5LWNvZGVzLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci91dGlscy9jb25zdGFudHMudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9kYXRlcGlja2VyL3V0aWxzL2RhdGUtdXRpbHMudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9kYXRlcGlja2VyL21vZGVsL2RheS12aWV3Lm1vZGVsLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9tb2RlbC9jYWxlbmRhci5tb2RlbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2RhdGVwaWNrZXIvbW9kZWwvZGF5Lm1vZGVsLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9tb2RlbC9jYWxlbmRhci12aWV3Lm1vZGVsLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9wcm92aWRlcnMvZGF0ZS1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9kYXRlcGlja2VyL3Byb3ZpZGVycy9kYXRlcGlja2VyLWZvY3VzLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9kYXRlcGlja2VyL3Byb3ZpZGVycy9sb2NhbGUtaGVscGVyLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9kYXRlcGlja2VyL2NhbGVuZGFyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvY29tbW9uL3Byb3ZpZGVycy9mb2N1cy5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9wcm92aWRlcnMvZGF0ZS1mb3JtLWNvbnRyb2wuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2RhdGVwaWNrZXIvcHJvdmlkZXJzL2RhdGUtaW8uc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2JyZWFrcG9pbnRzL2JyZWFrcG9pbnRzLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9wcm92aWRlcnMvZGF0ZXBpY2tlci1lbmFibGVkLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9kYXRlcGlja2VyL2RhdGUtY29udGFpbmVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9kYXRlLWlucHV0LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvcG9wb3Zlci9jb21tb24vYWJzdHJhY3QtcG9wb3Zlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2RhdGVwaWNrZXIvcHJvdmlkZXJzL3ZpZXctbWFuYWdlci5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLXZpZXctbWFuYWdlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2RhdGVwaWNrZXIvZGF5LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9kYXlwaWNrZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9kYXRlcGlja2VyL21vbnRocGlja2VyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9tb2RlbC95ZWFyLXJhbmdlLm1vZGVsLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci95ZWFycGlja2VyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2lucHV0L2lucHV0LWNvbnRhaW5lci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL2lucHV0L2lucHV0LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvaW5wdXQvaW5wdXQubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvcGFzc3dvcmQvcGFzc3dvcmQtY29udGFpbmVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvcGFzc3dvcmQvcGFzc3dvcmQudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9wYXNzd29yZC9wYXNzd29yZC5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9yYWRpby9yYWRpby13cmFwcGVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvcmFkaW8vcmFkaW8udHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9yYWRpby9yYWRpby1jb250YWluZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9yYWRpby9yYWRpby5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9zZWxlY3Qvc2VsZWN0LWNvbnRhaW5lci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL3NlbGVjdC9zZWxlY3QudHMiLCJuZzovL0BjbHIvYW5ndWxhci9mb3Jtcy9zZWxlY3Qvc2VsZWN0Lm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL3RleHRhcmVhL3RleHRhcmVhLWNvbnRhaW5lci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zL3RleHRhcmVhL3RleHRhcmVhLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvdGV4dGFyZWEvdGV4dGFyZWEubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMvZm9ybXMubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZXhwYW5kL3Byb3ZpZGVycy9leHBhbmQudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9leHBhbmQvaWYtZXhwYW5kZWQudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9leHBhbmQvaW5kZXgudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9leHBhbmQvaWYtZXhwYW5kLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2xvYWRpbmcvbG9hZGluZy5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9vdXRzaWRlLWNsaWNrL291dHNpZGUtY2xpY2sudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9vdXRzaWRlLWNsaWNrL2luZGV4LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvb3V0c2lkZS1jbGljay9vdXRzaWRlLWNsaWNrLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2RvbS1hZGFwdGVyL2RvbS1hZGFwdGVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9hbmltYXRpb24taGFjay9yb3ctZXhwYW5kLWFuaW1hdGlvbi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvcHJvdmlkZXJzL2N1c3RvbS1maWx0ZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3Byb3ZpZGVycy9zdGF0ZS1kZWJvdW5jZXIucHJvdmlkZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3Byb3ZpZGVycy9wYWdlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9wcm92aWRlcnMvZmlsdGVycy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvdXRpbHMvZGF0YWdyaWQtZmlsdGVyLXJlZ2lzdHJhci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtZmlsdGVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9idWlsdC1pbi9maWx0ZXJzL2RhdGFncmlkLXN0cmluZy1maWx0ZXItaW1wbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvYnVpbHQtaW4vZmlsdGVycy9kYXRhZ3JpZC1zdHJpbmctZmlsdGVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvY2hvY29sYXRlL29vbXBhLWxvb21wYS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvcHJvdmlkZXJzL3Jvdy1hY3Rpb24tc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2Nob2NvbGF0ZS93aWxseS13b25rYS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvY2hvY29sYXRlL2RhdGFncmlkLXdpbGx5LXdvbmthLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9jaG9jb2xhdGUvYWN0aW9uYWJsZS1vb21wYS1sb29tcGEudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3Byb3ZpZGVycy9nbG9iYWwtZXhwYW5kYWJsZS1yb3dzLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9jaG9jb2xhdGUvZXhwYW5kYWJsZS1vb21wYS1sb29tcGEudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL2J1aWx0LWluL25lc3RlZC1wcm9wZXJ0eS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvYnVpbHQtaW4vY29tcGFyYXRvcnMvZGF0YWdyaWQtcHJvcGVydHktY29tcGFyYXRvci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvYnVpbHQtaW4vZmlsdGVycy9kYXRhZ3JpZC1wcm9wZXJ0eS1zdHJpbmctZmlsdGVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9lbnVtcy9zb3J0LW9yZGVyLmVudW0udHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3Byb3ZpZGVycy9kcmFnLWRpc3BhdGNoZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3Byb3ZpZGVycy9zb3J0LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC93cmFwcGVkLWNvbHVtbi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtY29sdW1uLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9wcm92aWRlcnMvaXRlbXMudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL2RhdGFncmlkLWl0ZW1zLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9kYXRhZ3JpZC1wbGFjZWhvbGRlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvY29tbW9uL3BvcG92ZXItaG9zdC1hbmNob3IudG9rZW4udHMiLCJuZzovL0BjbHIvYW5ndWxhci9wb3BvdmVyL3NpZ25wb3N0L3NpZ25wb3N0LXRyaWdnZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9wb3BvdmVyL3NpZ25wb3N0L3NpZ25wb3N0LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9wcm92aWRlcnMvaGlkZWFibGUtY29sdW1uLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3dyYXBwZWQtY2VsbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtY2VsbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZW51bXMvZGlzcGxheS1tb2RlLmVudW0udHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL2VudW1zL3JlbmRlci1zdGVwLmVudW0udHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3JlbmRlci9yZW5kZXItb3JnYW5pemVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9wcm92aWRlcnMvZGlzcGxheS1tb2RlLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3Byb3ZpZGVycy9zZWxlY3Rpb24udHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3dyYXBwZWQtcm93LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9kYXRhZ3JpZC1yb3cudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3Byb3ZpZGVycy9jb2x1bW4tdG9nZ2xlLWJ1dHRvbnMuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvcHJvdmlkZXJzL3N0YXRlLnByb3ZpZGVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9wcm92aWRlcnMvdGFibGUtc2l6ZS5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9kYXRhZ3JpZC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtYWN0aW9uLWJhci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtYWN0aW9uLW92ZXJmbG93LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9kYXRhZ3JpZC1jb2x1bW4tdG9nZ2xlLWJ1dHRvbi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtY29sdW1uLXRvZ2dsZS10aXRsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtY29sdW1uLXRvZ2dsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtZGV0YWlsLXJlZ2lzdGVyZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL2RhdGFncmlkLWZvb3Rlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtaGlkZWFibGUtY29sdW1uLm1vZGVsLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9kYXRhZ3JpZC1oaWRlYWJsZS1jb2x1bW4udHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL2RhdGFncmlkLWl0ZW1zLXRyYWNrYnkudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL2RhdGFncmlkLXBhZ2Utc2l6ZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtcGFnaW5hdGlvbi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvZGF0YWdyaWQtcm93LWRldGFpbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvcmVuZGVyL2NvbnN0YW50cy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvcmVuZGVyL2NlbGwtcmVuZGVyZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3JlbmRlci9jb2x1bW4tcmVzaXplci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvcmVuZGVyL2hlYWRlci1yZW5kZXJlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YWdyaWQvcmVuZGVyL25vb3AtZG9tLWFkYXB0ZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL2RhdGFncmlkL3JlbmRlci9tYWluLXJlbmRlcmVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9yZW5kZXIvcm93LXJlbmRlcmVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS9kYXRhZ3JpZC9kYXRhZ3JpZC5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3N0YWNrLXZpZXcvc3RhY2stYmxvY2sudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3N0YWNrLXZpZXcvc3RhY2stdmlldy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvc3RhY2stdmlldy9zdGFjay1oZWFkZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3N0YWNrLXZpZXcvc3RhY2stY29udHJvbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvc3RhY2stdmlldy9zdGFjay1pbnB1dC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvc3RhY2stdmlldy9zdGFjay1zZWxlY3QudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3N0YWNrLXZpZXcvc3RhY2stdmlldy1jdXN0b20tdGFncy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvc3RhY2stdmlldy9zdGFjay12aWV3Lm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2lkLWdlbmVyYXRvci9pZC1nZW5lcmF0b3Iuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvdHJlZS12aWV3L21vZGVscy9zZWxlY3RlZC1zdGF0ZS5lbnVtLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS90cmVlLXZpZXcvbW9kZWxzL3RyZWUtbm9kZS5tb2RlbC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvdHJlZS12aWV3L21vZGVscy9kZWNsYXJhdGl2ZS10cmVlLW5vZGUubW9kZWwudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3RyZWUtdmlldy90cmVlLWZlYXR1cmVzLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3RyZWUtdmlldy90cmVlLW5vZGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3RyZWUtdmlldy90cmVlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS90cmVlLXZpZXcvbW9kZWxzL2FzeW5jLWFycmF5LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS90cmVlLXZpZXcvbW9kZWxzL3JlY3Vyc2l2ZS10cmVlLW5vZGUubW9kZWwudHMiLCJuZzovL0BjbHIvYW5ndWxhci9kYXRhL3RyZWUtdmlldy9yZWN1cnNpdmUtZm9yLW9mLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS90cmVlLXZpZXcvcmVjdXJzaXZlLWNoaWxkcmVuLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZGF0YS90cmVlLXZpZXcvdHJlZS12aWV3Lm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2RhdGEvZGF0YS5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9kcmFnLWFuZC1kcm9wL2RyYWctZXZlbnQudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9kcmFnLWFuZC1kcm9wL2ludGVyZmFjZXMvZHJhZy1ldmVudC5pbnRlcmZhY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9kcmFnLWFuZC1kcm9wL3Byb3ZpZGVycy9kcmFnLWFuZC1kcm9wLWV2ZW50LWJ1cy5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZHJhZy1hbmQtZHJvcC9wcm92aWRlcnMvZHJhZy1ldmVudC1saXN0ZW5lci5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZHJhZy1hbmQtZHJvcC9wcm92aWRlcnMvZHJhZ2dhYmxlLXNuYXBzaG90LnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9kcmFnLWFuZC1kcm9wL2RyYWdnYWJsZS1naG9zdC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2RyYWctYW5kLWRyb3AvaWYtZHJhZ2dlZC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2RyYWctYW5kLWRyb3AvcHJvdmlkZXJzL2RyYWctaGFuZGxlLXJlZ2lzdHJhci5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZHJhZy1hbmQtZHJvcC9wcm92aWRlcnMvZ2xvYmFsLWRyYWctbW9kZS5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZHJhZy1hbmQtZHJvcC9kcmFnZ2FibGUvZHJhZ2dhYmxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZHJhZy1hbmQtZHJvcC9kcm9wcGFibGUvZHJvcHBhYmxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvZHJhZy1hbmQtZHJvcC9kcmFnLWhhbmRsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2RyYWctYW5kLWRyb3AvZHJhZy1hbmQtZHJvcC5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci9wb3BvdmVyL2Ryb3Bkb3duL3Byb3ZpZGVycy9kcm9wZG93bi5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvcG9wb3Zlci9kcm9wZG93bi9kcm9wZG93bi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvZHJvcGRvd24vZHJvcGRvd24taXRlbS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvZHJvcGRvd24vZHJvcGRvd24tbWVudS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvZHJvcGRvd24vZHJvcGRvd24tdHJpZ2dlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvZHJvcGRvd24vZHJvcGRvd24ubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZW1waGFzaXMvYWxlcnQvdXRpbHMvYWxlcnQtdHlwZXMudHMiLCJuZzovL0BjbHIvYW5ndWxhci9lbXBoYXNpcy9hbGVydC9wcm92aWRlcnMvaWNvbi1hbmQtdHlwZXMuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2VtcGhhc2lzL2FsZXJ0L3Byb3ZpZGVycy9tdWx0aS1hbGVydC5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZW1waGFzaXMvYWxlcnQvYWxlcnQudHMiLCJuZzovL0BjbHIvYW5ndWxhci9lbXBoYXNpcy9hbGVydC9hbGVydC1pdGVtLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZW1waGFzaXMvYWxlcnQvYWxlcnRzLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZW1waGFzaXMvYWxlcnQvYWxlcnRzLXBhZ2VyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZW1waGFzaXMvYWxlcnQvYWxlcnQubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZW1waGFzaXMvZW1waGFzaXMubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L25hdi9yZXNwb25zaXZlLW5hdi1jb2Rlcy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC9uYXYvcmVzcG9uc2l2ZS1uYXYtY29udHJvbC1tZXNzYWdlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L25hdi9wcm92aWRlcnMvcmVzcG9uc2l2ZS1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci9sYXlvdXQvbWFpbi1jb250YWluZXIvbWFpbi1jb250YWluZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci9sYXlvdXQvbWFpbi1jb250YWluZXIvbWFpbi1jb250YWluZXIubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L25hdi9jaG9jb2xhdGUvbWFpbi1jb250YWluZXItd2lsbHktd29ua2EudHMiLCJuZzovL0BjbHIvYW5ndWxhci9sYXlvdXQvbmF2L2Nob2NvbGF0ZS9uYXYtZGV0ZWN0aW9uLW9vbXBhLWxvb21wYS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC9uYXYvaGVhZGVyLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L25hdi9uYXYtbGV2ZWwudHMiLCJuZzovL0BjbHIvYW5ndWxhci9sYXlvdXQvbmF2L25hdmlnYXRpb24ubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvdGVtcGxhdGUtcmVmL3RlbXBsYXRlLXJlZi1jb250YWluZXIudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy90ZW1wbGF0ZS1yZWYvaW5kZXgudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy90ZW1wbGF0ZS1yZWYvdGVtcGxhdGUtcmVmLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC90YWJzL2Nob2NvbGF0ZS90YWJzLXdpbGx5LXdvbmthLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3RhYnMvY2hvY29sYXRlL2FjdGl2ZS1vb21wYS1sb29tcGEudHMiLCJuZzovL0BjbHIvYW5ndWxhci9sYXlvdXQvdGFicy9wcm92aWRlcnMvYXJpYS5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3RhYnMvcHJvdmlkZXJzL3RhYnMuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC90YWJzL3RhYi1jb250ZW50LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3RhYnMvdGFicy1pZC5wcm92aWRlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC90YWJzL3RhYi1saW5rLmRpcmVjdGl2ZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC90YWJzL3RhYi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC90YWJzL3RhYi1vdmVyZmxvdy1jb250ZW50LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3RhYnMvdGFicy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC90YWJzL3RhYnMubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3ZlcnRpY2FsLW5hdi9wcm92aWRlcnMvdmVydGljYWwtbmF2LWdyb3VwLXJlZ2lzdHJhdGlvbi5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3ZlcnRpY2FsLW5hdi9wcm92aWRlcnMvdmVydGljYWwtbmF2LWljb24uc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC92ZXJ0aWNhbC1uYXYvcHJvdmlkZXJzL3ZlcnRpY2FsLW5hdi5zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3ZlcnRpY2FsLW5hdi92ZXJ0aWNhbC1uYXYudHMiLCJuZzovL0BjbHIvYW5ndWxhci9sYXlvdXQvdmVydGljYWwtbmF2L3Byb3ZpZGVycy92ZXJ0aWNhbC1uYXYtZ3JvdXAuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC92ZXJ0aWNhbC1uYXYvdmVydGljYWwtbmF2LWdyb3VwLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3ZlcnRpY2FsLW5hdi92ZXJ0aWNhbC1uYXYtZ3JvdXAtY2hpbGRyZW4udHMiLCJuZzovL0BjbHIvYW5ndWxhci9sYXlvdXQvdmVydGljYWwtbmF2L3ZlcnRpY2FsLW5hdi1pY29uLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbGF5b3V0L3ZlcnRpY2FsLW5hdi92ZXJ0aWNhbC1uYXYtbGluay50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC92ZXJ0aWNhbC1uYXYvdmVydGljYWwtbmF2Lm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2xheW91dC9sYXlvdXQubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvc2Nyb2xsaW5nL3Njcm9sbGluZy1zZXJ2aWNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvbW9kYWwvbW9kYWwudHMiLCJuZzovL0BjbHIvYW5ndWxhci9tb2RhbC9tb2RhbC5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci9wb3BvdmVyL3NpZ25wb3N0L3NpZ25wb3N0LXBvc2l0aW9ucy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvc2lnbnBvc3Qvc2lnbnBvc3QtY29udGVudC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvc2lnbnBvc3Qvc2lnbnBvc3QubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvcG9wb3Zlci90b29sdGlwL3Rvb2x0aXAudHMiLCJuZzovL0BjbHIvYW5ndWxhci9wb3BvdmVyL3Rvb2x0aXAvdG9vbHRpcC1jb250ZW50LnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvcG9wb3Zlci90b29sdGlwL3Rvb2x0aXAtdHJpZ2dlci50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvdG9vbHRpcC90b29sdGlwLm1vZHVsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3BvcG92ZXIvcG9wb3Zlci5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvcHJvdmlkZXJzL2J1dHRvbi1odWIuc2VydmljZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC9wcm92aWRlcnMvcGFnZS1jb2xsZWN0aW9uLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvcHJvdmlkZXJzL3dpemFyZC1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvcHJvdmlkZXJzL2hlYWRlci1hY3Rpb25zLnNlcnZpY2UudHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvd2l6YXJkLWhlYWRlci1hY3Rpb24udHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvd2l6YXJkLXBhZ2UtYnV0dG9ucy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC93aXphcmQtcGFnZS1oZWFkZXItYWN0aW9ucy50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC93aXphcmQtcGFnZS1uYXZ0aXRsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC93aXphcmQtcGFnZS10aXRsZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC93aXphcmQtcGFnZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC93aXphcmQudHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvd2l6YXJkLWJ1dHRvbi50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC93aXphcmQtY3VzdG9tLXRhZ3MudHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvd2l6YXJkLXN0ZXBuYXYudHMiLCJuZzovL0BjbHIvYW5ndWxhci93aXphcmQvd2l6YXJkLXN0ZXBuYXYtaXRlbS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3dpemFyZC93aXphcmQubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvY2xyLWFuZ3VsYXIubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMtZGVwcmVjYXRlZC9jaGVja2JveC9jaGVja2JveC50cyIsIm5nOi8vQGNsci9hbmd1bGFyL2Zvcm1zLWRlcHJlY2F0ZWQvY2hlY2tib3gvY2hlY2tib3gubW9kdWxlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvZm9ybXMtZGVwcmVjYXRlZC9mb3Jtcy5tb2R1bGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9hbmltYXRpb25zL2NvbGxhcHNlL2NvbGxhcHNlLnRzIiwibmc6Ly9AY2xyL2FuZ3VsYXIvdXRpbHMvYW5pbWF0aW9ucy9mYWRlL2ZhZGUudHMiLCJuZzovL0BjbHIvYW5ndWxhci91dGlscy9hbmltYXRpb25zL2ZhZGUtc2xpZGUvZmFkZS1zbGlkZS50cyIsIm5nOi8vQGNsci9hbmd1bGFyL3V0aWxzL2FuaW1hdGlvbnMvc2xpZGUvc2xpZGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ2Nsci1pY29uJyB9KVxuZXhwb3J0IGNsYXNzIENsckljb25DdXN0b21UYWcge1xuICAvLyBObyBiZWhhdmlvclxuICAvLyBUaGUgb25seSBwdXJwb3NlIGlzIHRvIFwiZGVjbGFyZVwiIHRoZSB0YWcgaW4gQW5ndWxhclxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsckljb25DdXN0b21UYWcgfSBmcm9tICcuL2ljb24nO1xuXG5leHBvcnQgY29uc3QgQ0xSX0lDT05fRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xySWNvbkN1c3RvbVRhZ107XG5cbkBOZ01vZHVsZSh7IGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLCBkZWNsYXJhdGlvbnM6IFtDTFJfSUNPTl9ESVJFQ1RJVkVTXSwgZXhwb3J0czogW0NMUl9JQ09OX0RJUkVDVElWRVNdIH0pXG5leHBvcnQgY2xhc3MgQ2xySWNvbk1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG4vKlxuICogRG8gTk9UIEFuZ3VsYXIgdGhpcyB1cC4gSXQgYXNzdW1lcyB3ZSdyZSBpbiB0aGUgRE9NLCBwbGF5cyB3aXRoIG5hdGl2ZSBlbGVtZW50cywgLi4uXG4gKiBJdCBjb3VsZCBwb3RlbnRpYWxseSBiZSB1c2VkIGFzIHBhcnQgb2YgQGNsci91aSBhcyBhIHZhbmlsbGEgSmF2YXNjcmlwdCBoZWxwZXIuXG4gKi9cblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9wb3Zlck9wdGlvbnMgfSBmcm9tICcuL3BvcG92ZXItb3B0aW9ucy5pbnRlcmZhY2UnO1xuZXhwb3J0IGVudW0gUG9pbnQge1xuICBSSUdIVF9DRU5URVIsXG4gIFJJR0hUX1RPUCxcbiAgUklHSFRfQk9UVE9NLFxuICBUT1BfQ0VOVEVSLFxuICBUT1BfUklHSFQsXG4gIFRPUF9MRUZULFxuICBCT1RUT01fQ0VOVEVSLFxuICBCT1RUT01fUklHSFQsXG4gIEJPVFRPTV9MRUZULFxuICBMRUZUX0NFTlRFUixcbiAgTEVGVF9UT1AsXG4gIExFRlRfQk9UVE9NLFxufVxuXG5jb25zdCBQT1NJVElPTl9SRUxBVElWRSA9ICdyZWxhdGl2ZSc7XG5jb25zdCBQT1NJVElPTl9BQlNPTFVURSA9ICdhYnNvbHV0ZSc7XG5jb25zdCBQT1NJVElPTl9GSVhFRCA9ICdmaXhlZCc7XG5cbmNvbnN0IE9WRVJGTE9XX1NDUk9MTCA9ICdzY3JvbGwnO1xuY29uc3QgT1ZFUkZMT1dfQVVUTyA9ICdhdXRvJztcblxuZXhwb3J0IGNsYXNzIFBvcG92ZXIge1xuICBwcml2YXRlIF9zY3JvbGw6IFN1YmplY3Q8dm9pZD47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBhbnkpIHtcbiAgICAvLyBCcm93c2VycyBkb24ndCBhZ3JlZSB3aXRoIHdoYXQgdG8gZG8gaWYgc29tZSBvZiB0aGVzZSBhcmUgbm90IHNwZWNpZmllZCwgc28gd2Ugc2V0IHRoZW0gYWxsIHRvIGJlIHNhZmUuXG4gICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFBPU0lUSU9OX0FCU09MVVRFO1xuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gMDtcbiAgICBlbGVtZW50LnN0eWxlLmJvdHRvbSA9ICdhdXRvJztcbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAwO1xuICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnYXV0byc7XG4gIH1cblxuICAvLyBUT0RPOiBuZWVkIGEgd2F5IHRvIGFjY291bnQgZm9yIHBhcmFtZXRlcnMgdGhhdCBjaGFuZ2UgZHluYW1pY2FsbHkgKHBvc2l0aW9uaW5nKS5cbiAgcHVibGljIGFuY2hvcihcbiAgICBhbmNob3I6IGFueSxcbiAgICBhbmNob3JBbGlnbjogUG9pbnQsXG4gICAgcG9wb3ZlckFsaWduOiBQb2ludCxcbiAgICB7IG9mZnNldFggPSAwLCBvZmZzZXRZID0gMCwgdXNlQW5jaG9yUGFyZW50ID0gZmFsc2UgfTogUG9wb3Zlck9wdGlvbnMgPSB7fVxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIC8vIFRPRE86IHdlIGFyZSBhc3N1bWluZyBoZXJlIHRoYXQgdGhlIHBvcG92ZXIgaXMgaW5zaWRlIG9yIG5leHQgdG8gdGhlIGFuY2hvci5cbiAgICAvLyBXZSdkIG5lZWQgdG8gZ28gdXAgdGhlIHBvcG92ZXIgdHJlZSB0b28gb3RoZXJ3aXNlXG5cbiAgICB0aGlzLmFkZFNjcm9sbEV2ZW50TGlzdGVuZXJzKGFuY2hvcik7XG4gICAgaWYgKHVzZUFuY2hvclBhcmVudCkge1xuICAgICAgYW5jaG9yID0gYW5jaG9yLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIC8vIGV4cGxpY2l0bHkgb3ZlcnJpZGUgYW5jaG9yJ3Mgc3R5bGUgdG8gc3RhdGljXG4gICAgYW5jaG9yLnN0eWxlLnBvc2l0aW9uID0gJ3N0YXRpYyc7XG5cbiAgICBjb25zdCBhbmNob3JSZWN0ID0gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBvcG92ZXJSZWN0ID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gcG9zaXRpb24gb2YgbGVmdCB0b3AgY29ybmVyIG9mIGFuY2hvciArIHRoZSBvZmZzZXRcbiAgICBsZXQgbGVmdERpZmY6IG51bWJlciA9IGFuY2hvclJlY3QubGVmdCAtIHBvcG92ZXJSZWN0LmxlZnQgKyBvZmZzZXRYO1xuICAgIGxldCB0b3BEaWZmOiBudW1iZXIgPSBhbmNob3JSZWN0LnRvcCAtIHBvcG92ZXJSZWN0LnRvcCArIG9mZnNldFk7XG5cbiAgICAvLyBmaXJzdCwgYWRqdXN0IHBvc2l0aW9uaW5nIGJhc2VkIG9uIGFuY2hvcidzIGFsaWduIHBvaW50XG4gICAgc3dpdGNoIChhbmNob3JBbGlnbikge1xuICAgICAgY2FzZSBQb2ludC5MRUZUX1RPUDpcbiAgICAgIGNhc2UgUG9pbnQuVE9QX0xFRlQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5UT1BfQ0VOVEVSOlxuICAgICAgICBsZWZ0RGlmZiArPSBhbmNob3JSZWN0LndpZHRoIC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LlRPUF9SSUdIVDpcbiAgICAgICAgbGVmdERpZmYgKz0gYW5jaG9yUmVjdC53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LlJJR0hUX1RPUDpcbiAgICAgICAgbGVmdERpZmYgKz0gYW5jaG9yUmVjdC53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LkxFRlRfQk9UVE9NOlxuICAgICAgICB0b3BEaWZmICs9IGFuY2hvclJlY3QuaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUG9pbnQuQk9UVE9NX0xFRlQ6XG4gICAgICAgIHRvcERpZmYgKz0gYW5jaG9yUmVjdC5oZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5CT1RUT01fQ0VOVEVSOlxuICAgICAgICB0b3BEaWZmICs9IGFuY2hvclJlY3QuaGVpZ2h0O1xuICAgICAgICBsZWZ0RGlmZiArPSBhbmNob3JSZWN0LndpZHRoIC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LkJPVFRPTV9SSUdIVDpcbiAgICAgICAgdG9wRGlmZiArPSBhbmNob3JSZWN0LmhlaWdodDtcbiAgICAgICAgbGVmdERpZmYgKz0gYW5jaG9yUmVjdC53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LlJJR0hUX0JPVFRPTTpcbiAgICAgICAgdG9wRGlmZiArPSBhbmNob3JSZWN0LmhlaWdodDtcbiAgICAgICAgbGVmdERpZmYgKz0gYW5jaG9yUmVjdC53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LkxFRlRfQ0VOVEVSOlxuICAgICAgICB0b3BEaWZmICs9IGFuY2hvclJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LlJJR0hUX0NFTlRFUjpcbiAgICAgICAgdG9wRGlmZiArPSBhbmNob3JSZWN0LmhlaWdodCAvIDI7XG4gICAgICAgIGxlZnREaWZmICs9IGFuY2hvclJlY3Qud2lkdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICB9XG5cbiAgICAvLyBzZWNvbmQsIGFkanVzdCBwb3NpdGlvbmluZyBiYXNlZCBvbiBwb3BvdmVyJ3MgYWxpZ24gcG9pbnRcbiAgICBzd2l0Y2ggKHBvcG92ZXJBbGlnbikge1xuICAgICAgY2FzZSBQb2ludC5MRUZUX1RPUDpcbiAgICAgIGNhc2UgUG9pbnQuVE9QX0xFRlQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5UT1BfQ0VOVEVSOlxuICAgICAgICBsZWZ0RGlmZiAtPSBwb3BvdmVyUmVjdC53aWR0aCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5UT1BfUklHSFQ6XG4gICAgICAgIGxlZnREaWZmIC09IHBvcG92ZXJSZWN0LndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUG9pbnQuUklHSFRfVE9QOlxuICAgICAgICBsZWZ0RGlmZiAtPSBwb3BvdmVyUmVjdC53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LkxFRlRfQk9UVE9NOlxuICAgICAgICB0b3BEaWZmIC09IHBvcG92ZXJSZWN0LmhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LkJPVFRPTV9MRUZUOlxuICAgICAgICB0b3BEaWZmIC09IHBvcG92ZXJSZWN0LmhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LkJPVFRPTV9DRU5URVI6XG4gICAgICAgIHRvcERpZmYgLT0gcG9wb3ZlclJlY3QuaGVpZ2h0O1xuICAgICAgICBsZWZ0RGlmZiAtPSBwb3BvdmVyUmVjdC53aWR0aCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5CT1RUT01fUklHSFQ6XG4gICAgICAgIHRvcERpZmYgLT0gcG9wb3ZlclJlY3QuaGVpZ2h0O1xuICAgICAgICBsZWZ0RGlmZiAtPSBwb3BvdmVyUmVjdC53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LlJJR0hUX0JPVFRPTTpcbiAgICAgICAgdG9wRGlmZiAtPSBwb3BvdmVyUmVjdC5oZWlnaHQ7XG4gICAgICAgIGxlZnREaWZmIC09IHBvcG92ZXJSZWN0LndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUG9pbnQuTEVGVF9DRU5URVI6XG4gICAgICAgIHRvcERpZmYgLT0gcG9wb3ZlclJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LlJJR0hUX0NFTlRFUjpcbiAgICAgICAgdG9wRGlmZiAtPSBwb3BvdmVyUmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICBsZWZ0RGlmZiAtPSBwb3BvdmVyUmVjdC53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgIH1cblxuICAgIC8vIFRoaXJkLCBhZGp1c3Qgd2l0aCBwb3BvdmVyJ3MgbWFyZ2lucyBiYXNlZCBvbiB0aGUgdHdvIGFsaWduIHBvaW50cy5cbiAgICAvLyBIZXJlLCB3ZSBtYWtlIGFuIGFzc3VtcHRpb24gdGhhdCBwb3BvdmVyIGlzIHByaW1hcmlseSBwb3NpdGlvbmVkIG91dHNpZGUgdGhlXG4gICAgLy8gYW5jaG9yIHdpdGggbWlub3Igb2Zmc2V0LiBXaXRob3V0IHRoaXMgYXNzdW1wdGlvbiwgaXQncyBpbXBvc3NpYmxlIHRvIGFwcGx5XG4gICAgLy8gdGhlIHBvcG92ZXIncyBtYXJnaW5zIGluIGEgcHJlZGljdGFibGUgd2F5LiBGb3IgZXhhbXBsZSwgYXNzdW1lIHRoYXQgYSBwb3BvdmVyXG4gICAgLy8gYW5kIGl0cyBhbmNob3IgYXJlIGV4YWN0bHkgdGhlIHNhbWUgc2l6ZS4gaWYgYSBwb3BvdmVyIGlzIHBvc2l0aW9uZWQgaW5zaWRlIHRoZVxuICAgIC8vIGFuY2hvciAod2hpY2ggaXMgdGVjaG5pY2FsbHkgcG9zc2libGUpLCB0aGVuIGl0IGJlY29tZXMgaW1wb3NzaWJsZSB0byBrbm93IHdoYXQgdG8gZG9cbiAgICAvLyBpZiB0aGUgcG9wb3ZlciBoYXMgYSBub24temVybyBtYXJnaW4gdmFsdWUgYWxsIGFyb3VuZCAoYmVjYXVzZSBhcHBseWluZyB0aGUgbWFyZ2luIGluXG4gICAgLy8gYWxsIGZvdXIgZGlyZWN0aW9ucyB3aWxsIHJlc3VsdCBpbiBubyBtYXJnaW4gdmlzdWFsbHksIHdoaWNoIGlzbid0IHdoYXQgd2Ugd2FudCkuXG4gICAgLy8gVGhlcmVmb3JlLCBvdXIgbG9naWMgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgbWFyZ2lucyBvZiBpbnRlcmVzdCBnaXZlbiB0aGUgcG9pbnRzLFxuICAgIC8vIGFuZCBvbmx5IGNvdmVycyB0aGUgY2FzZXMgd2hlcmUgcG9wb3ZlciBpcyBvdXRzaWRlIHRoZSBhbmNob3IuXG5cbiAgICBjb25zdCBwb3BvdmVyQ29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KTtcbiAgICBjb25zdCBtYXJnaW5MZWZ0ID0gcGFyc2VJbnQocG9wb3ZlckNvbXB1dGVkU3R5bGUubWFyZ2luTGVmdCwgMTApO1xuICAgIGNvbnN0IG1hcmdpblJpZ2h0ID0gcGFyc2VJbnQocG9wb3ZlckNvbXB1dGVkU3R5bGUubWFyZ2luUmlnaHQsIDEwKTtcbiAgICBjb25zdCBtYXJnaW5Ub3AgPSBwYXJzZUludChwb3BvdmVyQ29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3AsIDEwKTtcbiAgICBjb25zdCBtYXJnaW5Cb3R0b20gPSBwYXJzZUludChwb3BvdmVyQ29tcHV0ZWRTdHlsZS5tYXJnaW5Cb3R0b20sIDEwKTtcblxuICAgIHN3aXRjaCAoYW5jaG9yQWxpZ24pIHtcbiAgICAgIGNhc2UgUG9pbnQuTEVGVF9UT1A6XG4gICAgICBjYXNlIFBvaW50LlRPUF9MRUZUOlxuICAgICAgY2FzZSBQb2ludC5UT1BfUklHSFQ6XG4gICAgICBjYXNlIFBvaW50LlJJR0hUX1RPUDpcbiAgICAgICAgaWYgKHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuQk9UVE9NX1JJR0hUIHx8IHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuUklHSFRfQk9UVE9NKSB7XG4gICAgICAgICAgdG9wRGlmZiAtPSBtYXJnaW5Cb3R0b207XG4gICAgICAgICAgbGVmdERpZmYgLT0gbWFyZ2luUmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuQk9UVE9NX0xFRlQgfHwgcG9wb3ZlckFsaWduID09PSBQb2ludC5MRUZUX0JPVFRPTSkge1xuICAgICAgICAgIHRvcERpZmYgLT0gbWFyZ2luVG9wO1xuICAgICAgICAgIGxlZnREaWZmICs9IG1hcmdpbkxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuVE9QX0xFRlQgfHwgcG9wb3ZlckFsaWduID09PSBQb2ludC5MRUZUX1RPUCkge1xuICAgICAgICAgIHRvcERpZmYgKz0gbWFyZ2luVG9wO1xuICAgICAgICAgIGxlZnREaWZmICs9IG1hcmdpbkxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuVE9QX1JJR0hUIHx8IHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuUklHSFRfVE9QKSB7XG4gICAgICAgICAgdG9wRGlmZiArPSBtYXJnaW5Ub3A7XG4gICAgICAgICAgbGVmdERpZmYgLT0gbWFyZ2luUmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LkxFRlRfQk9UVE9NOlxuICAgICAgY2FzZSBQb2ludC5CT1RUT01fTEVGVDpcbiAgICAgIGNhc2UgUG9pbnQuQk9UVE9NX1JJR0hUOlxuICAgICAgY2FzZSBQb2ludC5SSUdIVF9CT1RUT006XG4gICAgICAgIGlmIChwb3BvdmVyQWxpZ24gPT09IFBvaW50LkJPVFRPTV9MRUZUIHx8IHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuTEVGVF9CT1RUT00pIHtcbiAgICAgICAgICB0b3BEaWZmIC09IG1hcmdpbkJvdHRvbTtcbiAgICAgICAgICBsZWZ0RGlmZiArPSBtYXJnaW5MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyQWxpZ24gPT09IFBvaW50LkJPVFRPTV9SSUdIVCB8fCBwb3BvdmVyQWxpZ24gPT09IFBvaW50LlJJR0hUX0JPVFRPTSkge1xuICAgICAgICAgIHRvcERpZmYgLT0gbWFyZ2luQm90dG9tO1xuICAgICAgICAgIGxlZnREaWZmIC09IG1hcmdpblJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyQWxpZ24gPT09IFBvaW50LlRPUF9MRUZUIHx8IHBvcG92ZXJBbGlnbiA9PT0gUG9pbnQuTEVGVF9UT1ApIHtcbiAgICAgICAgICB0b3BEaWZmICs9IG1hcmdpblRvcDtcbiAgICAgICAgICBsZWZ0RGlmZiArPSBtYXJnaW5MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyQWxpZ24gPT09IFBvaW50LlRPUF9SSUdIVCB8fCBwb3BvdmVyQWxpZ24gPT09IFBvaW50LlJJR0hUX1RPUCkge1xuICAgICAgICAgIHRvcERpZmYgKz0gbWFyZ2luVG9wO1xuICAgICAgICAgIGxlZnREaWZmIC09IG1hcmdpblJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5UT1BfQ0VOVEVSOlxuICAgICAgICB0b3BEaWZmIC09IG1hcmdpbkJvdHRvbTtcbiAgICAgICAgbGVmdERpZmYgKz0gbWFyZ2luTGVmdDtcbiAgICAgICAgbGVmdERpZmYgLT0gbWFyZ2luUmlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5CT1RUT01fQ0VOVEVSOlxuICAgICAgICB0b3BEaWZmICs9IG1hcmdpblRvcDtcbiAgICAgICAgbGVmdERpZmYgKz0gbWFyZ2luTGVmdDtcbiAgICAgICAgbGVmdERpZmYgLT0gbWFyZ2luUmlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQb2ludC5MRUZUX0NFTlRFUjpcbiAgICAgICAgdG9wRGlmZiArPSBtYXJnaW5Ub3A7XG4gICAgICAgIHRvcERpZmYgLT0gbWFyZ2luQm90dG9tO1xuICAgICAgICBsZWZ0RGlmZiAtPSBtYXJnaW5SaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBvaW50LlJJR0hUX0NFTlRFUjpcbiAgICAgICAgdG9wRGlmZiArPSBtYXJnaW5Ub3A7XG4gICAgICAgIHRvcERpZmYgLT0gbWFyZ2luQm90dG9tO1xuICAgICAgICBsZWZ0RGlmZiArPSBtYXJnaW5MZWZ0O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7TWF0aC5yb3VuZChsZWZ0RGlmZil9cHgpIHRyYW5zbGF0ZVkoJHtNYXRoLnJvdW5kKHRvcERpZmYpfXB4KWA7XG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlKCkge1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICB0aGlzLnJlbW92ZVNjcm9sbEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGlzUG9zaXRpb25lZChjb250YWluZXI6IGFueSkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpLnBvc2l0aW9uO1xuICAgIHJldHVybiBwb3NpdGlvbiA9PT0gUE9TSVRJT05fUkVMQVRJVkUgfHwgcG9zaXRpb24gPT09IFBPU0lUSU9OX0FCU09MVVRFIHx8IHBvc2l0aW9uID09PSBQT1NJVElPTl9GSVhFRDtcbiAgfVxuXG4gIC8qXG4gICAgICogQ29udGFpbmVycyB1cCB0byB0aGUgZmlyc3QgcG9zaXRpb25lZCBvbmUgd2lsbCBoYXZlIGFuIGV2ZW50IG9uIHNjcm9sbFxuICAgICAqL1xuXG4gIHByaXZhdGUgc2Nyb2xsYWJsZUVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgcHJpdmF0ZSBlbWl0U2Nyb2xsRXZlbnQoKSB7XG4gICAgdGhpcy5fc2Nyb2xsLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYm91bmRPblNjcm9sbExpc3RlbmVyOiBhbnkgPSB0aGlzLmVtaXRTY3JvbGxFdmVudC5iaW5kKHRoaXMpO1xuXG4gIHByaXZhdGUgYWRkU2Nyb2xsRXZlbnRMaXN0ZW5lcnMoZTogYW55KSB7XG4gICAgdGhpcy5fc2Nyb2xsID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdCBhbmNob3I6IGFueSA9IGU7XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IGU7XG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbHMoY3VycmVudCkpIHtcbiAgICAgICAgY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmJvdW5kT25TY3JvbGxMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRzLnB1c2goY3VycmVudCk7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudCAhPT0gYW5jaG9yICYmIHRoaXMuaXNQb3NpdGlvbmVkKGN1cnJlbnQpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNjcm9sbEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGZvciAoY29uc3QgZWxlbSBvZiB0aGlzLnNjcm9sbGFibGVFbGVtZW50cykge1xuICAgICAgZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmJvdW5kT25TY3JvbGxMaXN0ZW5lcik7XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRzLmxlbmd0aCA9IDA7XG4gICAgaWYgKHRoaXMuX3Njcm9sbCkge1xuICAgICAgdGhpcy5fc2Nyb2xsLmNvbXBsZXRlKCk7XG4gICAgICBkZWxldGUgdGhpcy5fc2Nyb2xsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xscyhjb250YWluZXI6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgIHJldHVybiAoXG4gICAgICBjb21wdXRlZFN0eWxlcy5vdmVyZmxvd1ggPT09IE9WRVJGTE9XX1NDUk9MTCB8fFxuICAgICAgY29tcHV0ZWRTdHlsZXMub3ZlcmZsb3dYID09PSBPVkVSRkxPV19BVVRPIHx8XG4gICAgICBjb21wdXRlZFN0eWxlcy5vdmVyZmxvd1kgPT09IE9WRVJGTE9XX1NDUk9MTCB8fFxuICAgICAgY29tcHV0ZWRTdHlsZXMub3ZlcmZsb3dZID09PSBPVkVSRkxPV19BVVRPXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbWJlZGRlZFZpZXdSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQb2ludCwgUG9wb3ZlciB9IGZyb20gJy4vcG9wb3Zlcic7XG5pbXBvcnQgeyBQb3BvdmVyT3B0aW9ucyB9IGZyb20gJy4vcG9wb3Zlci1vcHRpb25zLmludGVyZmFjZSc7XG5cbmxldCBvcGVuQ291bnQ6IG51bWJlciA9IDA7XG5jb25zdCB3YWl0aW5nOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdOyAvLyBwZW5kaW5nIGNyZWF0ZSBmdW5jdGlvbnNcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NsclBvcG92ZXJPbGRdJyB9KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJEaXJlY3RpdmVPbGQge1xuICBwcml2YXRlIF9wb3BvdmVySW5zdGFuY2U6IFBvcG92ZXI7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIEBJbnB1dCgnY2xyUG9wb3Zlck9sZEFuY2hvcicpIGFuY2hvckVsZW06IGFueTtcbiAgQElucHV0KCdjbHJQb3BvdmVyT2xkQW5jaG9yUG9pbnQnKSBhbmNob3JQb2ludDogUG9pbnQ7XG4gIEBJbnB1dCgnY2xyUG9wb3Zlck9sZFBvcG92ZXJQb2ludCcpIHBvcG92ZXJQb2ludDogUG9pbnQ7XG4gIEBJbnB1dCgnY2xyUG9wb3Zlck9sZE9wdGlvbnMnKSBwb3BvdmVyT3B0aW9uczogUG9wb3Zlck9wdGlvbnMgPSB7fTtcbiAgQE91dHB1dCgnY2xyUG9wb3Zlck9sZENoYW5nZScpIGNsclBvcG92ZXJPbGRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYpIHt9XG5cbiAgQElucHV0KClcbiAgc2V0IGNsclBvcG92ZXJPbGQob3BlbjogYm9vbGVhbikge1xuICAgIGlmIChvcGVuKSB7XG4gICAgICBpZiAodGhpcy5wb3BvdmVyT3B0aW9ucy5hbGxvd011bHRpcGxlT3Blbikge1xuICAgICAgICB0aGlzLmNyZWF0ZVBvcG92ZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcGVuQ291bnQgPT09IDApIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVBvcG92ZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YWl0aW5nLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVQb3BvdmVyKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICB0aGlzLmRlc3Ryb3lQb3BvdmVyKCk7XG5cbiAgICAgIGlmICghdGhpcy5wb3BvdmVyT3B0aW9ucy5hbGxvd011bHRpcGxlT3Blbikge1xuICAgICAgICBpZiAod2FpdGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3JlYXRlUG9wb3ZlckZuID0gd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICAgIGNyZWF0ZVBvcG92ZXJGbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlUG9wb3ZlcigpIHtcbiAgICBjb25zdCBlbWJlZGRlZFZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjxhbnk+ID0gPEVtYmVkZGVkVmlld1JlZjxhbnk+PnRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICB0aGlzLnRlbXBsYXRlUmVmXG4gICAgKTtcblxuICAgIC8vIFRPRE86IE5vdCBzdXJlIG9mIHRoZSByaXNrcyBhc3NvY2lhdGVkIHdpdGggdXNpbmcgdGhpcy4gRmluZCBhbiBhbHRlcm5hdGl2ZS5cbiAgICAvLyBOZWVkZWQgZm9yIGZpbmQgdGhlIGNvcnJlY3QgaGVpZ2h0IGFuZCB3aWR0aCBvZiBkeW5hbWljYWxseSBjcmVhdGVkIHZpZXdzXG4gICAgLy8gaW5zaWRlIG9mIHRoZSBwb3BvdmVyLiBGb3IgRWc6IEJ1dHRvbiBHcm91cHNcbiAgICBlbWJlZGRlZFZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBvdGhlciBub2RlcyBpbiB0aGUgdmlldyByZWYgc28gd2UgYXJlIG9ubHkgbGVmdCB3aXRoIGVsZW1lbnQgbm9kZXNcbiAgICBjb25zdCBlbGVtZW50Tm9kZXM6IEhUTUxFbGVtZW50W10gPSBlbWJlZGRlZFZpZXdSZWYucm9vdE5vZGVzLmZpbHRlcigobm9kZTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMTtcbiAgICB9KTtcblxuICAgIC8vIHdlIHRha2UgdGhlIGZpcnN0IGVsZW1lbnQgbm9kZSBpbiB0aGUgZW1iZWRkZWQgdmlldzsgdXN1YWxseSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgYW55d2F5c1xuICAgIHRoaXMuX3BvcG92ZXJJbnN0YW5jZSA9IG5ldyBQb3BvdmVyKGVsZW1lbnROb2Rlc1swXSk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5fcG9wb3Zlckluc3RhbmNlXG4gICAgICAuYW5jaG9yKHRoaXMuYW5jaG9yRWxlbSwgdGhpcy5hbmNob3JQb2ludCwgdGhpcy5wb3BvdmVyUG9pbnQsIHRoaXMucG9wb3Zlck9wdGlvbnMpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbHJQb3BvdmVyT2xkQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgb3BlbkNvdW50Kys7XG4gIH1cblxuICBkZXN0cm95UG9wb3ZlcigpIHtcbiAgICBpZiAodGhpcy5fcG9wb3Zlckluc3RhbmNlKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX3BvcG92ZXJJbnN0YW5jZS5yZWxlYXNlKCk7XG4gICAgICBkZWxldGUgdGhpcy5fcG9wb3Zlckluc3RhbmNlO1xuICAgICAgb3BlbkNvdW50LS07XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95UG9wb3ZlcigpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyRGlyZWN0aXZlT2xkIH0gZnJvbSAnLi9wb3BvdmVyLW9sZC5kaXJlY3RpdmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL3BvcG92ZXItb3B0aW9ucy5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wb3BvdmVyLW9sZC5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgUE9QT1ZFUl9ESVJFQ1RJVkVTOiBUeXBlPGFueT5bXSA9IFtQb3BvdmVyRGlyZWN0aXZlT2xkXTtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFBPUE9WRVJfRElSRUNUSVZFUyB9IGZyb20gJy4vaW5kZXgnO1xuXG5ATmdNb2R1bGUoeyBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwgZGVjbGFyYXRpb25zOiBbUE9QT1ZFUl9ESVJFQ1RJVkVTXSwgZXhwb3J0czogW1BPUE9WRVJfRElSRUNUSVZFU10gfSlcbmV4cG9ydCBjbGFzcyBDbHJDb21tb25Qb3BvdmVyTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENsckxvYWRpbmdTdGF0ZSB9IGZyb20gJy4vbG9hZGluZyc7XG5cbi8qKlxuICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gc3RpbGwgYmUgYSB2YWxpZCB0b2tlbiBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24gYWZ0ZXIgdHJhbnNwaWxpbmcuXG4gKiBUaGlzIGRvZXMgbm90IG1lYW4geW91IHNob3VsZCBleHRlbmQgaXQsIHNpbXBseSBpbXBsZW1lbnRpbmcgaXQgaXMgZmluZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvYWRpbmdMaXN0ZW5lciB7XG4gIGFic3RyYWN0IGxvYWRpbmdTdGF0ZUNoYW5nZShzdGF0ZTogQ2xyTG9hZGluZ1N0YXRlKTogdm9pZDtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTG9hZGluZ0xpc3RlbmVyIH0gZnJvbSAnLi9sb2FkaW5nLWxpc3RlbmVyJztcblxuZXhwb3J0IGVudW0gQ2xyTG9hZGluZ1N0YXRlIHtcbiAgREVGQVVMVCxcbiAgTE9BRElORyxcbiAgU1VDQ0VTUyxcbiAgRVJST1IsXG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJMb2FkaW5nXScgfSlcbmV4cG9ydCBjbGFzcyBDbHJMb2FkaW5nIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLy8gV2UgZmluZCB0aGUgZmlyc3QgcGFyZW50IHRoYXQgaGFuZGxlcyBzb21ldGhpbmcgbG9hZGluZ1xuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBwcml2YXRlIGxpc3RlbmVyOiBMb2FkaW5nTGlzdGVuZXIpIHt9XG5cbiAgcHJpdmF0ZSBfbG9hZGluZ1N0YXRlOiBDbHJMb2FkaW5nU3RhdGUgPSBDbHJMb2FkaW5nU3RhdGUuREVGQVVMVDtcblxuICBwdWJsaWMgZ2V0IGxvYWRpbmdTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZ1N0YXRlO1xuICB9XG5cbiAgQElucHV0KCdjbHJMb2FkaW5nJylcbiAgcHVibGljIHNldCBsb2FkaW5nU3RhdGUodmFsdWU6IGJvb2xlYW4gfCBDbHJMb2FkaW5nU3RhdGUpIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHZhbHVlID0gQ2xyTG9hZGluZ1N0YXRlLkxPQURJTkc7XG4gICAgfSBlbHNlIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gQ2xyTG9hZGluZ1N0YXRlLkRFRkFVTFQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl9sb2FkaW5nU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2FkaW5nU3RhdGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xuICAgICAgdGhpcy5saXN0ZW5lci5sb2FkaW5nU3RhdGVDaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ2xyTG9hZGluZ1N0YXRlLkRFRkFVTFQ7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDbHJCdXR0b24gfSBmcm9tICcuLi9idXR0b24tZ3JvdXAvYnV0dG9uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJ1dHRvbkluR3JvdXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfY2hhbmdlczogU3ViamVjdDxDbHJCdXR0b24+ID0gbmV3IFN1YmplY3Q8Q2xyQnV0dG9uPigpO1xuXG4gIGdldCBjaGFuZ2VzKCk6IE9ic2VydmFibGU8Q2xyQnV0dG9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZXMuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICB1cGRhdGVCdXR0b25Hcm91cChidXR0b246IENsckJ1dHRvbik6IHZvaWQge1xuICAgIHRoaXMuX2NoYW5nZXMubmV4dChidXR0b24pO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgU2tpcFNlbGYsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyTG9hZGluZ1N0YXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9hZGluZy9sb2FkaW5nJztcbmltcG9ydCB7IExvYWRpbmdMaXN0ZW5lciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvYWRpbmcvbG9hZGluZy1saXN0ZW5lcic7XG5pbXBvcnQgeyBCdXR0b25Jbkdyb3VwU2VydmljZSB9IGZyb20gJy4uL3Byb3ZpZGVycy9idXR0b24taW4tZ3JvdXAuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1idXR0b24nLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctdGVtcGxhdGUgI2J1dHRvblByb2plY3RlZFJlZj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNsYXNzTmFtZXNcIiBcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW1pdENsaWNrKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLnR5cGVdPVwidHlwZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lciBzcGlubmVyLWlubGluZVwiICpuZ0lmPVwibG9hZGluZ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IExvYWRpbmdMaXN0ZW5lciwgdXNlRXhpc3Rpbmc6IENsckJ1dHRvbiB9XSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQnV0dG9uIGltcGxlbWVudHMgTG9hZGluZ0xpc3RlbmVyIHtcbiAgcHJpdmF0ZSBfZW5hYmxlU2VydmljZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2J1dHRvblByb2plY3RlZFJlZicpIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxDbHJCdXR0b24+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBTa2lwU2VsZigpXG4gICAgQE9wdGlvbmFsKClcbiAgICBwdWJsaWMgYnV0dG9uSW5Hcm91cFNlcnZpY2U6IEJ1dHRvbkluR3JvdXBTZXJ2aWNlXG4gICkge31cblxuICBwcml2YXRlIF9pbk1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgaW5NZW51KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbk1lbnU7XG4gIH1cblxuICBASW5wdXQoJ2NsckluTWVudScpXG4gIHNldCBpbk1lbnUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gICAgaWYgKHRoaXMuX2luTWVudSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX2luTWVudSA9IHZhbHVlO1xuICAgICAgLy8gV2UgY2hlY2sgaWYgdGhlIHNlcnZpY2UgZmxhZyBpcyBlbmFibGVkXG4gICAgICAvLyBhbmQgaWYgdGhlIHNlcnZpY2UgZXhpc3RzIGJlY2F1c2UgdGhlIHNlcnZpY2UgaXMgb3B0aW9uYWxcbiAgICAgIGlmICh0aGlzLl9lbmFibGVTZXJ2aWNlICYmIHRoaXMuYnV0dG9uSW5Hcm91cFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5idXR0b25Jbkdyb3VwU2VydmljZS51cGRhdGVCdXR0b25Hcm91cCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGFzc05hbWVzOiBzdHJpbmcgPSAnYnRuJztcblxuICBnZXQgY2xhc3NOYW1lcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc05hbWVzO1xuICB9XG5cbiAgQElucHV0KCdjbGFzcycpXG4gIHNldCBjbGFzc05hbWVzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgY2xhc3NOYW1lczogc3RyaW5nW10gPSB2YWx1ZS5zcGxpdCgnICcpO1xuICAgICAgaWYgKGNsYXNzTmFtZXMuaW5kZXhPZignYnRuJykgPT09IC0xKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnYnRuJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jbGFzc05hbWVzID0gY2xhc3NOYW1lcy5qb2luKCcgJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nID0gbnVsbDtcblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgQElucHV0KCduYW1lJylcbiAgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdHlwZTogc3RyaW5nID0gbnVsbDtcblxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgQElucHV0KCd0eXBlJylcbiAgc2V0IHR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl90eXBlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGFueSA9IG51bGw7XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgQElucHV0KCdkaXNhYmxlZCcpXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xuXG4gIGxvYWRpbmdTdGF0ZUNoYW5nZShzdGF0ZTogQ2xyTG9hZGluZ1N0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gc3RhdGUgPT09IENsckxvYWRpbmdTdGF0ZS5MT0FESU5HO1xuICB9XG5cbiAgQE91dHB1dCgnY2xpY2snKSBfY2xpY2s6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGVtaXRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGljay5lbWl0KHRydWUpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX2VuYWJsZVNlcnZpY2UgPSB0cnVlO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5leHBvcnQgY29uc3QgQ0xSX01FTlVfUE9TSVRJT05TOiBzdHJpbmdbXSA9IFtcbiAgJ2JvdHRvbS1sZWZ0JyxcbiAgJ2JvdHRvbS1yaWdodCcsXG4gICd0b3AtbGVmdCcsXG4gICd0b3AtcmlnaHQnLFxuICAnbGVmdC1ib3R0b20nLFxuICAnbGVmdC10b3AnLFxuICAncmlnaHQtYm90dG9tJyxcbiAgJ3JpZ2h0LXRvcCcsXG5dO1xuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgU2tpcFNlbGYsIE9wdGlvbmFsLCBJbmplY3RhYmxlUHJvdmlkZXIsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxuLy8gQFRPRE8gUHV0IHRoZSBSZXF1aXJlZCB0eXBlIGJhY2sgaW4gd2hlbiBvdXIgbWluaW11bWx5IHN1cHBvcnRlZCB2ZXJzaW9uIG9mIEFuZ3VsYXIgdXNlc1xuLy8gVFMgMi44IG9yIGdyZWF0ZXIgKHNob3VsZCBiZSBBbmd1bGFyIDcpXG4vLyBleHBvcnQgY2xhc3MgQ2xyQ29tbW9uU3RyaW5nc1NlcnZpY2UgaW1wbGVtZW50cyBSZXF1aXJlZDxDbHJDb21tb25TdHJpbmdzPiB7XG5leHBvcnQgY2xhc3MgQ2xyQ29tbW9uU3RyaW5nc1NlcnZpY2UgaW1wbGVtZW50cyBDbHJDb21tb25TdHJpbmdzIHtcbiAgb3BlbiA9ICdPcGVuJztcbiAgY2xvc2UgPSAnQ2xvc2UnO1xuICBzaG93ID0gJ1Nob3cnO1xuICBoaWRlID0gJ0hpZGUnO1xuICBleHBhbmQgPSAnRXhwYW5kJztcbiAgY29sbGFwc2UgPSAnQ29sbGFwc2UnO1xuICBtb3JlID0gJ01vcmUnO1xuICBzZWxlY3QgPSAnU2VsZWN0JztcbiAgc2VsZWN0QWxsID0gJ1NlbGVjdCBBbGwnO1xuICBwcmV2aW91cyA9ICdQcmV2aW91cyc7XG4gIG5leHQgPSAnTmV4dCc7XG4gIGN1cnJlbnQgPSAnSnVtcCB0byBjdXJyZW50JztcbiAgaW5mbyA9ICdJbmZvJztcbiAgc3VjY2VzcyA9ICdTdWNjZXNzJztcbiAgd2FybmluZyA9ICdXYXJuaW5nJztcbiAgZGFuZ2VyID0gJ0Vycm9yJztcbiAgcm93QWN0aW9ucyA9ICdBdmFpbGFibGUgYWN0aW9ucyc7XG4gIHBpY2tDb2x1bW5zID0gJ1Nob3cgb3IgaGlkZSBjb2x1bW5zJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1vblN0cmluZ3NGYWN0b3J5KGV4aXN0aW5nPzogQ2xyQ29tbW9uU3RyaW5ncyk6IENsckNvbW1vblN0cmluZ3Mge1xuICBjb25zdCBkZWZhdWx0cyA9IG5ldyBDbHJDb21tb25TdHJpbmdzU2VydmljZSgpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4geyAuLi5kZWZhdWx0cywgLi4uZXhpc3RpbmcgfTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG5cbmV4cG9ydCBjb25zdCBDT01NT05fU1RSSU5HU19QUk9WSURFUjogSW5qZWN0YWJsZVByb3ZpZGVyID0ge1xuICB1c2VGYWN0b3J5OiBjb21tb25TdHJpbmdzRmFjdG9yeSxcbiAgLy8gV2UgaGF2ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgZm9yIG5vdywgd2UgY2FuIGFkZHJlc3MgaXQgbGF0ZXIgb25jZSB0aGVzZVxuICAvLyB0cmVlLXNoYWtlYWJsZSBwcm92aWRlcnMgaGF2ZSBwcm9wZXIgZG9jdW1lbnRhdGlvbi5cbiAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIGZvcndhcmRSZWYoKCkgPT4gQ2xyQ29tbW9uU3RyaW5ncyldXSxcbn07XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ09NTU9OX1NUUklOR1NfUFJPVklERVIgfSBmcm9tICcuL2NvbW1vbi1zdHJpbmdzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgLi4uQ09NTU9OX1NUUklOR1NfUFJPVklERVIsXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENsckNvbW1vblN0cmluZ3Mge1xuICAvKipcbiAgICogT3BlbiBidXR0b25cbiAgICovXG4gIG9wZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDbG9zZSBidXR0b25cbiAgICovXG4gIGNsb3NlPzogc3RyaW5nO1xuICAvKipcbiAgICogU2hvdyBidXR0b25cbiAgICovXG4gIHNob3c/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIaWRlIGJ1dHRvblxuICAgKi9cbiAgaGlkZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEV4cGFuZGFibGUgY29tcG9uZW50czogZXhwYW5kIGNhcmV0XG4gICAqL1xuICBleHBhbmQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBhbmRhYmxlIGNvbXBvbmVudHM6IGNvbGxhcHNlIGNhcmV0XG4gICAqL1xuICBjb2xsYXBzZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJmbG93IG1lbnVzOiBlbGxpcHNpcyBidXR0b25cbiAgICovXG4gIG1vcmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZWxlY3RhYmxlIGNvbXBvbmVudHM6IGNoZWNrYm94IG9yIHJhZGlvXG4gICAqL1xuICBzZWxlY3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZWxlY3RhYmxlIGNvbXBvbmVudHM6IGNoZWNrYm94IHRvIHNlbGVjdCBhbGxcbiAgICovXG4gIHNlbGVjdEFsbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhZ2luYXRpb246IHByZXZpb3VzIGJ1dHRvblxuICAgKi9cbiAgcHJldmlvdXM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYWdpbmF0aW9uOiBuZXh0IGJ1dHRvblxuICAgKi9cbiAgbmV4dD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhZ2luYXRpb246IGdvIHRvIGN1cnJlbnRcbiAgICovXG4gIGN1cnJlbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbGVydCBsZXZlbHM6IGluZm9cbiAgICovXG4gIGluZm8/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbGVydCBsZXZlbHM6IHN1Y2Nlc3NcbiAgICovXG4gIHN1Y2Nlc3M/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbGVydCBsZXZlbHM6IHdhcm5pbmdcbiAgICovXG4gIHdhcm5pbmc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbGVydCBsZXZlbHM6IGRhbmdlclxuICAgKi9cbiAgZGFuZ2VyPzogc3RyaW5nO1xuICAvKipcbiAgICogRGF0YWdyaWQ6IHJvdyBhY3Rpb25zXG4gICAqL1xuICByb3dBY3Rpb25zPzogc3RyaW5nO1xuICAvKipcbiAgICogRGF0YWdyaWQ6IHBpY2sgY29sdW1uc1xuICAgKi9cbiAgcGlja0NvbHVtbnM/OiBzdHJpbmc7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi8uLi9wb3BvdmVyL2NvbW1vbi9wb3BvdmVyJztcbmltcG9ydCB7IENMUl9NRU5VX1BPU0lUSU9OUyB9IGZyb20gJy4uLy4uL3BvcG92ZXIvZHJvcGRvd24vbWVudS1wb3NpdGlvbnMnO1xuaW1wb3J0IHsgQnV0dG9uSW5Hcm91cFNlcnZpY2UgfSBmcm9tICcuLi9wcm92aWRlcnMvYnV0dG9uLWluLWdyb3VwLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgQ2xyQnV0dG9uIH0gZnJvbSAnLi9idXR0b24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItYnV0dG9uLWdyb3VwJyxcbiAgdGVtcGxhdGVVcmw6ICdidXR0b24tZ3JvdXAuaHRtbCcsXG4gIHByb3ZpZGVyczogW0J1dHRvbkluR3JvdXBTZXJ2aWNlXSxcbiAgaG9zdDogeyAnW2NsYXNzLmJ0bi1ncm91cF0nOiAndHJ1ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQnV0dG9uR3JvdXAge1xuICBAQ29udGVudENoaWxkcmVuKENsckJ1dHRvbikgYnV0dG9uczogUXVlcnlMaXN0PENsckJ1dHRvbj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJ1dHRvbkdyb3VwTmV3U2VydmljZTogQnV0dG9uSW5Hcm91cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzXG4gICkge31cblxuICBpbmxpbmVCdXR0b25zOiBDbHJCdXR0b25bXSA9IFtdO1xuICBtZW51QnV0dG9uczogQ2xyQnV0dG9uW10gPSBbXTtcblxuICAvKipcbiAgICogMS4gSW5pdGlhbGl6ZXMgdGhlIGluaXRpYWwgQnV0dG9uIEdyb3VwIFZpZXdcbiAgICogMi4gU3Vic2NyaWJlcyB0byBjaGFuZ2VzIG9uIHRoZSBDb250ZW50Q2hpbGRyZW5cbiAgICogICAgaW4gY2FzZSB0aGUgdXNlciBjb250ZW50IHByb2plY3Rpb24gY2hhbmdlc1xuICAgKi9cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUJ1dHRvbnMoKTtcbiAgICB0aGlzLmJ1dHRvbkdyb3VwTmV3U2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZShidXR0b24gPT4gdGhpcy5yZWFycmFuZ2VCdXR0b24oYnV0dG9uKSk7XG4gICAgdGhpcy5idXR0b25zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUJ1dHRvbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgYnV0dG9uIGludG8gdGhlIG90aGVyIFZpZXdDb250YWluZXJcbiAgICogd2hlbiBhbiB1cGRhdGUgaXMgcmVjZWl2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBidXR0b25cbiAgICovXG4gIHJlYXJyYW5nZUJ1dHRvbihidXR0b246IENsckJ1dHRvbik6IHZvaWQge1xuICAgIGxldCBmcm9tVmlldzogQ2xyQnV0dG9uW107XG4gICAgbGV0IHRvVmlldzogQ2xyQnV0dG9uW107XG4gICAgaWYgKGJ1dHRvbi5pbk1lbnUpIHtcbiAgICAgIGZyb21WaWV3ID0gdGhpcy5pbmxpbmVCdXR0b25zO1xuICAgICAgdG9WaWV3ID0gdGhpcy5tZW51QnV0dG9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgZnJvbVZpZXcgPSB0aGlzLm1lbnVCdXR0b25zO1xuICAgICAgdG9WaWV3ID0gdGhpcy5pbmxpbmVCdXR0b25zO1xuICAgIH1cbiAgICBjb25zdCBpbmRleDogbnVtYmVyID0gZnJvbVZpZXcuaW5kZXhPZihidXR0b24pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBmcm9tVmlldy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgY29uc3QgbW92ZUluZGV4ID0gdGhpcy5nZXRNb3ZlSW5kZXgoYnV0dG9uKTtcbiAgICAgIGlmIChtb3ZlSW5kZXggPD0gdG9WaWV3Lmxlbmd0aCkge1xuICAgICAgICB0b1ZpZXcuc3BsaWNlKG1vdmVJbmRleCwgMCwgYnV0dG9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yOiBFdWRlc1xuICAgKlxuICAgKiBGaW5kcyB0aGUgb3JkZXIgb2YgYSBidXR0b24gdy5yLnQgb3RoZXIgYnV0dG9uc1xuICAgKlxuICAgKiBAcGFyYW0gYnV0dG9uVG9Nb3ZlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRNb3ZlSW5kZXgoYnV0dG9uVG9Nb3ZlOiBDbHJCdXR0b24pOiBudW1iZXIge1xuICAgIGNvbnN0IHRlbXBBcnI6IENsckJ1dHRvbltdID0gdGhpcy5idXR0b25zLmZpbHRlcihidXR0b24gPT4gYnV0dG9uLmluTWVudSA9PT0gYnV0dG9uVG9Nb3ZlLmluTWVudSk7XG4gICAgcmV0dXJuIHRlbXBBcnIuaW5kZXhPZihidXR0b25Ub01vdmUpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUJ1dHRvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgdGVtcElubGluZUJ1dHRvbnM6IENsckJ1dHRvbltdID0gW107XG4gICAgY29uc3QgdGVtcEluTWVudUJ1dHRvbnM6IENsckJ1dHRvbltdID0gW107XG4gICAgdGhpcy5idXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgIGlmIChidXR0b24uaW5NZW51KSB7XG4gICAgICAgIHRlbXBJbk1lbnVCdXR0b25zLnB1c2goYnV0dG9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRlbXBJbmxpbmVCdXR0b25zLnB1c2goYnV0dG9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmlubGluZUJ1dHRvbnMgPSB0ZW1wSW5saW5lQnV0dG9ucztcbiAgICB0aGlzLm1lbnVCdXR0b25zID0gdGVtcEluTWVudUJ1dHRvbnM7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcmZsb3cgTWVudVxuICAgKlxuICAgKi9cblxuICAvLyBJbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBvdmVyZmxvdyBtZW51XG4gIHByaXZhdGUgX21lbnVQb3NpdGlvbjogc3RyaW5nO1xuXG4gIGdldCBtZW51UG9zaXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudVBvc2l0aW9uO1xuICB9XG5cbiAgQElucHV0KCdjbHJNZW51UG9zaXRpb24nKVxuICBzZXQgbWVudVBvc2l0aW9uKHBvczogc3RyaW5nKSB7XG4gICAgaWYgKHBvcyAmJiBDTFJfTUVOVV9QT1NJVElPTlMuaW5kZXhPZihwb3MpID4gLTEpIHtcbiAgICAgIHRoaXMuX21lbnVQb3NpdGlvbiA9IHBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWVudVBvc2l0aW9uID0gJ2JvdHRvbS1sZWZ0JztcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBwb3BvdmVyIHZhbHVlcyBiYXNlZCBvbiBtZW51IHBvc2l0aW9uXG4gICAgc3dpdGNoICh0aGlzLl9tZW51UG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5UT1BfUklHSFQ7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuUklHSFRfQk9UVE9NO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LlRPUF9MRUZUO1xuICAgICAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LkxFRlRfQk9UVE9NO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5CT1RUT01fUklHSFQ7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuUklHSFRfVE9QO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LkJPVFRPTV9MRUZUO1xuICAgICAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LkxFRlRfVE9QO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0LXRvcCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5SSUdIVF9UT1A7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuTEVGVF9UT1A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQtYm90dG9tJzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LlJJR0hUX0JPVFRPTTtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5MRUZUX0JPVFRPTTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0LXRvcCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5MRUZUX1RPUDtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5SSUdIVF9UT1A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdC1ib3R0b20nOlxuICAgICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuTEVGVF9CT1RUT007XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuUklHSFRfQk9UVE9NO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5CT1RUT01fTEVGVDtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5MRUZUX1RPUDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb3Blbk1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgb3Blbk1lbnUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29wZW5NZW51O1xuICB9XG5cbiAgc2V0IG9wZW5NZW51KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fb3Blbk1lbnUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBhbmNob3JQb2ludDogUG9pbnQgPSBQb2ludC5CT1RUT01fTEVGVDsgLy8gZGVmYXVsdCBpZiBtZW51UG9zaXRpb24gaXNuJ3Qgc2V0XG4gIHB1YmxpYyBwb3BvdmVyUG9pbnQ6IFBvaW50ID0gUG9pbnQuTEVGVF9UT1A7IC8vIGRlZmF1bHQgaWYgbWVudVBvc2l0aW9uIGlzbid0IHNldFxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIENsckRyb3Bkb3duIE1lbnUgd2hlbiB0aGUgQ2xyRHJvcGRvd24gVG9nZ2xlIGlzXG4gICAqIGNsaWNrZWQuIEFsc28gc2V0IGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSB0b2dnbGVcbiAgICogd2FzIGNsaWNrZWQgc28gdGhhdCB3ZSBkb24ndCB0cmF2ZXJzZSB0aGUgRE9NIHRvIGZpbmQgdGhlXG4gICAqIGxvY2F0aW9uIG9mIHRoZSBjbGljay5cbiAgICovXG4gIHRvZ2dsZU1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuTWVudSA9ICF0aGlzLm9wZW5NZW51O1xuICAgIHRoaXMuX292ZXJmbG93TWVudVRvZ2dsZUNsaWNrZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgd2l0aCBpbmRpY2F0ZXMgaWYgdGhlIG92ZXJmbG93IG1lbnUgdG9nZ2xlIHdhcyBjbGlja2VkLlxuICAgKiBJZiB0cnVlLCB0aGlzIGNhbiBzYXZlIHVzIHRyYXZlcnNpbmcgdGhlIERPTSB0byBmaW5kXG4gICAqIHdoZXRoZXIgdGhlIGNsaWNrIHdhcyB3aXRoaW5nIHRoZSBidXR0b24gZ3JvdXAgdG9nZ2xlXG4gICAqIG9yIG1lbnUgaW4gdGhlIG9uTW91c2VDbGljayBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgX292ZXJmbG93TWVudVRvZ2dsZUNsaWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBUT0RPOiBHZW5lcmljIERpcmVjdGl2ZSB0byBoYW5kbGUgdGhpc1xuICAvKipcbiAgICogQ2FsbGVkIG9uIG1vdXNlIGNsaWNrcyBhbnl3aGVyZSBpbiB0aGUgRE9NLlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBtb3VzZWNsaWNrIGhhcHBlbmVkIG9uIHRoZSBob3N0IG9yIG91dHNpZGVcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXG4gIG9uTW91c2VDbGljayh0YXJnZXQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW5NZW51ICYmICF0aGlzLl9vdmVyZmxvd01lbnVUb2dnbGVDbGlja2VkKSB7XG4gICAgICAvLyBSZXNldCB0aGUgb3ZlcmZsb3cgbWVudSB0b2dnbGUgY2xpY2tlZCBmbGFnXG4gICAgICB0aGlzLl9vdmVyZmxvd01lbnVUb2dnbGVDbGlja2VkID0gZmFsc2U7XG4gICAgICBsZXQgY3VycmVudDogYW55ID0gdGFyZ2V0OyAvLyBHZXQgdGhlIGVsZW1lbnQgaW4gdGhlIERPTSBvbiB3aGljaCB0aGUgbW91c2Ugd2FzIGNsaWNrZWRcbiAgICAgIGNvbnN0IGhvc3Q6IGFueSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OyAvLyBDdXJyZW50IEJ1dHRvbiBHcm91cFxuXG4gICAgICBpZiAoY3VycmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROb2RlO1xuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuTWVudSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGNsaWNrZWQgb24gZHJvcGRvd24gbWVudSBhbmQgbWVudSBpcyBpbiBob3N0XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBob3N0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub3Blbk1lbnUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fb3ZlcmZsb3dNZW51VG9nZ2xlQ2xpY2tlZCA9IGZhbHNlOyAvLyBSZXNldCB0aGUgb3ZlcmZsb3cgbWVudSB0b2dnbGUgY2xpY2tlZCBmbGFnXG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9pY29uL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IENsckNvbW1vblBvcG92ZXJNb2R1bGUgfSBmcm9tICcuLi8uLi9wb3BvdmVyL2NvbW1vbi9wb3BvdmVyLm1vZHVsZSc7XG5cbmltcG9ydCB7IENsckJ1dHRvbiB9IGZyb20gJy4vYnV0dG9uJztcbmltcG9ydCB7IENsckJ1dHRvbkdyb3VwIH0gZnJvbSAnLi9idXR0b24tZ3JvdXAnO1xuXG5leHBvcnQgY29uc3QgQ0xSX0JVVFRPTl9HUk9VUF9ESVJFQ1RJVkVTOiBUeXBlPGFueT5bXSA9IFtDbHJCdXR0b24sIENsckJ1dHRvbkdyb3VwXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2xySWNvbk1vZHVsZSwgQ2xyQ29tbW9uUG9wb3Zlck1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9CVVRUT05fR1JPVVBfRElSRUNUSVZFU10sXG4gIGV4cG9ydHM6IFtDTFJfQlVUVE9OX0dST1VQX0RJUkVDVElWRVNdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJCdXR0b25Hcm91cE1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBhbmltYXRlLCBrZXlmcmFtZXMsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbHJMb2FkaW5nU3RhdGUgfSBmcm9tICcuLi8uLi91dGlscy9sb2FkaW5nL2xvYWRpbmcnO1xuaW1wb3J0IHsgTG9hZGluZ0xpc3RlbmVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9hZGluZy9sb2FkaW5nLWxpc3RlbmVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYnV0dG9uW2NsckxvYWRpbmddJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic3RhdGVcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJidXR0b25TdGF0ZS5MT0FESU5HXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gQHNwaW5uZXIgY2xhc3M9XCJzcGlubmVyIHNwaW5uZXItaW5saW5lXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImJ1dHRvblN0YXRlLlNVQ0NFU1NcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBAdmFsaWRhdGVkIChAdmFsaWRhdGVkLmRvbmUpPVwidGhpcy5sb2FkaW5nU3RhdGVDaGFuZ2UodGhpcy5idXR0b25TdGF0ZS5ERUZBVUxUKVwiIGNsYXNzPVwic3Bpbm5lciBzcGlubmVyLWlubGluZSBzcGlubmVyLWNoZWNrXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImJ1dHRvblN0YXRlLkRFRkFVTFRcIiBAZGVmYXVsdEJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIGAsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTG9hZGluZ0xpc3RlbmVyLCB1c2VFeGlzdGluZzogQ2xyTG9hZGluZ0J1dHRvbiB9XSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RlZmF1bHRCdXR0b24nLCBbXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbc3R5bGUoeyBvcGFjaXR5OiAwIH0pLCBhbmltYXRlKCcyMDBtcyAxMDBtcyBlYXNlLWluJywgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKV0pLFxuICAgICAgLy8gVE9ETzogc2VlIGlmIHdlIGNhbiBnZXQgbGVhdmUgYW5pbWF0aW9uIHRvIHdvcmsgYmVmb3JlIHNwaW5uZXIncyBlbnRlciBhbmltYXRpb25cbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtzdHlsZSh7IG9wYWNpdHk6IDAgfSldKSxcbiAgICBdKSxcbiAgICB0cmlnZ2VyKCdzcGlubmVyJywgW1xuICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHsgb3BhY2l0eTogMCB9KSwgYW5pbWF0ZSgnMjAwbXMgMTAwbXMgZWFzZS1pbicsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSldKSxcbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtzdHlsZSh7IG9wYWNpdHk6IDEgfSksIGFuaW1hdGUoJzEwMG1zIGVhc2Utb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKV0pLFxuICAgIF0pLFxuICAgIHRyaWdnZXIoJ3ZhbGlkYXRlZCcsIFtcbiAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgYW5pbWF0ZShcbiAgICAgICAgICAnNjAwbXMnLFxuICAgICAgICAgIGtleWZyYW1lcyhbXG4gICAgICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3NjYWxlKDAsMCknLCBvZmZzZXQ6IDAgfSksXG4gICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDEsIG9mZnNldDogMC4yIH0pLFxuICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSgxLjIsMS4yKScsIG9mZnNldDogMC40IH0pLFxuICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSguOSwuOSknLCBvZmZzZXQ6IDAuNiB9KSxcbiAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoMSwxKScsIG9mZnNldDogMSB9KSxcbiAgICAgICAgICBdKVxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbc3R5bGUoeyBvcGFjaXR5OiAxIH0pLCBhbmltYXRlKCcxMDBtcyBlYXNlLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSldKSxcbiAgICBdKSxcbiAgXSxcbiAgaG9zdDogeyAnW2F0dHIuZGlzYWJsZWRdJzogXCJkaXNhYmxlZD8gJycgOiBudWxsXCIgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyTG9hZGluZ0J1dHRvbiBpbXBsZW1lbnRzIExvYWRpbmdMaXN0ZW5lciB7XG4gIHB1YmxpYyBidXR0b25TdGF0ZSA9IENsckxvYWRpbmdTdGF0ZTtcbiAgcHVibGljIHN0YXRlOiBDbHJMb2FkaW5nU3RhdGUgPSBDbHJMb2FkaW5nU3RhdGUuREVGQVVMVDtcblxuICBASW5wdXQoJ2Rpc2FibGVkJykgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG4gIEBPdXRwdXQoJ2NsckxvYWRpbmdDaGFuZ2UnKVxuICBwdWJsaWMgY2xyTG9hZGluZ0NoYW5nZTogRXZlbnRFbWl0dGVyPENsckxvYWRpbmdTdGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPENsckxvYWRpbmdTdGF0ZT4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIGxvYWRpbmdTdGF0ZUNoYW5nZShzdGF0ZTogQ2xyTG9hZGluZ1N0YXRlKTogdm9pZCB7XG4gICAgaWYgKHN0YXRlID09PSB0aGlzLnN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcblxuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgQ2xyTG9hZGluZ1N0YXRlLkRFRkFVTFQ6XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnd2lkdGgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0nKTsgLy8gZm9yIGNocm9taXVtIHJlbmRlciBidWcgc2VlIGlzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS92bXdhcmUvY2xhcml0eS9pc3N1ZXMvMjcwMFxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDbHJMb2FkaW5nU3RhdGUuTE9BRElORzpcbiAgICAgICAgdGhpcy5zZXRFeHBsaWNpdEJ1dHRvbldpZHRoKCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZXooMCknKTsgLy8gZm9yIGNocm9taXVtIHJlbmRlciBidWcgc2VlIGlzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS92bXdhcmUvY2xhcml0eS9pc3N1ZXMvMjcwMFxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENsckxvYWRpbmdTdGF0ZS5TVUNDRVNTOlxuICAgICAgICB0aGlzLnNldEV4cGxpY2l0QnV0dG9uV2lkdGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENsckxvYWRpbmdTdGF0ZS5FUlJPUjpcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGVDaGFuZ2UoQ2xyTG9hZGluZ1N0YXRlLkRFRkFVTFQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmNsckxvYWRpbmdDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIHNldEV4cGxpY2l0QnV0dG9uV2lkdGgoKSB7XG4gICAgaWYgKHRoaXMuZWwubmF0aXZlRWxlbWVudCAmJiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICBjb25zdCBib3VuZGluZ0NsaWVudFJlY3QgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgYCR7Ym91bmRpbmdDbGllbnRSZWN0LndpZHRofXB4YCk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJMb2FkaW5nQnV0dG9uIH0gZnJvbSAnLi9sb2FkaW5nLWJ1dHRvbic7XG5cbmV4cG9ydCBjb25zdCBDTFJfTE9BRElOR19CVVRUT05fRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyTG9hZGluZ0J1dHRvbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDTFJfTE9BRElOR19CVVRUT05fRElSRUNUSVZFU10sXG4gIGV4cG9ydHM6IFtDTFJfTE9BRElOR19CVVRUT05fRElSRUNUSVZFU10sXG59KVxuZXhwb3J0IGNsYXNzIENsckxvYWRpbmdCdXR0b25Nb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyQnV0dG9uR3JvdXBNb2R1bGUgfSBmcm9tICcuL2J1dHRvbi1ncm91cC9idXR0b24tZ3JvdXAubW9kdWxlJztcbmltcG9ydCB7IENsckxvYWRpbmdCdXR0b25Nb2R1bGUgfSBmcm9tICcuL2J1dHRvbi1sb2FkaW5nL2xvYWRpbmctYnV0dG9uLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtDbHJMb2FkaW5nQnV0dG9uTW9kdWxlLCBDbHJCdXR0b25Hcm91cE1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIENsckJ1dHRvbk1vZHVsZSB7fVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogJycsXG59KVxuZXhwb3J0IGNsYXNzIEVtcHR5QW5jaG9yIHt9XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBFbXB0eUFuY2hvciB9IGZyb20gJy4vZW1wdHktYW5jaG9yJztcblxuLyoqXG4gKiBJbnRlcm5hbCBtb2R1bGUsIHBsZWFzZSBkbyBub3QgZXhwb3J0IVxuICovXG5ATmdNb2R1bGUoeyBkZWNsYXJhdGlvbnM6IFtFbXB0eUFuY2hvcl0sIGV4cG9ydHM6IFtFbXB0eUFuY2hvcl0sIGVudHJ5Q29tcG9uZW50czogW0VtcHR5QW5jaG9yXSB9KVxuZXhwb3J0IGNsYXNzIENsckhvc3RXcmFwcGluZ01vZHVsZSB7fVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1jb250cm9sLWVycm9yJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYCxcbiAgaG9zdDogeyAnW2NsYXNzLmNsci1zdWJ0ZXh0XSc6ICd0cnVlJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJDb250cm9sRXJyb3Ige31cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItY29udHJvbC1oZWxwZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICBgLFxuICBob3N0OiB7ICdbY2xhc3MuY2xyLXN1YnRleHRdJzogJ3RydWUnIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckNvbnRyb2xIZWxwZXIge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmdDb250cm9sU2VydmljZSB7XG4gIC8vIE9ic2VydmFibGUgdG8gc3Vic2NyaWJlIHRvIHRoZSBjb250cm9sLCBzaW5jZSBpdHMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBmb3IgcHJvamVjdGVkIGNvbnRlbnRcbiAgcHJpdmF0ZSBfY29udHJvbENoYW5nZXM6IFN1YmplY3Q8TmdDb250cm9sPiA9IG5ldyBTdWJqZWN0PE5nQ29udHJvbD4oKTtcbiAgZ2V0IGNvbnRyb2xDaGFuZ2VzKCk6IE9ic2VydmFibGU8TmdDb250cm9sPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xDaGFuZ2VzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgc2V0Q29udHJvbChjb250cm9sOiBOZ0NvbnRyb2wpIHtcbiAgICB0aGlzLl9jb250cm9sQ2hhbmdlcy5uZXh0KGNvbnRyb2wpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5nQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi9wcm92aWRlcnMvbmctY29udHJvbC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElmRXJyb3JTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLy8gSW1wbGVtZW50IG91ciBvd24gc3RhdHVzIGNoYW5nZXMgb2JzZXJ2YWJsZSwgc2luY2UgQW5ndWxhciBjb250cm9scyBkb24ndFxuICAvLyBmaXJlIG9uIGV2ZW50cyBsaWtlIGJsdXIsIGFuZCB3ZSB3YW50IHRvIHJldHVybiB0aGUgYm9vbGVhbiBzdGF0ZSBpbnN0ZWFkIG9mIGEgc3RyaW5nXG4gIHByaXZhdGUgX3N0YXR1c0NoYW5nZXM6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xuICBnZXQgc3RhdHVzQ2hhbmdlcygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzQ2hhbmdlcy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBjb250cm9sOiBOZ0NvbnRyb2w7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ0NvbnRyb2xTZXJ2aWNlOiBOZ0NvbnRyb2xTZXJ2aWNlKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIGNvbnRyb2wgdG8gYmUgYXZhaWxhYmxlXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLm5nQ29udHJvbFNlcnZpY2UuY29udHJvbENoYW5nZXMuc3Vic2NyaWJlKGNvbnRyb2wgPT4ge1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XG4gICAgICAgICAgdGhpcy5saXN0ZW5Gb3JDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN1YnNjcmliZSB0byB0aGUgc3RhdHVzIGNoYW5nZSBldmVudHMsIG9ubHkgYWZ0ZXIgdG91Y2hlZCBhbmQgZW1pdCB0aGUgY29udHJvbFxuICBwcml2YXRlIGxpc3RlbkZvckNoYW5nZXMoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWYWxpZGl0eSgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kVmFsaWRpdHkoKSB7XG4gICAgaWYgKCh0aGlzLmNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLmNvbnRyb2wuZGlydHkpICYmIHRoaXMuY29udHJvbC5pbnZhbGlkKSB7XG4gICAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0YXR1c0NoYW5nZXMubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWxsb3dzIGEgY29udHJvbCB0byBwdXNoIGEgc3RhdHVzIGNoZWNrIHVwc3RyZWFtLCBzdWNoIGFzIG9uIGJsdXJcbiAgdHJpZ2dlclN0YXR1c0NoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLnNlbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsZWFuIHVwIHN1YnNjcmlwdGlvbnNcbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgT3B0aW9uYWwsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSWZFcnJvclNlcnZpY2UgfSBmcm9tICcuL2lmLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sU2VydmljZSB9IGZyb20gJy4uL3Byb3ZpZGVycy9uZy1jb250cm9sLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY2xySWZFcnJvcl0nIH0pXG5leHBvcnQgY2xhc3MgQ2xySWZFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaWZFcnJvclNlcnZpY2U6IElmRXJyb3JTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmdDb250cm9sU2VydmljZTogTmdDb250cm9sU2VydmljZSxcbiAgICBwcml2YXRlIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIHByaXZhdGUgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIGlmICghdGhpcy5pZkVycm9yU2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbHJJZkVycm9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGEgZm9ybSBjb250cm9sIGNvbnRhaW5lciBlbGVtZW50IGxpa2UgY2xyLWlucHV0LWNvbnRhaW5lcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlFcnJvcihmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5uZ0NvbnRyb2xTZXJ2aWNlLmNvbnRyb2xDaGFuZ2VzLnN1YnNjcmliZShjb250cm9sID0+IHtcbiAgICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuaWZFcnJvclNlcnZpY2Uuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoaW52YWxpZCA9PiB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgZXJyb3IgdG8gdHJhY2ssIGNoZWNrIGl0LCBvdGhlcndpc2UgY2hlY2sgb3ZlcmFsbCB2YWxpZGl0eVxuICAgICAgICBpZiAodGhpcy5lcnJvciAmJiB0aGlzLmNvbnRyb2wpIHtcbiAgICAgICAgICB0aGlzLmRpc3BsYXlFcnJvcih0aGlzLmNvbnRyb2wuaGFzRXJyb3IodGhpcy5lcnJvcikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlzcGxheUVycm9yKGludmFsaWQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBASW5wdXQoJ2NscklmRXJyb3InKSBlcnJvcjogc3RyaW5nO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBkaXNwbGF5ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb250cm9sOiBOZ0NvbnRyb2w7XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGxheUVycm9yKGludmFsaWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoaW52YWxpZCAmJiAhdGhpcy5kaXNwbGF5ZWQpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlKTtcbiAgICAgIHRoaXMuZGlzcGxheWVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFpbnZhbGlkKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgdGhpcy5kaXNwbGF5ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5sZXQgY291bnRlciA9IDA7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb250cm9sSWRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfaWQgPSAnY2xyLWZvcm0tY29udHJvbC0nICsgKytjb3VudGVyO1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cbiAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgIHRoaXMuX2lkQ2hhbmdlLm5leHQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaWRDaGFuZ2U6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLl9pZCk7XG4gIHB1YmxpYyBnZXQgaWRDaGFuZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5faWRDaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgZW51bSBMYXlvdXRzIHtcbiAgVkVSVElDQUwgPSAndmVydGljYWwnLFxuICBIT1JJWk9OVEFMID0gJ2hvcml6b250YWwnLFxuICBDT01QQUNUID0gJ2NvbXBhY3QnLFxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTGF5b3V0U2VydmljZSB7XG4gIGxheW91dDogTGF5b3V0cyA9IExheW91dHMuSE9SSVpPTlRBTDtcbiAgLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSByZXBsYWNlbWVudCBmb3IgT2JqZWN0LnZhbHVlcygpLCB3aGljaCBJRTExIGFuZCBOb2RlIDw5IGRvbid0IHN1cHBvcnQgOihcbiAgLy8gU3RyaW5nIGVudW1zIGNhbm5vdCBiZSByZXZlcnNlLW1hcHBlZCwgbWVhbmluZyBMYXlvdXRzWydDT01QQUNUJ10gZG9lcyBub3QgcmV0dXJuICdjb21wYWN0JyBzb1xuICAvLyB0aGlzIGV4aXN0cyB0byBkZWFsIHdpdGggdGhpcyBsaXR0bGUgY2F2ZWF0IHRvIGdldCB0aGUgbGlzdCBvZiB0aGUgdmFsdWVzIGFzIGFuIGFycmF5LlxuICBwcml2YXRlIGxheW91dFZhbHVlczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhMYXlvdXRzKS5tYXAoa2V5ID0+IExheW91dHNba2V5XSk7XG5cbiAgaXNWZXJ0aWNhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQgPT09IExheW91dHMuVkVSVElDQUw7XG4gIH1cblxuICBpc0hvcml6b250YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0ID09PSBMYXlvdXRzLkhPUklaT05UQUw7XG4gIH1cblxuICBpc0NvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0ID09PSBMYXlvdXRzLkNPTVBBQ1Q7XG4gIH1cblxuICBnZXQgbGF5b3V0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGNsci1mb3JtLSR7dGhpcy5sYXlvdXR9YDtcbiAgfVxuXG4gIGlzVmFsaWQobGF5b3V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRWYWx1ZXMuaW5kZXhPZihsYXlvdXQpID4gLTE7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENvbnRyb2xJZFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9jb250cm9sLWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGF5b3V0U2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2xheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IE5nQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9uZy1jb250cm9sLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdsYWJlbCcgfSlcbmV4cG9ydCBjbGFzcyBDbHJMYWJlbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBjb250cm9sSWRTZXJ2aWNlOiBDb250cm9sSWRTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG5nQ29udHJvbFNlcnZpY2U6IE5nQ29udHJvbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5mb3InKVxuICBASW5wdXQoJ2ZvcicpXG4gIGZvckF0dHI6IHN0cmluZztcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gT25seSBhZGQgdGhlIGNsci1jb250cm9sLWxhYmVsIGlmIGl0IGlzIGluc2lkZSBhIGNvbnRyb2wgY29udGFpbmVyXG4gICAgaWYgKHRoaXMuY29udHJvbElkU2VydmljZSB8fCB0aGlzLm5nQ29udHJvbFNlcnZpY2UpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnY2xyLWNvbnRyb2wtbGFiZWwnKTtcbiAgICB9XG4gICAgLy8gT25seSBzZXQgdGhlIGdyaWQgY29sdW1uIGNsYXNzZXMgaWYgd2UgYXJlIGluIHRoZSByaWdodCBjb250ZXh0IGFuZCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IHNldFxuICAgIGlmIChcbiAgICAgIHRoaXMubGF5b3V0U2VydmljZSAmJlxuICAgICAgIXRoaXMubGF5b3V0U2VydmljZS5pc1ZlcnRpY2FsKCkgJiZcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudCAmJlxuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5pbmRleE9mKCdjbHItY29sJykgPCAwXG4gICAgKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Nsci1jb2wteHMtMTInKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnY2xyLWNvbC1tZC0yJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRyb2xJZFNlcnZpY2UgJiYgIXRoaXMuZm9yQXR0cikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5jb250cm9sSWRTZXJ2aWNlLmlkQ2hhbmdlLnN1YnNjcmliZShpZCA9PiAodGhpcy5mb3JBdHRyID0gaWQpKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgSVNfTkVXX0ZPUk1TX0xBWU9VVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignSVNfTkVXX0ZPUk1TX0xBWU9VVCcpO1xuZXhwb3J0IGNvbnN0IElTX05FV19GT1JNU19MQVlPVVRfVFJVRV9QUk9WSURFUiA9IHtcbiAgcHJvdmlkZTogSVNfTkVXX0ZPUk1TX0xBWU9VVCxcbiAgdXNlVmFsdWU6IHRydWUsXG59O1xuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNYXJrQ29udHJvbFNlcnZpY2Uge1xuICBwcml2YXRlIF9kaXJ0eTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgZ2V0IGRpcnR5Q2hhbmdlKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kaXJ0eS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIG1hcmtBc0RpcnR5KCkge1xuICAgIHRoaXMuX2RpcnR5Lm5leHQoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgSVNfTkVXX0ZPUk1TX0xBWU9VVF9UUlVFX1BST1ZJREVSIH0gZnJvbSAnLi9wcm92aWRlcnMvbmV3LWZvcm1zLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFya0NvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvbWFyay1jb250cm9sLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2xyRm9ybV0nLFxuICBwcm92aWRlcnM6IFtMYXlvdXRTZXJ2aWNlLCBNYXJrQ29udHJvbFNlcnZpY2UsIElTX05FV19GT1JNU19MQVlPVVRfVFJVRV9QUk9WSURFUl0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmNsci1mb3JtXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmNsci1mb3JtLWhvcml6b250YWxdJzogJ2xheW91dFNlcnZpY2UuaXNIb3Jpem9udGFsKCknLFxuICAgICdbY2xhc3MuY2xyLWZvcm0tY29tcGFjdF0nOiAnbGF5b3V0U2VydmljZS5pc0NvbXBhY3QoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckZvcm0ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSwgcHJpdmF0ZSBtYXJrQ29udHJvbFNlcnZpY2U6IE1hcmtDb250cm9sU2VydmljZSkge31cblxuICBtYXJrQXNEaXJ0eSgpIHtcbiAgICB0aGlzLm1hcmtDb250cm9sU2VydmljZS5tYXJrQXNEaXJ0eSgpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExheW91dHMsIExheW91dFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9sYXlvdXQuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjbHJMYXlvdXRdJyxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyTGF5b3V0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCdjbHJMYXlvdXQnKSBsYXlvdXQ6IExheW91dHM7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGxheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gT25seSBzZXQgdGhlIGxheW91dCBpZiBpdCBpcyBhIHZhbGlkIG9wdGlvblxuICAgIGlmICh0aGlzLmxheW91dCAmJiB0aGlzLmxheW91dFNlcnZpY2UuaXNWYWxpZCh0aGlzLmxheW91dCkpIHtcbiAgICAgIHRoaXMubGF5b3V0U2VydmljZS5sYXlvdXQgPSB0aGlzLmxheW91dDtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJDb250cm9sRXJyb3IgfSBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7IENsckNvbnRyb2xIZWxwZXIgfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBDbHJJZkVycm9yIH0gZnJvbSAnLi9pZi1lcnJvci9pZi1lcnJvcic7XG5pbXBvcnQgeyBDbHJMYWJlbCB9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHsgQ2xyRm9ybSB9IGZyb20gJy4vZm9ybSc7XG5pbXBvcnQgeyBDbHJMYXlvdXQgfSBmcm9tICcuL2xheW91dCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDbHJMYWJlbCwgQ2xyQ29udHJvbEVycm9yLCBDbHJDb250cm9sSGVscGVyLCBDbHJJZkVycm9yLCBDbHJGb3JtLCBDbHJMYXlvdXRdLFxuICBleHBvcnRzOiBbQ2xyTGFiZWwsIENsckNvbnRyb2xFcnJvciwgQ2xyQ29udHJvbEhlbHBlciwgQ2xySWZFcnJvciwgQ2xyRm9ybSwgQ2xyTGF5b3V0XSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQ29tbW9uRm9ybXNNb2R1bGUge31cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuaW1wb3J0IHsgQ29udHJvbElkU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1pZC5zZXJ2aWNlJztcbmltcG9ydCB7IENsckxhYmVsIH0gZnJvbSAnLi4vY29tbW9uL2xhYmVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWNoZWNrYm94LXdyYXBwZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjbHJDaGVja2JveF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibGFiZWxcIj48L25nLWNvbnRlbnQ+XG4gICAgPGxhYmVsICpuZ0lmPVwiIWxhYmVsXCI+PC9sYWJlbD5cbiAgYCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY2xyLWNoZWNrYm94LXdyYXBwZXJdJzogJ3RydWUnLFxuICB9LFxuICBwcm92aWRlcnM6IFtDb250cm9sSWRTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQ2hlY2tib3hXcmFwcGVyIGltcGxlbWVudHMgRHluYW1pY1dyYXBwZXIge1xuICAvLyBXZSBuZWVkIGJvdGggX2R5bmFtaWMgZm9yIEhvc3RXcmFwcGVyIGFuZCBDb250ZW50Q2hpbGQoQ2xyTGFiZWwpIGluIGNhc2VzIHdoZXJlXG4gIC8vIHRoZSB1c2VyIHB1dHMgYSByYWRpbyBpbnNpZGUgYSB3cmFwcGVyIHdpdGhvdXQgYSBsYWJlbCwgaG9zdCB3cmFwcGluZyBkb2Vzbid0IGFwcGx5XG4gIC8vIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdG8gaW5zZXJ0IGEgbGFiZWxcbiAgX2R5bmFtaWMgPSBmYWxzZTtcbiAgQENvbnRlbnRDaGlsZChDbHJMYWJlbCkgbGFiZWw6IENsckxhYmVsO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50RmFjdG9yeSxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIFR5cGUsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEeW5hbWljV3JhcHBlciB9IGZyb20gJy4vZHluYW1pYy13cmFwcGVyJztcbmltcG9ydCB7IEVtcHR5QW5jaG9yIH0gZnJvbSAnLi9lbXB0eS1hbmNob3InO1xuXG4vKipcbiAqIEhvc3RXcmFwcGVyIG11c3QgYmUgY2FsbGVkIGluIE9uSW5pdCB0byBlbnN1cmUgdGhhdCB0aGUgVmlld3MgYXJlIHJlYWR5LiBJZiBpdHMgY2FsbGVkIGluIGEgY29uc3RydWN0b3IgdGhlIHZpZXcgaXNcbiAqIHN0aWxsIHVuZGVmaW5lZC5cbiAqIFRPRE8gLSBtYWtlIHN1cmUgdGhlc2UgY29tbWVudCBhbm5vdGF0aW9ucyBkbyBub3QgYnJlYWsgbmctcGFja2dyLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFdyYXBwZXI8VyBleHRlbmRzIER5bmFtaWNXcmFwcGVyPiBpbXBsZW1lbnRzIEluamVjdG9yIHtcbiAgY29uc3RydWN0b3IoY29udGFpbmVyVHlwZTogVHlwZTxXPiwgdmNyOiBWaWV3Q29udGFpbmVyUmVmLCBpbmRleDogbnVtYmVyID0gMCkge1xuICAgIHRoaXMuaW5qZWN0b3IgPSB2Y3IuaW5qZWN0b3I7XG4gICAgLy8gSWYgdGhlIGhvc3QgaXMgYWxyZWFkeSB3cmFwcGVkLCB3ZSBkb24ndCBkbyBhbnl0aGluZ1xuICAgIGlmICghdGhpcy5pbmplY3Rvci5nZXQoY29udGFpbmVyVHlwZSwgbnVsbCkpIHtcbiAgICAgIGNvbnN0IGNmciA9IHRoaXMuaW5qZWN0b3IuZ2V0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KEVsZW1lbnRSZWYpO1xuXG4gICAgICAvLyBXZSBuZWVkIGEgbmV3IGFuY2hvciwgc2luY2Ugd2UncmUgcHJvamVjdGluZyB0aGUgY3VycmVudCBvbmUuXG4gICAgICB2Y3IuY3JlYXRlQ29tcG9uZW50KGNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShFbXB0eUFuY2hvcikpO1xuICAgICAgY29uc3QgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxXPiA9IGNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb250YWluZXJUeXBlKTtcbiAgICAgIC8vIENyYWZ0IHRoZSBlbGVtZW50IGFycmF5IGJhc2VkIG9uIHdoYXQgc2xvdCB0byB1c2UuIEFuZ3VsYXIgb25seSB1c2VzIHRoZSBpbmRleCB0byBkZXRlcm1pbmVcbiAgICAgIC8vIHdoaWNoIG5nLWNvbnRlbnQgdG8gcHJvamVjdCBpbnRvLCBzbyBpZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG5nLWNvbnRlbnQgeW91J2xsIG5lZWQgdG8gc2V0XG4gICAgICAvLyB0aGUgaW5kZXggaW4gdGhlIGNvbnN0cnVjdG9yIGFwcHJvcHJpYXRlbHlcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBbXTtcbiAgICAgIGVsZW1lbnRbaW5kZXhdID0gW2VsLm5hdGl2ZUVsZW1lbnRdO1xuICAgICAgLy8gV2UncmUgYXNzdW1pbmcgb25seSBvbmUgcHJvamVjdGlvbiBzbG90LCBidXQgaW4gbW9yZSBjb21wbGV4IGNhc2VzIHdlIG1pZ2h0IHdhbnQgdG8gcHJvdmlkZVxuICAgICAgLy8gYSBkaWZmZXJlbnQgYXJyYXkgb2YgcHJvamVjdGVkIGVsZW1lbnRzLlxuICAgICAgY29uc3QgY29udGFpbmVyUmVmID0gdmNyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZWxlbWVudCk7XG4gICAgICAvLyBXZSBjYW4gbm93IHJlbW92ZSB0aGUgdXNlbGVzcyBhbmNob3JcbiAgICAgIHZjci5yZW1vdmUoMCk7XG5cbiAgICAgIC8vIFdlIG5vdGUgdGhhdCB0aGUgY29udGFpbmVyIHdhcyBkeW5hbWljYWxseSBjcmVhdGVkXG4gICAgICBjb250YWluZXJSZWYuaW5zdGFuY2UuX2R5bmFtaWMgPSB0cnVlO1xuXG4gICAgICAvLyBXZSBrZWVwIHRoZSB3cmFwcGVyJ3MgaW5qZWN0b3IgdG8gYWNjZXNzIHRoZSBkZXBlbmRlbmNpZXMgdGhhdCB3ZXJlbid0IGF2YWlsYWJsZSBiZWZvcmUuXG4gICAgICB0aGlzLmluamVjdG9yID0gY29udGFpbmVyUmVmLmluamVjdG9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yO1xuXG4gIGdldDxUPih0b2tlbjogVHlwZTxUPiB8IEluamVjdGlvblRva2VuPFQ+LCBub3RGb3VuZFZhbHVlPzogVCk6IFQge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29udHJvbENsYXNzU2VydmljZSB7XG4gIGNsYXNzTmFtZSA9ICcnO1xuXG4gIGNvbnRyb2xDbGFzcyhpbnZhbGlkID0gZmFsc2UsIGdyaWQgPSBmYWxzZSwgYWRkaXRpb25hbCA9ICcnKSB7XG4gICAgY29uc3QgY29udHJvbENsYXNzZXMgPSBbdGhpcy5jbGFzc05hbWUsIGFkZGl0aW9uYWxdO1xuICAgIGlmIChpbnZhbGlkKSB7XG4gICAgICBjb250cm9sQ2xhc3Nlcy5wdXNoKCdjbHItZXJyb3InKTtcbiAgICB9XG4gICAgaWYgKGdyaWQgJiYgdGhpcy5jbGFzc05hbWUuaW5kZXhPZignY2xyLWNvbCcpID09PSAtMSkge1xuICAgICAgY29udHJvbENsYXNzZXMucHVzaCgnY2xyLWNvbC1tZC0xMCBjbHItY29sLXhzLTEyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sQ2xhc3Nlcy5qb2luKCcgJykudHJpbSgpO1xuICB9XG5cbiAgLy8gV2Ugd2FudCB0byByZW1vdmUgdGhlIGNvbHVtbiBjbGFzc2VzIGZyb20gdGhlIGlucHV0IHVwIHRvIHRoZSBjb250YWluZXJcbiAgaW5pdENvbnRyb2xDbGFzcyhyZW5kZXJlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmNsYXNzTmFtZSkge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZTtcbiAgICAgIGNvbnN0IGtsYXNzZXMgPSBlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpO1xuICAgICAga2xhc3Nlcy5mb3JFYWNoKGtsYXNzID0+IHtcbiAgICAgICAgaWYgKGtsYXNzLnN0YXJ0c1dpdGgoJ2Nsci1jb2wnKSkge1xuICAgICAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQsIGtsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHtcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdGlvblRva2VuLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBUeXBlLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBSZW5kZXJlcjIsXG4gIEVsZW1lbnRSZWYsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEhvc3RXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9ob3N0LXdyYXBwZXInO1xuaW1wb3J0IHsgRHluYW1pY1dyYXBwZXIgfSBmcm9tICcuLi8uLi91dGlscy9ob3N0LXdyYXBwaW5nL2R5bmFtaWMtd3JhcHBlcic7XG5cbmltcG9ydCB7IENvbnRyb2xJZFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9jb250cm9sLWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL25nLWNvbnRyb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJZkVycm9yU2VydmljZSB9IGZyb20gJy4vaWYtZXJyb3IvaWYtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb250cm9sQ2xhc3NTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvY29udHJvbC1jbGFzcy5zZXJ2aWNlJztcbmltcG9ydCB7IE1hcmtDb250cm9sU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL21hcmstY29udHJvbC5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgY2xhc3MgV3JhcHBlZEZvcm1Db250cm9sPFcgZXh0ZW5kcyBEeW5hbWljV3JhcHBlcj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbmdDb250cm9sU2VydmljZTogTmdDb250cm9sU2VydmljZTtcbiAgcHJpdmF0ZSBpZkVycm9yU2VydmljZTogSWZFcnJvclNlcnZpY2U7XG4gIHByaXZhdGUgY29udHJvbENsYXNzU2VydmljZTogQ29udHJvbENsYXNzU2VydmljZTtcbiAgcHJpdmF0ZSBtYXJrQ29udHJvbFNlcnZpY2U6IE1hcmtDb250cm9sU2VydmljZTtcblxuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJvdGVjdGVkIGluZGV4ID0gMDtcbiAgcHJvdGVjdGVkIGNvbnRyb2xJZFNlcnZpY2U6IENvbnRyb2xJZFNlcnZpY2U7XG5cbiAgX2lkOiBzdHJpbmc7XG5cbiAgLy8gSSBsb3N0IHdheSB0b28gbXVjaCB0aW1lIHRyeWluZyB0byBtYWtlIHRoaXMgd29yayB3aXRob3V0IGluamVjdGluZyB0aGUgVmlld0NvbnRhaW5lclJlZiBhbmQgdGhlIEluamVjdG9yLFxuICAvLyBJJ20gZ2l2aW5nIHVwLiBTbyB3ZSBoYXZlIHRvIGluamVjdCB0aGVzZSB0d28gbWFudWFsbHkgZm9yIG5vdy5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgd3JhcHBlclR5cGU6IFR5cGU8Vz4sXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBlbDogRWxlbWVudFJlZlxuICApIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2xTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KE5nQ29udHJvbFNlcnZpY2UpO1xuICAgICAgdGhpcy5pZkVycm9yU2VydmljZSA9IGluamVjdG9yLmdldChJZkVycm9yU2VydmljZSk7XG4gICAgICB0aGlzLmNvbnRyb2xDbGFzc1NlcnZpY2UgPSBpbmplY3Rvci5nZXQoQ29udHJvbENsYXNzU2VydmljZSk7XG4gICAgICB0aGlzLm1hcmtDb250cm9sU2VydmljZSA9IGluamVjdG9yLmdldChNYXJrQ29udHJvbFNlcnZpY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICBpZiAodGhpcy5jb250cm9sQ2xhc3NTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmNvbnRyb2xDbGFzc1NlcnZpY2UuaW5pdENvbnRyb2xDbGFzcyhyZW5kZXJlciwgZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hcmtDb250cm9sU2VydmljZSkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIHRoaXMubWFya0NvbnRyb2xTZXJ2aWNlLmRpcnR5Q2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoKVxuICBASW5wdXQoKVxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG4gIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5jb250cm9sSWRTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmNvbnRyb2xJZFNlcnZpY2UuaWQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgdHJpZ2dlclZhbGlkYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuaWZFcnJvclNlcnZpY2UpIHtcbiAgICAgIHRoaXMuaWZFcnJvclNlcnZpY2UudHJpZ2dlclN0YXR1c0NoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRhaW5lckluamVjdG9yOiBJbmplY3RvcjtcblxuICBwcm90ZWN0ZWQgZ2V0UHJvdmlkZXJGcm9tQ29udGFpbmVyPFQ+KHRva2VuOiBUeXBlPFQ+IHwgSW5qZWN0aW9uVG9rZW48VD4sIG5vdEZvdW5kVmFsdWU/OiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lckluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9jb250YWluZXJJbmplY3RvciA9IG5ldyBIb3N0V3JhcHBlcih0aGlzLndyYXBwZXJUeXBlLCB0aGlzLnZjciwgdGhpcy5pbmRleCk7XG4gICAgdGhpcy5jb250cm9sSWRTZXJ2aWNlID0gdGhpcy5fY29udGFpbmVySW5qZWN0b3IuZ2V0KENvbnRyb2xJZFNlcnZpY2UpO1xuICAgIGlmICh0aGlzLl9pZCkge1xuICAgICAgdGhpcy5jb250cm9sSWRTZXJ2aWNlLmlkID0gdGhpcy5faWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lkID0gdGhpcy5jb250cm9sSWRTZXJ2aWNlLmlkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5nQ29udHJvbFNlcnZpY2UpIHtcbiAgICAgIHRoaXMubmdDb250cm9sU2VydmljZS5zZXRDb250cm9sKHRoaXMubmdDb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIFNlbGYsIE9wdGlvbmFsLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDbHJDaGVja2JveFdyYXBwZXIgfSBmcm9tICcuL2NoZWNrYm94LXdyYXBwZXInO1xuXG5pbXBvcnQgeyBXcmFwcGVkRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9jb21tb24vd3JhcHBlZC1jb250cm9sJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NsckNoZWNrYm94XScgfSlcbmV4cG9ydCBjbGFzcyBDbHJDaGVja2JveCBleHRlbmRzIFdyYXBwZWRGb3JtQ29udHJvbDxDbHJDaGVja2JveFdyYXBwZXI+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBAU2VsZigpXG4gICAgQE9wdGlvbmFsKClcbiAgICBjb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBlbDogRWxlbWVudFJlZlxuICApIHtcbiAgICBzdXBlcih2Y3IsIENsckNoZWNrYm94V3JhcHBlciwgaW5qZWN0b3IsIGNvbnRyb2wsIHJlbmRlcmVyLCBlbCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IElmRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2lmLWVycm9yL2lmLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyTGFiZWwgfSBmcm9tICcuLi9jb21tb24vbGFiZWwnO1xuaW1wb3J0IHsgQ29udHJvbENsYXNzU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1jbGFzcy5zZXJ2aWNlJztcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2xheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IE5nQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL25nLWNvbnRyb2wuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1jaGVja2JveC1jb250YWluZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImxhYmVsXCI+PC9uZy1jb250ZW50PlxuICAgIDxsYWJlbCAqbmdJZj1cIiFsYWJlbCAmJiBhZGRHcmlkKClcIj48L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJjbHItY29udHJvbC1jb250YWluZXJcIiBbY2xhc3MuY2xyLWNvbnRyb2wtaW5saW5lXT1cImNscklubGluZVwiIFtuZ0NsYXNzXT1cImNvbnRyb2xDbGFzcygpXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItY2hlY2tib3gtd3JhcHBlclwiPjwvbmctY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjbHItc3VidGV4dC13cmFwcGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1jb250cm9sLWhlbHBlclwiICpuZ0lmPVwiIWludmFsaWRcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxjbHItaWNvbiAqbmdJZj1cImludmFsaWRcIiBjbGFzcz1cImNsci12YWxpZGF0ZS1pY29uXCIgc2hhcGU9XCJleGNsYW1hdGlvbi1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Nsci1pY29uPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItY29udHJvbC1lcnJvclwiICpuZ0lmPVwiaW52YWxpZFwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5jbHItZm9ybS1jb250cm9sXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmNsci1mb3JtLWNvbnRyb2wtZGlzYWJsZWRdJzogJ2NvbnRyb2w/LmRpc2FibGVkJyxcbiAgICAnW2NsYXNzLmNsci1yb3ddJzogJ2FkZEdyaWQoKScsXG4gIH0sXG4gIHByb3ZpZGVyczogW05nQ29udHJvbFNlcnZpY2UsIENvbnRyb2xDbGFzc1NlcnZpY2UsIElmRXJyb3JTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQ2hlY2tib3hDb250YWluZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGludmFsaWQgPSBmYWxzZTtcbiAgQENvbnRlbnRDaGlsZChDbHJMYWJlbCkgbGFiZWw6IENsckxhYmVsO1xuICBwcml2YXRlIGlubGluZSA9IGZhbHNlO1xuICBjb250cm9sOiBOZ0NvbnRyb2w7XG4gIC8vIHByaXZhdGUgZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2w7XG5cbiAgLypcbiAgICogSGVyZSB3ZSB3YW50IHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBjYXNlc1xuICAgKiBjbHJJbmxpbmUgLSB0cnVlIGJ5IHByZXNlbmNlXG4gICAqIGNscklubGluZT1cInRydWV8ZmFsc2VcIiAtIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IGZhbHNlLCBzdHJpbmdzIGFyZSBjb25zaWRlcmVkIHRydWVcbiAgICogW2NscklubGluZV09XCJ0cnVlfGZhbHNlXCIgLSBleHBlY3QgYSBib29sZWFuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgY2xySW5saW5lKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuaW5saW5lID0gdmFsdWUgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5saW5lID0gISF2YWx1ZTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNscklubGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmxpbmU7XG4gIH1cblxuICAvLyBAVE9ETyBTb2x2ZSBmb3IgZ3JvdXAgdmFsaWRhdGlvbiwgd2hpY2ggZG9lc24ndCB3b3JrIG5vdyB3aXRoIG5nTW9kZWxHcm91cFxuICAvLyBCbG9ja2VkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzIwMjY4XG4gIC8vIEBJbnB1dCgpXG4gIC8vIHNldCBjbHJGb3JtR3JvdXAodmFsdWU6IEZvcm1Hcm91cCkge1xuICAvLyAgIHRoaXMuZm9ybUdyb3VwID0gdmFsdWU7XG4gIC8vIH1cblxuICAvLyBASW5wdXQoKVxuICAvLyBzZXQgY2xyRm9ybUFycmF5KHZhbHVlOiBGb3JtQXJyYXkpIHtcbiAgLy8gICB0aGlzLmZvcm1Hcm91cCA9IHZhbHVlO1xuICAvLyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpZkVycm9yU2VydmljZTogSWZFcnJvclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udHJvbENsYXNzU2VydmljZTogQ29udHJvbENsYXNzU2VydmljZSxcbiAgICBwcml2YXRlIG5nQ29udHJvbFNlcnZpY2U6IE5nQ29udHJvbFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLm5nQ29udHJvbFNlcnZpY2UuY29udHJvbENoYW5nZXMuc3Vic2NyaWJlKGNvbnRyb2wgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gQFRPRE8gcHV0IGEgc29sdXRpb24gaW4gZm9yIGZvcm0gZ3JvdXAgdmFsaWRhdGlvblxuICAgIC8vIGlmICghdGhpcy5mb3JtR3JvdXApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuaWZFcnJvclNlcnZpY2Uuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoaW52YWxpZCA9PiB7XG4gICAgICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIC8vIEJlY2F1c2UgbmdNb2RlbCBkb2VzIHRoaXMsIHdlIGhhdmUgdG8gZGVsYXkgYSB0aWNrIHRvIGdldCB0aGUgcmVzdWx0XG4gICAgLy8gICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAvLyAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgLy8gICAgICAgdGhpcy5mb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgIC8vICAgICAgICAgdGhpcy5pbnZhbGlkID0gdGhpcy5mb3JtR3JvdXAuaW52YWxpZDtcbiAgICAvLyAgICAgICB9KVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgY29udHJvbENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xDbGFzc1NlcnZpY2UuY29udHJvbENsYXNzKHRoaXMuaW52YWxpZCwgdGhpcy5hZGRHcmlkKCksIHRoaXMuaW5saW5lID8gJ2Nsci1jb250cm9sLWlubGluZScgOiAnJyk7XG4gIH1cblxuICBhZGRHcmlkKCkge1xuICAgIGlmICh0aGlzLmxheW91dFNlcnZpY2UgJiYgIXRoaXMubGF5b3V0U2VydmljZS5pc1ZlcnRpY2FsKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMubWFwKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xySWNvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuXG5pbXBvcnQgeyBDbHJIb3N0V3JhcHBpbmdNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9ob3N0LXdyYXBwaW5nL2hvc3Qtd3JhcHBpbmcubW9kdWxlJztcbmltcG9ydCB7IENsckNvbW1vbkZvcm1zTW9kdWxlIH0gZnJvbSAnLi4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xuXG5pbXBvcnQgeyBDbHJDaGVja2JveCB9IGZyb20gJy4vY2hlY2tib3gnO1xuaW1wb3J0IHsgQ2xyQ2hlY2tib3hDb250YWluZXIgfSBmcm9tICcuL2NoZWNrYm94LWNvbnRhaW5lcic7XG5pbXBvcnQgeyBDbHJDaGVja2JveFdyYXBwZXIgfSBmcm9tICcuL2NoZWNrYm94LXdyYXBwZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDbHJJY29uTW9kdWxlLCBDbHJDb21tb25Gb3Jtc01vZHVsZSwgQ2xySG9zdFdyYXBwaW5nTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQ2xyQ2hlY2tib3gsIENsckNoZWNrYm94Q29udGFpbmVyLCBDbHJDaGVja2JveFdyYXBwZXJdLFxuICBleHBvcnRzOiBbQ2xyQ29tbW9uRm9ybXNNb2R1bGUsIENsckNoZWNrYm94LCBDbHJDaGVja2JveENvbnRhaW5lciwgQ2xyQ2hlY2tib3hXcmFwcGVyXSxcbiAgZW50cnlDb21wb25lbnRzOiBbQ2xyQ2hlY2tib3hXcmFwcGVyXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQ2hlY2tib3hNb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmxldCBhY3RpdmVDb3VudGVyID0gMDtcblxuZXhwb3J0IGNvbnN0IElGX0FDVElWRV9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KCdJRl9BQ1RJVkVfSUQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuRmFjdG9yeSgpIHtcbiAgcmV0dXJuICsrYWN0aXZlQ291bnRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IElGX0FDVElWRV9JRF9QUk9WSURFUiA9IHtcbiAgcHJvdmlkZTogSUZfQUNUSVZFX0lELFxuICB1c2VGYWN0b3J5OiB0b2tlbkZhY3RvcnksXG59O1xuXG5ASW5qZWN0YWJsZSgpXG5cbi8qKioqKioqKipcbiAqIEBjbGFzcyBJZkFjdGl2ZVNlcnZpY2VcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFuIGluamVjdGFibGUgc2VydmljZSB1c2VkIGJ5IElmQWN0aXZlIHN0cnVjdHVyYWwgZGlyZWN0aXZlcyBhbmQgdGhlIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgSWZBY3RpdmUgaW4gdGhlaXJcbiAqIHRlbXBsYXRlcy4gSXQgaG9sZHMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBwcm92aWRlcyBhbiBPYnNlcnZhYmxlIHRoYXQgYm90aCB0aGUgZGlyZWN0aXZlIGFuZCB0aGVcbiAqIGltcGxlbWVudGluZyBjb21wb25lbnQgY2FuIHN1YnNjcmliZSB0byBpbiBvcmRlciB0byB0YWtlIGFjdGlvbiBvbiBjdXJyZW50IHZhbHVlIGNoYW5nZXMuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgSWZBY3RpdmVTZXJ2aWNlIHtcbiAgLyoqKioqKioqXG4gICAqIEBwcm9wZXJ0eSBfY3VycmVudENoYW5nZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBSWEpTIFN1YmplY3QgdGhhdCB1cGRhdGVzIGFuZCBwcm92aWRlcyBzdWJzY3JpcHRpb25zIHRvIGZvciB0aGUgY3VycmVudCBjdXJyZW50IHN0YXRlIG9mIGEgY29tcG9uZW50IHRlbXBsYXRlXG4gICAqIGltcGxlbXRpbmcgdGhlIElmQWN0aXZlIHN0cnVjdHVyYWwgZGlyZWN0aXZlLlxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudENoYW5nZTogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8qKioqKioqKipcbiAgICogQHByb3BlcnR5IF9jdXJyZW50XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIGN1cnJlbnQvY2xvc2VkIHN0YXRlIG9mIGFuIElmQWN0aXZlIHN0cnVjdHVyYWwgZGlyZWN0aXZlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudDogbnVtYmVyO1xuXG4gIC8qKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgZ2V0dGVyIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYW4gb2JzZXJ2YWJsZSBmb3IgdGhlIF9jdXJyZW50IFN1YmplY3QuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRDaGFuZ2UoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgdXBkYXRlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBfY3VycmVudCBmb3IgdGhpcyBpbnN0YW5jZSBvZiBJZkFjdGl2ZSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZS5cbiAgICogQW5kLCBicm9hZGNhc3RzIHRoZSBuZXcgdmFsdWUgdG8gYWxsIHN1YnNjcmliZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzZXQgY3VycmVudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnQgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50ID0gdmFsdWU7XG4gICAgICB0aGlzLl9jdXJyZW50Q2hhbmdlLm5leHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIElmQWN0aXZlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElGX0FDVElWRV9JRCwgSWZBY3RpdmVTZXJ2aWNlIH0gZnJvbSAnLi9pZi1hY3RpdmUuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJJZkFjdGl2ZV0nIH0pXG5cbi8qKioqKioqKioqXG4gKlxuICogQGNsYXNzIENscklmQWN0aXZlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHRoYXQgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGFzc29jaWF0ZWQgVGVtcGxhdGVSZWYgaXMgaW5zdGFudGlhdGVkIG9yIG5vdC5cbiAqIEl0IG1ha2VzIHVzZSBvZiBhIENvbXBvbmVudCBpbnN0YW5jZSBsZXZlbCBzZXJ2aWNlOiBJZkFjdGl2ZVNlcnZpY2UgdG8gbWFpbnRhaW4gc3RhdGUgYmV0d2VlbiBpdHNlbGYgYW5kXG4gKiB0aGUgY29tcG9uZW50IHVzaW5nIGl0IGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ2xySWZBY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHdhc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaWZBY3RpdmVTZXJ2aWNlOiBJZkFjdGl2ZVNlcnZpY2UsXG4gICAgQEluamVjdChJRl9BQ1RJVkVfSUQpIHByaXZhdGUgaWQ6IG51bWJlcixcbiAgICBwcml2YXRlIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIHByaXZhdGUgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIHRoaXMuY2hlY2tBbmRVcGRhdGVWaWV3KGlmQWN0aXZlU2VydmljZS5jdXJyZW50KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5pZkFjdGl2ZVNlcnZpY2UuY3VycmVudENoYW5nZS5zdWJzY3JpYmUobmV3Q3VycmVudElkID0+IHtcbiAgICAgIHRoaXMuY2hlY2tBbmRVcGRhdGVWaWV3KG5ld0N1cnJlbnRJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQW5kVXBkYXRlVmlldyhjdXJyZW50SWQ6IG51bWJlcikge1xuICAgIGNvbnN0IGlzTm93QWN0aXZlID0gY3VycmVudElkID09PSB0aGlzLmlkO1xuICAgIC8vIG9ubHkgZW1pdCBpZiB0aGUgbmV3IGFjdGl2ZSBzdGF0ZSBpcyBjaGFuZ2VkIHNpbmNlIGxhc3QgdGltZS5cbiAgICBpZiAoaXNOb3dBY3RpdmUgIT09IHRoaXMud2FzQWN0aXZlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoaXNOb3dBY3RpdmUpO1xuICAgICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdChpc05vd0FjdGl2ZSk7XG4gICAgICB0aGlzLndhc0FjdGl2ZSA9IGlzTm93QWN0aXZlO1xuICAgIH1cbiAgfVxuXG4gIC8qKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgc2V0dGVyIHRoYXQgdXBkYXRlcyBJZkFjdGl2ZVNlcnZpY2UuYWN0aXZlIHdpdGggdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgQElucHV0KCdjbHJJZkFjdGl2ZScpXG4gIHB1YmxpYyBzZXQgYWN0aXZlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmlmQWN0aXZlU2VydmljZS5jdXJyZW50ID0gdGhpcy5pZDtcbiAgICB9XG4gIH1cblxuICAvKioqKioqKioqKlxuICAgKiBAcHJvcGVydHkgYWN0aXZlQ2hhbmdlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCBlbWl0dGVyIHRoYXQgZW1pdHMgd2hlbiB0aGUgYWN0aXZlIHByb3BlcnR5IGlzIHNldCB0byBhbGxvdyBmb3IgMndheSBiaW5kaW5nIHdoZW4gdGhlIGRpcmVjdGl2ZSBpc1xuICAgKiB1c2VkIHdpdGggZGUtc3RydWN0dXJlZCAvIGRlLXN1Z2FyZWQgc3ludGF4LlxuICAgKlxuICAgKi9cbiAgQE91dHB1dCgnY2xySWZBY3RpdmVDaGFuZ2UnKSBhY3RpdmVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKioqKioqKlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBnZXR0ZXIgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IElmQWN0aXZlU2VydmljZS5hY3RpdmUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pZkFjdGl2ZVNlcnZpY2UuY3VycmVudCA9PT0gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBhbnkgdmFsdWUgYW5kIGVpdGhlciBjcmVhdGVkIGFuIGVtYmVkZGVkIHZpZXcgZm9yIHRoZSBhc3NvY2lhdGVkIFZpZXdDb250YWluZXJSZWYgb3IsXG4gICAqIENsZWFycyBhbGwgdmlld3MgZnJvbSB0aGUgVmlld0NvbnRhaW5lclJlZlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVWaWV3KHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5cbi8qKioqKioqKipcbiAqIEBjbGFzcyBJZk9wZW5TZXJ2aWNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBbiBpbmplY3RhYmxlIHNlcnZpY2UgdXNlZCBieSBJZk9wZW4gc3RydWN0dXJhbCBkaXJlY3RpdmVzIGFuZCB0aGUgY29tcG9uZW50cyB0aGF0IGltcGxlbW50IElmT3BlbiBpbiB0aGVpclxuICogdGVtcGxhdGVzLiBJdCBob2xkcyB0aGUgdmFsdWUgb2YgdGhlIG9wZW4gc3RhdGUgYW5kIHByb3ZpZGVzIGFuIE9ic2VydmFibGUgdGhhdCBib3RoIHRoZSBkaXJlY3RpdmUgYW5kIHRoZVxuICogaW1wbGVtZW50aW5nIGNvbXBvbmVudCBjYW4gc3Vic2NyaWJlIHRvIGluIG9yZGVyIHRvIHRha2UgYWN0aW9uIG9uIG9wZW4gdmFsdWUgY2hhbmdlcy5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBJZk9wZW5TZXJ2aWNlIHtcbiAgLyoqKioqKioqXG4gICAqIEBwcm9wZXJ0eSBfb3BlbkNoYW5nZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBSWEpTIFN1YmplY3QgdGhhdCB1cGRhdGVzIGFuZCBwcm92aWRlcyBzdWJzY3JpcHRpb25zIHRvIGZvciB0aGUgY3VycmVudCBvcGVuIHN0YXRlIG9mIGEgY29tcG9uZW50IHRlbXBsYXRlXG4gICAqIGltcGxlbXRpbmcgdGhlIElmT3BlbiBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZS5cbiAgICovXG4gIHByaXZhdGUgX29wZW5DaGFuZ2U6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIC8qKioqKioqKipcbiAgICogQHByb3BlcnR5IF9vcGVuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIG9wZW4vY2xvc2VkIHN0YXRlIG9mIGFuIElmT3BlbiBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZS5cbiAgICpcbiAgICovXG4gIHByaXZhdGUgX29wZW46IGJvb2xlYW47XG5cbiAgLyoqKioqKioqKlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBnZXR0ZXIgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBhbiBvYnNlcnZhYmxlIGZvciB0aGUgX29wZW5lZCBTdWJqZWN0LlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldCBvcGVuQ2hhbmdlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9vcGVuQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqKioqKioqKlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIF9vcGVuIGZvciB0aGlzIGluc3RhbmNlIG9mIElmT3BlbiBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZS4gQW5kLFxuICAgKiBicm9hZGNhc3RzIHRoZSBuZXcgdmFsdWUgdG8gYWxsIHN1YnNjcmliZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzZXQgb3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHZhbHVlID0gISF2YWx1ZTtcbiAgICBpZiAodGhpcy5fb3BlbiAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX29wZW4gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX29wZW5DaGFuZ2UubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqKioqKioqKlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBnZXR0ZXIgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgSWZPcGVuIGluc3RhbmNlLlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbWV0aW1lcywgd2UgbmVlZCB0byByZW1lbWJlciB0aGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHRvZ2dsaW5nIHRvIGF2b2lkIGxvb3BzLlxuICAgKiBUaGlzIGlzIGZvciBpbnN0YW5jZSB0aGUgY2FzZSBvZiBjb21wb25lbnRzIHRoYXQgb3BlbiBvbiBhIGNsaWNrLCBidXQgY2xvc2Ugb24gYSBjbGljayBvdXRzaWRlLlxuICAgKi9cbiAgcHVibGljIG9yaWdpbmFsRXZlbnQ6IGFueTtcbiAgcHVibGljIHRvZ2dsZVdpdGhFdmVudChldmVudDogYW55KSB7XG4gICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgICBkZWxldGUgdGhpcy5vcmlnaW5hbEV2ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqICBQb3BvdmVycyBtaWdodCBuZWVkIHRvIGlnbm9yZSBjbGljayBldmVudHMgb24gYW4gZWxlbWVudFxuICAgKiAgKGVnOiBwb3BvdmVyIG9wZW5zIG9uIGZvY3VzIG9uIGFuIGlucHV0IGZpZWxkLiBDbGlja3Mgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhpcyBjYXNlKVxuICAgKi9cbiAgcHJpdmF0ZSBfaWdub3JlZEVsZW1lbnRDaGFuZ2U6IFN1YmplY3Q8RWxlbWVudFJlZj4gPSBuZXcgU3ViamVjdDxFbGVtZW50UmVmPigpO1xuXG4gIGdldCBpZ25vcmVkRWxlbWVudENoYW5nZSgpOiBPYnNlcnZhYmxlPEVsZW1lbnRSZWY+IHtcbiAgICByZXR1cm4gdGhpcy5faWdub3JlZEVsZW1lbnRDaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZWdpc3Rlcklnbm9yZWRFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLl9pZ25vcmVkRWxlbWVudENoYW5nZS5uZXh0KGVsZW1lbnQpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElmT3BlblNlcnZpY2UgfSBmcm9tICcuL2lmLW9wZW4uc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJJZk9wZW5dJyB9KVxuXG4vKioqKioqKioqKlxuICpcbiAqIEBjbGFzcyBDbHJJZk9wZW5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc3RydWN0dXJhbCBkaXJlY3RpdmUgdGhhdCBjb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgYXNzb2NpYXRlZCBUZW1wbGF0ZVJlZiBpcyBpbnN0YW50aWF0ZWQgb3Igbm90LlxuICogSXQgbWFrZXMgdXNlIG9mIGEgQ29tcG9uZW50IGluc3RhbmNlIGxldmVsIHNlcnZpY2U6IElmT3BlblNlcnZpY2UgdG8gbWFpbnRhaW4gc3RhdGUgYmV0d2VlbiBpdHNlbGYgYW5kIHRoZSBjb21wb25lbnRcbiAqIHVzaW5nIGl0IGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ2xySWZPcGVuIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvKioqKioqKioqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHNldHRlciB0aGF0IHVwZGF0ZXMgSWZPcGVuU2VydmljZS5vcGVuIHdpdGggdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgQElucHV0KCdjbHJJZk9wZW4nKVxuICBwdWJsaWMgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlmT3BlblNlcnZpY2Uub3BlbiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqKioqKioqKipcbiAgICogQHByb3BlcnR5IG9wZW5DaGFuZ2VcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IGVtaXR0ZXIgdGhhdCBlbWl0cyB3aGVuIHRoZSBvcGVuIHByb3BlcnR5IGlzIHNldCB0byBhbGxvdyBmb3IgMndheSBiaW5kaW5nIHdoZW4gdGhlIGRpcmVjdGl2ZSBpc1xuICAgKiB1c2VkIHdpdGggZGUtc3RydWN0dXJlZCAvIGRlLXN1Z2FyZWQgc3ludGF4LlxuICAgKi9cbiAgQE91dHB1dCgnY2xySWZPcGVuQ2hhbmdlJykgb3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqKioqKioqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGdldHRlciB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgSWZPcGVuU2VydmljZS5vcGVuIHZhbHVlLlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldCBvcGVuKCkge1xuICAgIHJldHVybiB0aGlzLmlmT3BlblNlcnZpY2Uub3BlbjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaWZPcGVuU2VydmljZTogSWZPcGVuU2VydmljZSxcbiAgICBwcml2YXRlIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIHByaXZhdGUgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW5DaGFuZ2Uuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoY2hhbmdlKTtcbiAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGNoYW5nZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKioqKioqKioqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBGdW5jdGlvbiB0aGF0IHRha2VzIGEgYm9vbGVhbiB2YWx1ZSBhbmQgZWl0aGVyIGNyZWF0ZWQgYW4gZW1iZWRkZWQgdmlldyBmb3IgdGhlIGFzc29jaWF0ZWQgVmlld0NvbnRhaW5lclJlZiBvcixcbiAgICogQ2xlYXJzIGFsbCB2aWV3cyBmcm9tIHRoZSBWaWV3Q29udGFpbmVyUmVmXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZpZXcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250YWluZXIuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbHJJZkFjdGl2ZSB9IGZyb20gJy4vaWYtYWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDbHJJZk9wZW4gfSBmcm9tICcuL2lmLW9wZW4uZGlyZWN0aXZlJztcblxuZXhwb3J0ICogZnJvbSAnLi9pZi1hY3RpdmUuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vaWYtb3Blbi5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgQ09ORElUSU9OQUxfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xySWZBY3RpdmUsIENscklmT3Blbl07XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ09ORElUSU9OQUxfRElSRUNUSVZFUyB9IGZyb20gJy4vaW5kZXgnO1xuXG5ATmdNb2R1bGUoeyBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwgZGVjbGFyYXRpb25zOiBbQ09ORElUSU9OQUxfRElSRUNUSVZFU10sIGV4cG9ydHM6IFtDT05ESVRJT05BTF9ESVJFQ1RJVkVTXSB9KVxuZXhwb3J0IGNsYXNzIENsckNvbmRpdGlvbmFsTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb2N1c1RyYXBEaXJlY3RpdmUgfSBmcm9tICcuL2ZvY3VzLXRyYXAuZGlyZWN0aXZlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBGb2N1c1RyYXBUcmFja2VyIHtcbiAgcHJpdmF0ZSBfcHJldmlvdXNGb2N1c1RyYXBzOiBGb2N1c1RyYXBEaXJlY3RpdmVbXSA9IFtdO1xuICBwcml2YXRlIF9jdXJyZW50OiBGb2N1c1RyYXBEaXJlY3RpdmU7XG5cbiAgZ2V0IGN1cnJlbnQoKTogRm9jdXNUcmFwRGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcbiAgfVxuXG4gIHNldCBjdXJyZW50KHZhbHVlOiBGb2N1c1RyYXBEaXJlY3RpdmUpIHtcbiAgICB0aGlzLl9wcmV2aW91c0ZvY3VzVHJhcHMucHVzaCh0aGlzLl9jdXJyZW50KTtcbiAgICB0aGlzLl9jdXJyZW50ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbmJGb2N1c1RyYXBwZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzRm9jdXNUcmFwcy5sZW5ndGg7XG4gIH1cblxuICBhY3RpdmF0ZVByZXZpb3VzVHJhcHBlcigpIHtcbiAgICB0aGlzLl9jdXJyZW50ID0gdGhpcy5fcHJldmlvdXNGb2N1c1RyYXBzLnBvcCgpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgUExBVEZPUk1fSUQsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZvY3VzVHJhcFRyYWNrZXIgfSBmcm9tICcuL2ZvY3VzLXRyYXAtdHJhY2tlci5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NsckZvY3VzVHJhcF0nIH0pXG5leHBvcnQgY2xhc3MgRm9jdXNUcmFwRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBwcmV2aW91c0FjdGl2ZUVsZW1lbnQ6IGFueTtcbiAgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQ7XG5cbiAgcHJpdmF0ZSB0b3BSZWJvdW5kRWw6IGFueTtcbiAgcHJpdmF0ZSBib3R0b21SZWJvdW5kRWw6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgZm9jdXNUcmFwc1RyYWNrZXI6IEZvY3VzVHJhcFRyYWNrZXIsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0XG4gICkge1xuICAgIHRoaXMuZG9jdW1lbnQgPSB0aGlzLmluamVjdG9yLmdldChET0NVTUVOVCk7XG4gICAgdGhpcy5mb2N1c1RyYXBzVHJhY2tlci5jdXJyZW50ID0gdGhpcztcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RhYmluZGV4JywgJzAnKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmZvY3VzaW4nLCBbJyRldmVudCddKVxuICBvbkZvY3VzSW4oZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKHRoaXMuZm9jdXNUcmFwc1RyYWNrZXIuY3VycmVudCA9PT0gdGhpcyAmJiBldmVudC50YXJnZXQgJiYgIW5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgbmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9jdXNhYmxlT2ZmU2NyZWVuRWwoKTogYW55IHtcbiAgICAvLyBOb3QgdXNpbmcgUmVuZGVyZXIyJ3MgY3JlYXRlRWxlbWVudCBtZXRob2QgYmVjYXVzZSB0aGF0IGxlYWRzIHRvIERPTSBsZWFrYWdlLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzI2OTU0XG4gICAgY29uc3Qgb2ZmU2NyZWVuU3BhbiA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG9mZlNjcmVlblNwYW4sICd0YWJpbmRleCcsICcwJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhvZmZTY3JlZW5TcGFuLCAnb2Zmc2NyZWVuLWZvY3VzLXJlYm91bmRlcicpO1xuXG4gICAgcmV0dXJuIG9mZlNjcmVlblNwYW47XG4gIH1cblxuICBwcml2YXRlIGFkZFJlYm91bmRFbHMoKSB7XG4gICAgLy8gV2Ugd2lsbCBhZGQgdGhlc2UgZm9jdXMgcmVib3VuZGluZyBlbGVtZW50cyBvbmx5IGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICAvLyAxLiBJdCBzaG91bGQgYmUgcnVubmluZyBpbnNpZGUgYnJvd3NlciBwbGF0Zm9ybSBhcyBpdCBhY2Nlc3NlcyBkb2N1bWVudC5ib2R5IGVsZW1lbnRcbiAgICAvLyAyLiBXZSBzaG91bGQgTk9UIGFkZCB0aGVtIG1vcmUgdGhhbiBvbmNlLiBIZW5jZSwgd2UgYXJlIGNvdW50aW5nIGEgbnVtYmVyIG9mIGZvY3VzIHRyYXBwZXJzXG4gICAgLy8gICAgYW5kIG9ubHkgYWRkIG9uIHRoZSBmaXJzdCBmb2N1cyB0cmFwcGVyLlxuXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgdGhpcy5mb2N1c1RyYXBzVHJhY2tlci5uYkZvY3VzVHJhcHBlcnMgPT09IDEpIHtcbiAgICAgIHRoaXMudG9wUmVib3VuZEVsID0gdGhpcy5jcmVhdGVGb2N1c2FibGVPZmZTY3JlZW5FbCgpO1xuICAgICAgdGhpcy5ib3R0b21SZWJvdW5kRWwgPSB0aGlzLmNyZWF0ZUZvY3VzYWJsZU9mZlNjcmVlbkVsKCk7XG4gICAgICAvLyBBZGQgcmVib3VuZEJlZm9yZVRyYXBFbCB0byB0aGUgZG9jdW1lbnQgYm9keSBhcyB0aGUgZmlyc3QgY2hpbGRcbiAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZG9jdW1lbnQuYm9keSwgdGhpcy50b3BSZWJvdW5kRWwsIHRoaXMuZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTtcbiAgICAgIC8vIEFkZCByZWJvdW5kQWZ0ZXJUcmFwRWwgdG8gdGhlIGRvY3VtZW50IGJvZHkgYXMgdGhlIGxhc3QgY2hpbGRcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLmJvdHRvbVJlYm91bmRFbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWJvdW5kRWxzKCkge1xuICAgIGlmIChcbiAgICAgIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiZcbiAgICAgIHRoaXMuZm9jdXNUcmFwc1RyYWNrZXIubmJGb2N1c1RyYXBwZXJzID09PSAxICYmXG4gICAgICB0aGlzLnRvcFJlYm91bmRFbCAmJlxuICAgICAgdGhpcy5ib3R0b21SZWJvdW5kRWxcbiAgICApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLnRvcFJlYm91bmRFbCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9jdW1lbnQuYm9keSwgdGhpcy5ib3R0b21SZWJvdW5kRWwpO1xuXG4gICAgICAvLyBUaGVzZSBhcmUgaGVyZSB0byB0byBtYWtlIHN1cmUgdGhhdFxuICAgICAgLy8gd2UgY29tcGxldGVseSBkZWxldGUgYWxsIHRyYWNlcyBvZiB0aGUgcmVtb3ZlZCBET00gb2JqZWN0cy5cbiAgICAgIGRlbGV0ZSB0aGlzLnRvcFJlYm91bmRFbDtcbiAgICAgIGRlbGV0ZSB0aGlzLmJvdHRvbVJlYm91bmRFbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0UHJldmlvdXNGb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZUVsZW1lbnQgJiYgdGhpcy5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXMpIHtcbiAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLnByZXZpb3VzQWN0aXZlRWxlbWVudCA9IDxIVE1MRWxlbWVudD50aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRSZWJvdW5kRWxzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZVJlYm91bmRFbHMoKTtcbiAgICB0aGlzLnNldFByZXZpb3VzRm9jdXMoKTtcbiAgICB0aGlzLmZvY3VzVHJhcHNUcmFja2VyLmFjdGl2YXRlUHJldmlvdXNUcmFwcGVyKCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvY3VzVHJhcERpcmVjdGl2ZSB9IGZyb20gJy4vZm9jdXMtdHJhcC5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgRk9DVVNfVFJBUF9ESVJFQ1RJVkVTOiBUeXBlPGFueT5bXSA9IFtGb2N1c1RyYXBEaXJlY3RpdmVdO1xuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZPQ1VTX1RSQVBfRElSRUNUSVZFUyB9IGZyb20gJy4vaW5kZXgnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbRk9DVVNfVFJBUF9ESVJFQ1RJVkVTXSxcbiAgZXhwb3J0czogW0ZPQ1VTX1RSQVBfRElSRUNUSVZFU10sXG59KVxuZXhwb3J0IGNsYXNzIENsckZvY3VzVHJhcE1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNyBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuZXhwb3J0IGNvbnN0IFVQX0FSUk9XOiBudW1iZXIgPSAzODtcbmV4cG9ydCBjb25zdCBET1dOX0FSUk9XOiBudW1iZXIgPSA0MDtcbmV4cG9ydCBjb25zdCBSSUdIVF9BUlJPVzogbnVtYmVyID0gMzk7XG5leHBvcnQgY29uc3QgTEVGVF9BUlJPVzogbnVtYmVyID0gMzc7XG5leHBvcnQgY29uc3QgRU5URVI6IG51bWJlciA9IDEzO1xuZXhwb3J0IGNvbnN0IFNQQUNFOiBudW1iZXIgPSAzMjtcbmV4cG9ydCBjb25zdCBUQUI6IG51bWJlciA9IDk7XG5leHBvcnQgY29uc3QgRVNDOiBudW1iZXIgPSAyNztcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlbi0wMDEgc2hvcnQgbG9jYWxlIGRhdGUgZm9ybWF0LiBTZXR0aW5nIGFzIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPQ0FMRV9GT1JNQVQ6IHN0cmluZyA9ICdkZC9NTS95JztcblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuZXhwb3J0IGNvbnN0IExJVFRMRV9FTkRJQU5fUkVHRVg6IFJlZ0V4cCA9IC9kKy4rbSsuK3krL2k7XG5leHBvcnQgY29uc3QgTUlERExFX0VORElBTl9SRUdFWDogUmVnRXhwID0gL20rLitkKy4reSsvaTtcbi8vIE5vIG5lZWQgZm9yIEJJR19FTkRJQU5fUkVHRVggYmVjYXVzZSBhbnl0aGluZyB0aGF0IGRvZXNuJ3Qgc2F0aXNmeSB0aGUgYWJvdmUgMlxuLy8gaXMgYXV0b21hdGljYWxseSBCSUdfRU5ESUFOXG5cbmV4cG9ydCBjb25zdCBERUxJTUlURVJfUkVHRVg6IFJlZ0V4cCA9IC9kK3xtK3x5Ky9pO1xuXG5leHBvcnQgY29uc3QgVVNFUl9JTlBVVF9SRUdFWDogUmVnRXhwID0gL1xcZCsvZztcblxuZXhwb3J0IGNvbnN0IE1PQklMRV9VU0VSQUdFTlRfUkVHRVg6IFJlZ0V4cCA9IC9Nb2JpL2k7XG5cbmV4cG9ydCBjb25zdCBSVExfUkVHRVg6IFJlZ0V4cCA9IC9cXHUyMDBmL2c7XG5cbmV4cG9ydCBjb25zdCBZRUFSOiBzdHJpbmcgPSAnWVlZWSc7XG5leHBvcnQgY29uc3QgTU9OVEg6IHN0cmluZyA9ICdNTSc7XG5leHBvcnQgY29uc3QgREFURTogc3RyaW5nID0gJ0REJztcblxuZXhwb3J0IHR5cGUgRm9ybWF0VHlwZSA9ICdMSVRUTEVfRU5ESUFOJyB8ICdNSURETEVfRU5ESUFOJyB8ICdCSUdfRU5ESUFOJztcblxuZXhwb3J0IHR5cGUgSW5wdXREYXRlRGlzcGxheUZvcm1hdCA9IHtcbiAgcmVhZG9ubHkgbmFtZTogRm9ybWF0VHlwZTtcbiAgcmVhZG9ubHkgZm9ybWF0OiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XG59O1xuXG5leHBvcnQgY29uc3QgTElUVExFX0VORElBTjogSW5wdXREYXRlRGlzcGxheUZvcm1hdCA9IHtcbiAgbmFtZTogJ0xJVFRMRV9FTkRJQU4nLFxuICBmb3JtYXQ6IFtEQVRFLCBNT05USCwgWUVBUl0sXG59O1xuXG5leHBvcnQgY29uc3QgTUlERExFX0VORElBTjogSW5wdXREYXRlRGlzcGxheUZvcm1hdCA9IHtcbiAgbmFtZTogJ01JRERMRV9FTkRJQU4nLFxuICBmb3JtYXQ6IFtNT05USCwgREFURSwgWUVBUl0sXG59O1xuXG5leHBvcnQgY29uc3QgQklHX0VORElBTjogSW5wdXREYXRlRGlzcGxheUZvcm1hdCA9IHtcbiAgbmFtZTogJ0JJR19FTkRJQU4nLFxuICBmb3JtYXQ6IFtZRUFSLCBNT05USCwgREFURV0sXG59O1xuXG5leHBvcnQgY29uc3QgTk9fT0ZfREFZU19JTl9BX1dFRUs6IG51bWJlciA9IDc7XG5leHBvcnQgY29uc3QgTk9fT0ZfUk9XU19JTl9DQUxFTkRBUl9WSUVXOiBudW1iZXIgPSA2O1xuZXhwb3J0IGNvbnN0IFRPVEFMX0RBWVNfSU5fREFZU19WSUVXOiBudW1iZXIgPSBOT19PRl9EQVlTX0lOX0FfV0VFSyAqIE5PX09GX1JPV1NfSU5fQ0FMRU5EQVJfVklFVztcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgV2Vla0RheSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE51bWJlck9mRGF5c0luVGhlTW9udGgoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gSWYgd2UgZ28gdG8gdGhlIG5leHQgbW9udGgsIGJ1dCB1c2UgYSBkYXkgb2YgMCwgaXQgcmV0dXJucyB0aGUgbGFzdCBkYXkgZnJvbSB0aGUgcHJldmlvdXMgbW9udGhcbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRheSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZGF0ZSB3aGVyZSAwIHJlcHJlc2VudHMgU3VuZGF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5KHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF0ZTogbnVtYmVyKTogV2Vla0RheSB7XG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkuZ2V0RGF5KCk7XG59XG5cbi8qKlxuICogVGFrZXMgaW4gYSB5ZWFyIGFuZCBpZiBpdCBpcyBhIDIgZGlnaXQgeWVhciwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyA0IGRpZ2l0IHllYXIuXG4gKiBXaW5kb3cgb2YgODAgeWVhcnMgYmVmb3JlIGFuZCAyMCB5ZWFycyBhZnRlciB0aGUgcHJlc2VudCB5ZWFyLlxuICogQ3JlZGl0OiBodHRwczovL2dpdGh1Yi5jb20vZ2xvYmFsaXplanMvZ2xvYmFsaXplL2Jsb2IvZTFiMzFjZDZhNGYxY2ZmNzViMTg1YjY4YjdhMzIyMjBhYWM1MTk2Zi9zcmMvZGF0ZS9wYXJzZS5qc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb0ZvdXJEaWdpdFllYXIoeWVhcjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHllYXIgPiA5OTk5IHx8ICh5ZWFyID4gMTAwICYmIHllYXIgPCA5OTkpIHx8IHllYXIgPCAxMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoeWVhciA+IDk5OSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9XG4gIGNvbnN0IGN1cnJZZWFyOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IGNlbnR1cnk6IG51bWJlciA9IE1hdGguZmxvb3IoY3VyclllYXIgLyAxMDApICogMTAwO1xuICBsZXQgcmVzdWx0OiBudW1iZXIgPSB5ZWFyICsgY2VudHVyeTtcbiAgaWYgKHJlc3VsdCA+IGN1cnJZZWFyICsgMjApIHtcbiAgICByZXN1bHQgPSByZXN1bHQgLSAxMDA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgRGF5TW9kZWwgfSBmcm9tICcuL2RheS5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXlWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGF5TW9kZWw6IERheU1vZGVsLFxuICAgIHB1YmxpYyBpc1RvZGF5c0RhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHB1YmxpYyBpc1NlbGVjdGVkOiBib29sZWFuID0gZmFsc2UsXG4gICAgcHVibGljIGlzRm9jdXNhYmxlOiBib29sZWFuID0gZmFsc2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0YWIgaW5kZXggYmFzZWQgb24gdGhlIGlzRm9jdXNhYmxlIGZsYWcuXG4gICAqL1xuICBnZXQgdGFiSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZSA/IDAgOiAtMTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBnZXROdW1iZXJPZkRheXNJblRoZU1vbnRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS11dGlscyc7XG5cbmltcG9ydCB7IERheU1vZGVsIH0gZnJvbSAnLi9kYXkubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB5ZWFyOiBudW1iZXIsIHB1YmxpYyByZWFkb25seSBtb250aDogbnVtYmVyKSB7XG4gICAgdGhpcy5pbml0aWFsaXplRGF5c0luQ2FsZW5kYXIoKTtcbiAgfVxuXG4gIGRheXM6IERheU1vZGVsW107XG5cbiAgLyoqXG4gICAqIFBvcHVsYXRlcyB0aGUgZGF5cyBhcnJheSB3aXRoIHRoZSBEYXlNb2RlbHMgaW4gdGhlIGN1cnJlbnQgQ2FsZW5kYXIuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVEYXlzSW5DYWxlbmRhcigpOiB2b2lkIHtcbiAgICBjb25zdCBub09mRGF5c0luQ2FsZW5kYXI6IG51bWJlciA9IGdldE51bWJlck9mRGF5c0luVGhlTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgICB0aGlzLmRheXMgPSBBcnJheShub09mRGF5c0luQ2FsZW5kYXIpXG4gICAgICAuZmlsbChudWxsKVxuICAgICAgLm1hcCgoZGF0ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXlNb2RlbCh0aGlzLnllYXIsIHRoaXMubW9udGgsIGluZGV4ICsgMSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNhbGVuZGFyIHBhc3NlZCBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBjYWxlbmRhci5cbiAgICovXG4gIGlzRXF1YWwoY2FsZW5kYXI6IENhbGVuZGFyTW9kZWwpIHtcbiAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnllYXIgPT09IGNhbGVuZGFyLnllYXIgJiYgdGhpcy5tb250aCA9PT0gY2FsZW5kYXIubW9udGg7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBEYXlNb2RlbCBpcyBpbiB0aGUgQ2FsZW5kYXJcbiAgICovXG4gIGlzRGF5SW5DYWxlbmRhcihkYXk6IERheU1vZGVsKTogYm9vbGVhbiB7XG4gICAgaWYgKGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueWVhciA9PT0gZGF5LnllYXIgJiYgdGhpcy5tb250aCA9PT0gZGF5Lm1vbnRoO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBDYWxlbmRhck1vZGVsIG9mIHRoZSBwcmV2aW91cyBtb250aC5cbiAgICovXG4gIHByZXZpb3VzTW9udGgoKTogQ2FsZW5kYXJNb2RlbCB7XG4gICAgaWYgKHRoaXMubW9udGggPT09IDApIHtcbiAgICAgIHJldHVybiBuZXcgQ2FsZW5kYXJNb2RlbCh0aGlzLnllYXIgLSAxLCAxMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgQ2FsZW5kYXJNb2RlbCh0aGlzLnllYXIsIHRoaXMubW9udGggLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBDYWxlbmRhck1vZGVsIG9mIHRoZSBuZXh0IG1vbnRoLlxuICAgKi9cbiAgbmV4dE1vbnRoKCk6IENhbGVuZGFyTW9kZWwge1xuICAgIGlmICh0aGlzLm1vbnRoID09PSAxMSkge1xuICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhck1vZGVsKHRoaXMueWVhciArIDEsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IENhbGVuZGFyTW9kZWwodGhpcy55ZWFyLCB0aGlzLm1vbnRoICsgMSk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENhbGVuZGFyTW9kZWwgfSBmcm9tICcuL2NhbGVuZGFyLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIERheU1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHllYXI6IG51bWJlciwgcHVibGljIHJlYWRvbmx5IG1vbnRoOiBudW1iZXIsIHB1YmxpYyByZWFkb25seSBkYXRlOiBudW1iZXIpIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIENhbGVuZGFyIGZvciB0aGUgY3VycmVudCBEYXlNb2RlbC5cbiAgICovXG4gIGdldCBjYWxlbmRhcigpOiBDYWxlbmRhck1vZGVsIHtcbiAgICByZXR1cm4gbmV3IENhbGVuZGFyTW9kZWwodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHBhc3NlZCBDYWxlbmRhckRhdGUgaXMgZXF1YWwgdG8gaXRzZWxmLlxuICAgKi9cbiAgaXNFcXVhbChkYXk6IERheU1vZGVsKSB7XG4gICAgaWYgKGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueWVhciA9PT0gZGF5LnllYXIgJiYgdGhpcy5tb250aCA9PT0gZGF5Lm1vbnRoICYmIHRoaXMuZGF0ZSA9PT0gZGF5LmRhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgQ2FsZW5kYXJEYXRlIGludG8gdGhlIEphdmFzY3JpcHQgRGF0ZSBvYmplY3QuXG4gICAqL1xuICB0b0RhdGUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IERheU1vZGVsIHdoaWNoIGlzIGluY3JlbWVudGVkIGJhc2VkIG9uIHRoZSB2YWx1ZSBwYXNzZWQuXG4gICAqL1xuICBpbmNyZW1lbnRCeSh2YWx1ZTogbnVtYmVyKTogRGF5TW9kZWwge1xuICAgIC8vIENyZWF0aW5nIG5ldyBKYXZhc2NyaXB0IERhdGUgb2JqZWN0IHRvIGluY3JlbWVudCBiZWNhdXNlXG4gICAgLy8gaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRha2UgY2FyZSBvZiBzd2l0Y2hpbmcgdG8gbmV4dCBvciBwcmV2aW91c1xuICAgIC8vIG1vbnRocyAmIHllYXJzIHdpdGhvdXQgd2UgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IGl0LlxuICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF0ZSArIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IERheU1vZGVsKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvbmVzIHRoZSBjdXJyZW50IGRheSBtb2RlbC5cbiAgICovXG4gIGNsb25lKCk6IERheU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IERheU1vZGVsKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXRlKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBOT19PRl9EQVlTX0lOX0FfV0VFSywgTk9fT0ZfUk9XU19JTl9DQUxFTkRBUl9WSUVXLCBUT1RBTF9EQVlTX0lOX0RBWVNfVklFVyB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXREYXkgfSBmcm9tICcuLi91dGlscy9kYXRlLXV0aWxzJztcblxuaW1wb3J0IHsgQ2FsZW5kYXJNb2RlbCB9IGZyb20gJy4vY2FsZW5kYXIubW9kZWwnO1xuaW1wb3J0IHsgRGF5Vmlld01vZGVsIH0gZnJvbSAnLi9kYXktdmlldy5tb2RlbCc7XG5pbXBvcnQgeyBEYXlNb2RlbCB9IGZyb20gJy4vZGF5Lm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIENhbGVuZGFyVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNhbGVuZGFyOiBDYWxlbmRhck1vZGVsLFxuICAgIHByaXZhdGUgc2VsZWN0ZWREYXk6IERheU1vZGVsLFxuICAgIHByaXZhdGUgZm9jdXNhYmxlRGF5OiBEYXlNb2RlbCxcbiAgICBwcml2YXRlIHRvZGF5OiBEYXlNb2RlbCxcbiAgICBwdWJsaWMgZmlyc3REYXlPZldlZWs6IG51bWJlclxuICApIHtcbiAgICB0aGlzLmluaXRpYWxpemVDYWxlbmRhclZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3Vyck1vbnRoRGF5Vmlld3M6IERheVZpZXdNb2RlbFtdID0gW107XG5cbiAgcHJpdmF0ZSBfY2FsZW5kYXJWaWV3OiBEYXlWaWV3TW9kZWxbXVtdO1xuXG4gIC8qKlxuICAgKiBEYXlWaWV3TW9kZWwgbWF0cml4LiBTaXplIDZ4N1xuICAgKi9cbiAgZ2V0IGNhbGVuZGFyVmlldygpOiBEYXlWaWV3TW9kZWxbXVtdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJWaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIDZ4NyBtYXRyaXggb2YgRGF5Vmlld01vZGVsIGJhc2VkIG9uIHRoZSBDYWxlbmRhci5cbiAgICogVGhlIDZ4NyBtYXRyaXggaXMgc3RydWN0dXJlZCBhY2NvcmRpbmcgdG8gdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICogNiByb3dzIHRvIGFjY29tbW9kYXRlIG1vbnRocyB3aGljaCBtaWdodCBoYXZlIGRhdGVzIHNwYW5uaW5nIG92ZXIgNiB3ZWVrcy5cbiAgICogNyBjb2x1bW5zIGJlY2F1c2UgdGhlcmUgYXJlIDcgZGF5cyBpbiBhIHdlZWsgOlAgOkRcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhbGVuZGFyVmlldygpOiB2b2lkIHtcbiAgICAvLyBHZW5lcmF0ZSBwcmV2IGFuZCBuZXh0IG1vbnRoIGNhbGVuZGFyIG1vZGVscy5cbiAgICBjb25zdCBwcmV2TW9udGhDYWxlbmRhcjogQ2FsZW5kYXJNb2RlbCA9IHRoaXMuY2FsZW5kYXIucHJldmlvdXNNb250aCgpO1xuICAgIGNvbnN0IG5leHRNb250aENhbGVuZGFyOiBDYWxlbmRhck1vZGVsID0gdGhpcy5jYWxlbmRhci5uZXh0TW9udGgoKTtcblxuICAgIC8vIEdldCBubyBvZiBkYXlzIGZyb20gcHJldiBhbmQgbmV4dCBtb250aHMuXG4gICAgY29uc3QgZGF5c0Zyb21QcmV2TW9udGhJbkNhbFZpZXc6IG51bWJlciA9IHRoaXMubnVtRGF5c0Zyb21QcmV2TW9udGhJbkNhbFZpZXcoXG4gICAgICB0aGlzLmNhbGVuZGFyLnllYXIsXG4gICAgICB0aGlzLmNhbGVuZGFyLm1vbnRoXG4gICAgKTtcbiAgICBjb25zdCBkYXlzRnJvbU5leHRNb250aEluQ2FsVmlldzogbnVtYmVyID1cbiAgICAgIFRPVEFMX0RBWVNfSU5fREFZU19WSUVXIC0gKHRoaXMuY2FsZW5kYXIuZGF5cy5sZW5ndGggKyBkYXlzRnJvbVByZXZNb250aEluQ2FsVmlldyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBwcmV2LCBjdXJyIGFuZCBuZXh0IGRheSB2aWV3IG1vZGVsc1xuICAgIGxldCBwcmV2TW9udGhEYXlWaWV3czogRGF5Vmlld01vZGVsW10gPSBbXTtcbiAgICBsZXQgbmV4dE1vbnRoRGF5Vmlld3M6IERheVZpZXdNb2RlbFtdID0gW107XG5cbiAgICBpZiAoZGF5c0Zyb21QcmV2TW9udGhJbkNhbFZpZXcgPiAwKSB7XG4gICAgICBwcmV2TW9udGhEYXlWaWV3cyA9IHRoaXMuZ2VuZXJhdGVEYXlWaWV3TW9kZWxzKFxuICAgICAgICBwcmV2TW9udGhDYWxlbmRhci5kYXlzLnNsaWNlKC0xICogZGF5c0Zyb21QcmV2TW9udGhJbkNhbFZpZXcpLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJNb250aERheVZpZXdzID0gdGhpcy5nZW5lcmF0ZURheVZpZXdNb2RlbHModGhpcy5jYWxlbmRhci5kYXlzLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICBpZiAoZGF5c0Zyb21OZXh0TW9udGhJbkNhbFZpZXcgPiAwKSB7XG4gICAgICBuZXh0TW9udGhEYXlWaWV3cyA9IHRoaXMuZ2VuZXJhdGVEYXlWaWV3TW9kZWxzKFxuICAgICAgICBuZXh0TW9udGhDYWxlbmRhci5kYXlzLnNsaWNlKDAsIGRheXNGcm9tTmV4dE1vbnRoSW5DYWxWaWV3KSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgY2FsZW5kYXIgdmlldyBhbmQgaW5pdGlhbGl6ZSBmbGFnc1xuICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9IHRoaXMuZ2VuZXJhdGVDYWxlbmRhclZpZXcocHJldk1vbnRoRGF5Vmlld3MsIHRoaXMuY3Vyck1vbnRoRGF5Vmlld3MsIG5leHRNb250aERheVZpZXdzKTtcbiAgICB0aGlzLmluaXRpYWxpemVTZWxlY3RlZERheSgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZvY3VzYWJsZURheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIERheVZpZXdNb2RlbCBhcnJheSBiYXNlZCBvbiB0aGUgRGF5TW9kZWwgcGFzc2VkXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlRGF5Vmlld01vZGVscyhkYXlzOiBEYXlNb2RlbFtdLCBpc0Rpc2FibGVkOiBib29sZWFuLCBpc0N1cnJlbnRDYWxlbmRhcjogYm9vbGVhbik6IERheVZpZXdNb2RlbFtdIHtcbiAgICBjb25zdCBkYXlWaWV3czogRGF5Vmlld01vZGVsW10gPSBkYXlzLm1hcChkYXkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEYXlWaWV3TW9kZWwoZGF5LCBmYWxzZSwgaXNEaXNhYmxlZCwgZmFsc2UsIGZhbHNlKTtcbiAgICB9KTtcbiAgICBpZiAoaXNDdXJyZW50Q2FsZW5kYXIgJiYgdGhpcy5jYWxlbmRhci5pc0RheUluQ2FsZW5kYXIodGhpcy50b2RheSkpIHtcbiAgICAgIGRheVZpZXdzW3RoaXMudG9kYXkuZGF0ZSAtIDFdLmlzVG9kYXlzRGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBkYXlWaWV3cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIGN1cnJlbnQgbW9udGggdG8gZmlndXJlIG91dCBob3cgbWFueSBkYXRlcyBvZiBwcmV2aW91cyBtb250aFxuICAgKiBhcmUgbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBDYWxlbmRhciBWaWV3IGJhc2VkIG9uIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAqIGVnOiBBc3N1bWluZyBsb2NhbGUgZW4tVVMsIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgaXMgU3VuZGF5LFxuICAgKiBpZiBmaXJzdCBkYXkgb2YgdGhlIGN1cnJlbnQgbW9udGggbGFuZHMgb24gV2VkbmVzZGF5LCB0aGVuXG4gICAqICh0aGlzLmdldERheSBmdW5jdGlvbiB3b3VsZCByZXR1cm4gMyBzaW5jZVxuICAgKiBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgaXMgMCksIHdlIG5lZWQgdGhlIDMgZGF5cyBmcm9tIHRoZSBwcmV2aW91cyBtb250aC5cbiAgICovXG4gIHByaXZhdGUgbnVtRGF5c0Zyb21QcmV2TW9udGhJbkNhbFZpZXcoY3VycmVudFllYXI6IG51bWJlciwgY3VycmVudE1vbnRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGZpcnN0RGF5T2ZDdXJyTW9udGg6IG51bWJlciA9IGdldERheShjdXJyZW50WWVhciwgY3VycmVudE1vbnRoLCAxKTtcblxuICAgIGlmIChmaXJzdERheU9mQ3Vyck1vbnRoID49IHRoaXMuZmlyc3REYXlPZldlZWspIHtcbiAgICAgIHJldHVybiBmaXJzdERheU9mQ3Vyck1vbnRoIC0gdGhpcy5maXJzdERheU9mV2VlaztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE5PX09GX0RBWVNfSU5fQV9XRUVLICsgZmlyc3REYXlPZkN1cnJNb250aCAtIHRoaXMuZmlyc3REYXlPZldlZWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgRGF5IHBhc3NlZCBpcyBpbiB0aGUgQ2FsZW5kYXJWaWV3LlxuICAgKi9cbiAgcHJpdmF0ZSBpc0RheUluQ2FsZW5kYXJWaWV3KGRheTogRGF5TW9kZWwpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXIuaXNEYXlJbkNhbGVuZGFyKGRheSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXNpbmcgdGhlIERheVZpZXdNb2RlbHMgZnJvbSB0aGUgcHJldmlvdXMsIGN1cnJlbnQgYW5kIG5leHQgbW9udGgsIHRoaXMgZnVuY3Rpb25cbiAgICogZ2VuZXJhdGVzIHRoZSBDYWxlbmRhclZpZXcuXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQ2FsZW5kYXJWaWV3KHByZXY6IERheVZpZXdNb2RlbFtdLCBjdXJyOiBEYXlWaWV3TW9kZWxbXSwgbmV4dDogRGF5Vmlld01vZGVsW10pOiBEYXlWaWV3TW9kZWxbXVtdIHtcbiAgICBjb25zdCBjb21iaW5hdGlvbkFycjogRGF5Vmlld01vZGVsW10gPSBbLi4ucHJldiwgLi4uY3VyciwgLi4ubmV4dF07XG5cbiAgICBjb25zdCBjYWxlbmRhclZpZXc6IERheVZpZXdNb2RlbFtdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5PX09GX1JPV1NfSU5fQ0FMRU5EQVJfVklFVzsgaSsrKSB7XG4gICAgICBjYWxlbmRhclZpZXdbaV0gPSBjb21iaW5hdGlvbkFyci5zbGljZShpICogTk9fT0ZfREFZU19JTl9BX1dFRUssIChpICsgMSkgKiBOT19PRl9EQVlTX0lOX0FfV0VFSyk7XG4gICAgfVxuICAgIHJldHVybiBjYWxlbmRhclZpZXc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgc2VsZWN0ZWQgZGF5IGlmIHRoZSBkYXkgaXMgaW4gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2VsZWN0ZWREYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXkgJiYgdGhpcy5pc0RheUluQ2FsZW5kYXJWaWV3KHRoaXMuc2VsZWN0ZWREYXkpKSB7XG4gICAgICB0aGlzLmN1cnJNb250aERheVZpZXdzW3RoaXMuc2VsZWN0ZWREYXkuZGF0ZSAtIDFdLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgZm9jdXNhYmxlIGRheSBpZiB0aGUgZGF5IGlzIGluIHRoZSBjYWxlbmRhci4gSWYgZm9jdXNhYmxlIGRheSBpcyBub3Qgc2V0LCB0aGVuXG4gICAqIHdlIGNoZWNrIGZvciB0aGUgc2VsZWN0ZWQgZGF5LiBJZiBzZWxlY3RlZCBkYXkgaXMgbm90IHNldCB0aGVuIGNoZWNrIGlmIHRvZGF5IGlzIGluIHRoZSBjdXJyZW50XG4gICAqIGNhbGVuZGFyLiBJZiBub3QgdGhlbiBqdXN0IHNldCB0aGUgMTV0aCBvZiB0aGUgY3VycmVudCBjYWxlbmRhciBtb250aC5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvY3VzYWJsZURheSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb2N1c2FibGVEYXkgJiYgdGhpcy5pc0RheUluQ2FsZW5kYXJWaWV3KHRoaXMuZm9jdXNhYmxlRGF5KSkge1xuICAgICAgdGhpcy5zZXRGb2N1c2FibGVGbGFnKHRoaXMuZm9jdXNhYmxlRGF5LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWREYXkgJiYgdGhpcy5pc0RheUluQ2FsZW5kYXJWaWV3KHRoaXMuc2VsZWN0ZWREYXkpKSB7XG4gICAgICB0aGlzLnNldEZvY3VzYWJsZUZsYWcodGhpcy5zZWxlY3RlZERheSwgdHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzYWJsZURheSA9IHRoaXMuc2VsZWN0ZWREYXkuY2xvbmUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEYXlJbkNhbGVuZGFyVmlldyh0aGlzLnRvZGF5KSkge1xuICAgICAgdGhpcy5zZXRGb2N1c2FibGVGbGFnKHRoaXMudG9kYXksIHRydWUpO1xuICAgICAgdGhpcy5mb2N1c2FibGVEYXkgPSB0aGlzLnRvZGF5LmNsb25lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNhYmxlRGF5ID0gbmV3IERheU1vZGVsKHRoaXMuY2FsZW5kYXIueWVhciwgdGhpcy5jYWxlbmRhci5tb250aCwgMTUpO1xuICAgICAgdGhpcy5zZXRGb2N1c2FibGVGbGFnKHRoaXMuZm9jdXNhYmxlRGF5LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEZvY3VzYWJsZUZsYWcoZGF5OiBEYXlNb2RlbCwgZmxhZzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChkYXkpIHtcbiAgICAgIHRoaXMuY3Vyck1vbnRoRGF5Vmlld3NbZGF5LmRhdGUgLSAxXS5pc0ZvY3VzYWJsZSA9IGZsYWc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGZvY3VzYWJsZSBkYXkgaW4gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgdXBkYXRlRm9jdXNhYmxlRGF5KGRheTogRGF5TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZvY3VzYWJsZUZsYWcodGhpcy5mb2N1c2FibGVEYXksIGZhbHNlKTtcbiAgICB0aGlzLnNldEZvY3VzYWJsZUZsYWcoZGF5LCB0cnVlKTtcbiAgICB0aGlzLmZvY3VzYWJsZURheSA9IGRheTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDYWxlbmRhck1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY2FsZW5kYXIubW9kZWwnO1xuaW1wb3J0IHsgRGF5TW9kZWwgfSBmcm9tICcuLi9tb2RlbC9kYXkubW9kZWwnO1xuXG4vKipcbiAqIFRoaXMgc2VydmljZSBpcyByZXNwb25zaWJsZSBmb3I6XG4gKiAxLiBJbml0aWFsaXppbmcgdGhlIGRpc3BsYXllZCBjYWxlbmRhci5cbiAqIDIuIE1vdmluZyB0aGUgY2FsZW5kYXIgdG8gdGhlIG5leHQsIHByZXZpb3VzIG9yIGN1cnJlbnQgbW9udGhzXG4gKiAzLiBNYW5hZ2luZyB0aGUgZm9jdXNlZCBhbmQgc2VsZWN0ZWQgZGF5IG1vZGVscy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGVOYXZpZ2F0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgX2Rpc3BsYXllZENhbGVuZGFyOiBDYWxlbmRhck1vZGVsO1xuXG4gIGdldCBkaXNwbGF5ZWRDYWxlbmRhcigpOiBDYWxlbmRhck1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheWVkQ2FsZW5kYXI7XG4gIH1cblxuICAvLyBub3QgYSBzZXR0ZXIgYmVjYXVzZSBpIHdhbnQgdGhpcyB0byByZW1haW4gcHJpdmF0ZVxuICBwcml2YXRlIHNldERpc3BsYXllZENhbGVuZGFyKHZhbHVlOiBDYWxlbmRhck1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9kaXNwbGF5ZWRDYWxlbmRhci5pc0VxdWFsKHZhbHVlKSkge1xuICAgICAgdGhpcy5fZGlzcGxheWVkQ2FsZW5kYXIgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2Rpc3BsYXllZENhbGVuZGFyQ2hhbmdlLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFyaWFibGUgdG8gc3RvcmUgdG9kYXkncyBkYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdG9kYXlzRnVsbERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBwcml2YXRlIF90b2RheTogRGF5TW9kZWw7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVG9kYXlzRGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl90b2RheXNGdWxsRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5fdG9kYXkgPSBuZXcgRGF5TW9kZWwoXG4gICAgICB0aGlzLl90b2RheXNGdWxsRGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgdGhpcy5fdG9kYXlzRnVsbERhdGUuZ2V0TW9udGgoKSxcbiAgICAgIHRoaXMuX3RvZGF5c0Z1bGxEYXRlLmdldERhdGUoKVxuICAgICk7XG4gIH1cblxuICBnZXQgdG9kYXkoKTogRGF5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLl90b2RheTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZERheTogRGF5TW9kZWw7XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWREYXlDaGFuZ2U6IFN1YmplY3Q8RGF5TW9kZWw+ID0gbmV3IFN1YmplY3Q8RGF5TW9kZWw+KCk7XG5cbiAgZ2V0IHNlbGVjdGVkRGF5Q2hhbmdlKCk6IE9ic2VydmFibGU8RGF5TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWREYXlDaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhhdCB0aGUgc2VsZWN0ZWQgZGF5IGhhcyBjaGFuZ2VkIHNvIHRoYXQgdGhlIGRhdGUgY2FuIGJlIGVtaXR0ZWQgdG8gdGhlIHVzZXIuXG4gICAqIE5vdGU6IE9ubHkgdG8gYmUgY2FsbGVkIGZyb20gZGF5LnRzXG4gICAqL1xuICBub3RpZnlTZWxlY3RlZERheUNoYW5nZWQoZGF5TW9kZWw6IERheU1vZGVsKSB7XG4gICAgaWYgKGRheU1vZGVsLmlzRXF1YWwodGhpcy5zZWxlY3RlZERheSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZERheSA9IGRheU1vZGVsO1xuICAgIHRoaXMuX3NlbGVjdGVkRGF5Q2hhbmdlLm5leHQoZGF5TW9kZWwpO1xuICB9XG5cbiAgcHVibGljIGZvY3VzZWREYXk6IERheU1vZGVsO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgY2FsZW5kYXIgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGRheS5cbiAgICovXG4gIGluaXRpYWxpemVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWREYXkgPSBudWxsOyAvLyBDYW4gYmUgcmVtb3ZlZCBsYXRlciBvbiB0aGUgc3RvcmUgZm9jdXNcbiAgICB0aGlzLmluaXRpYWxpemVUb2RheXNEYXRlKCk7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXkpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXllZENhbGVuZGFyID0gbmV3IENhbGVuZGFyTW9kZWwodGhpcy5zZWxlY3RlZERheS55ZWFyLCB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGlzcGxheWVkQ2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXJNb2RlbCh0aGlzLnRvZGF5LnllYXIsIHRoaXMudG9kYXkubW9udGgpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZU1vbnRoKG1vbnRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldERpc3BsYXllZENhbGVuZGFyKG5ldyBDYWxlbmRhck1vZGVsKHRoaXMuX2Rpc3BsYXllZENhbGVuZGFyLnllYXIsIG1vbnRoKSk7XG4gIH1cblxuICBjaGFuZ2VZZWFyKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0RGlzcGxheWVkQ2FsZW5kYXIobmV3IENhbGVuZGFyTW9kZWwoeWVhciwgdGhpcy5fZGlzcGxheWVkQ2FsZW5kYXIubW9udGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgZGlzcGxheWVkIGNhbGVuZGFyIHRvIHRoZSBuZXh0IG1vbnRoLlxuICAgKi9cbiAgbW92ZVRvTmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGlzcGxheWVkQ2FsZW5kYXIodGhpcy5fZGlzcGxheWVkQ2FsZW5kYXIubmV4dE1vbnRoKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBkaXNwbGF5ZWQgY2FsZW5kYXIgdG8gdGhlIHByZXZpb3VzIG1vbnRoLlxuICAgKi9cbiAgbW92ZVRvUHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERpc3BsYXllZENhbGVuZGFyKHRoaXMuX2Rpc3BsYXllZENhbGVuZGFyLnByZXZpb3VzTW9udGgoKSk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIGRpc3BsYXllZCBjYWxlbmRhciB0byB0aGUgY3VycmVudCBtb250aCBhbmQgeWVhci5cbiAgICovXG4gIG1vdmVUb0N1cnJlbnRNb250aCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzcGxheWVkQ2FsZW5kYXIuaXNEYXlJbkNhbGVuZGFyKHRoaXMudG9kYXkpKSB7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENhbGVuZGFyKG5ldyBDYWxlbmRhck1vZGVsKHRoaXMudG9kYXkueWVhciwgdGhpcy50b2RheS5tb250aCkpO1xuICAgIH1cbiAgICB0aGlzLl9mb2N1c09uQ2FsZW5kYXJDaGFuZ2UubmV4dCgpO1xuICB9XG5cbiAgaW5jcmVtZW50Rm9jdXNEYXkodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNlZERheSA9IHRoaXMuZm9jdXNlZERheS5pbmNyZW1lbnRCeSh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuX2Rpc3BsYXllZENhbGVuZGFyLmlzRGF5SW5DYWxlbmRhcih0aGlzLmZvY3VzZWREYXkpKSB7XG4gICAgICB0aGlzLl9mb2N1c2VkRGF5Q2hhbmdlLm5leHQodGhpcy5mb2N1c2VkRGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDYWxlbmRhcih0aGlzLmZvY3VzZWREYXkuY2FsZW5kYXIpO1xuICAgIH1cbiAgICB0aGlzLl9mb2N1c09uQ2FsZW5kYXJDaGFuZ2UubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcGxheWVkQ2FsZW5kYXJDaGFuZ2U6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIG9ic2VydmFibGUgbGV0cyB0aGUgc3Vic2NyaWJlciBrbm93IHRoYXQgdGhlIGRpc3BsYXllZCBjYWxlbmRhciBoYXMgY2hhbmdlZC5cbiAgICovXG4gIGdldCBkaXNwbGF5ZWRDYWxlbmRhckNoYW5nZSgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheWVkQ2FsZW5kYXJDaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIF9mb2N1c09uQ2FsZW5kYXJDaGFuZ2U6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIG9ic2VydmFibGUgbGV0cyB0aGUgc3Vic2NyaWJlciBrbm93IHRoYXQgdGhlIGZvY3VzIHNob3VsZCBiZSBhcHBsaWVkIG9uIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIGdldCBmb2N1c09uQ2FsZW5kYXJDaGFuZ2UoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzT25DYWxlbmRhckNoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZvY3VzZWREYXlDaGFuZ2U6IFN1YmplY3Q8RGF5TW9kZWw+ID0gbmV3IFN1YmplY3Q8RGF5TW9kZWw+KCk7XG5cbiAgLyoqXG4gICAqIFRoaXMgb2JzZXJ2YWJsZSBsZXRzIHRoZSBzdWJzY3JpYmVyIGtub3cgdGhhdCB0aGUgZm9jdXNlZCBkYXkgaW4gdGhlIGRpc3BsYXllZCBjYWxlbmRhciBoYXMgY2hhbmdlZC5cbiAgICovXG4gIGdldCBmb2N1c2VkRGF5Q2hhbmdlKCk6IE9ic2VydmFibGU8RGF5TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZERheUNoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFRoaXMgc2VydmljZSBmb2N1c2VzIHRoZSBkYXkgdGhhdCBpcyBmb2N1c2FibGUgaW4gdGhlIGNhbGVuZGFyLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckZvY3VzU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX25nWm9uZTogTmdab25lLCBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCkge31cblxuICAvLyBDcmVkaXQ6IE1hdGVyaWFsOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9tYXRlcmlhbDIvYmxvYi9tYXN0ZXIvc3JjL2xpYi9kYXRlcGlja2VyL2NhbGVuZGFyLnRzXG4gIGZvY3VzQ2VsbChlbFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGVcbiAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c0VsID0gZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbdGFiaW5kZXg9XCIwXCJdJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNFbCkge1xuICAgICAgICAgICAgICBmb2N1c0VsLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQge1xuICBGb3JtYXRXaWR0aCxcbiAgRm9ybVN0eWxlLFxuICBnZXRMb2NhbGVEYXRlRm9ybWF0LFxuICBnZXRMb2NhbGVEYXlOYW1lcyxcbiAgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWssXG4gIGdldExvY2FsZU1vbnRoTmFtZXMsXG4gIFRyYW5zbGF0aW9uV2lkdGgsXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIExPQ0FMRV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRoaXMgc2VydmljZSBleHRyYWN0cyB0aGUgQW5ndWxhciBDTERSIGRhdGEgbmVlZGVkIGJ5IHRoZSBkYXRlcGlja2VyLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9jYWxlSGVscGVyU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTE9DQUxFX0lEKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmluaXRpYWxpemVMb2NhbGVEYXRhKCk7XG4gIH1cblxuICBwcml2YXRlIF9maXJzdERheU9mV2VlazogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbG9jYWxlRGF5c05hcnJvdzogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIF9sb2NhbGVNb250aHNBYmJyZXZpYXRlZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIF9sb2NhbGVNb250aHNXaWRlOiBSZWFkb25seUFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgX2xvY2FsZURhdGVGb3JtYXQ6IHN0cmluZztcblxuICBnZXQgZmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3REYXlPZldlZWs7XG4gIH1cblxuICBnZXQgbG9jYWxlRGF5c05hcnJvdygpOiBSZWFkb25seUFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGVEYXlzTmFycm93O1xuICB9XG5cbiAgZ2V0IGxvY2FsZU1vbnRoc0FiYnJldmlhdGVkKCk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZU1vbnRoc0FiYnJldmlhdGVkO1xuICB9XG5cbiAgZ2V0IGxvY2FsZU1vbnRoc1dpZGUoKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlTW9udGhzV2lkZTtcbiAgfVxuXG4gIGdldCBsb2NhbGVEYXRlRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZURhdGVGb3JtYXQ7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGxvY2FsZSBkYXRhLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplTG9jYWxlRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBPcmRlciBpbiB3aGljaCB0aGVzZSBmdW5jdGlvbnMgaXMgY2FsbGVkIGlzIHZlcnkgaW1wb3J0YW50LlxuICAgIHRoaXMuaW5pdGlhbGl6ZUZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgdGhpcy5pbml0aWFsaXplTG9jYWxlRGF0ZUZvcm1hdCgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxvY2FsZU1vbnRoc0FiYnJldmlhdGVkKCk7XG4gICAgdGhpcy5pbml0aWFsaXplTG9jYWxlTW9udGhzV2lkZSgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxvY2FsZURheXNOYXJyb3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGRheSBuYW1lcyBpbiB0aGUgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cgZm9ybWF0IGJhc2VkIG9uIHRoZSBsb2NhbGUuXG4gICAqIGVnOiBbUywgTSwgVC4uLl0gZm9yIGVuLVVTLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplTG9jYWxlRGF5c05hcnJvdygpOiB2b2lkIHtcbiAgICAvLyBHZXQgbG9jYWxlIGRheSBuYW1lcyBzdGFydGluZyB3aXRoIFN1bmRheVxuICAgIGNvbnN0IHRlbXBBcnI6IHN0cmluZ1tdID0gZ2V0TG9jYWxlRGF5TmFtZXModGhpcy5sb2NhbGUsIEZvcm1TdHlsZS5TdGFuZGFsb25lLCBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdykuc2xpY2UoKTtcbiAgICAvLyBHZXQgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGJhc2VkIG9uIHRoZSBsb2NhbGVcbiAgICBjb25zdCBmaXJzdERheU9mV2VlazogbnVtYmVyID0gdGhpcy5maXJzdERheU9mV2VlaztcbiAgICAvLyBSZWFycmFuZ2UgdGhlIHRlbXBBcnIgdG8gc3RhcnQgd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGJhc2VkIG9uIHRoZSBsb2NhbGUuXG4gICAgaWYgKGZpcnN0RGF5T2ZXZWVrID4gMCkge1xuICAgICAgY29uc3QgcHJldkRheXM6IHN0cmluZ1tdID0gdGVtcEFyci5zcGxpY2UoMCwgZmlyc3REYXlPZldlZWspO1xuICAgICAgdGVtcEFyci5wdXNoKC4uLnByZXZEYXlzKTtcbiAgICB9XG4gICAgdGhpcy5fbG9jYWxlRGF5c05hcnJvdyA9IHRlbXBBcnI7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGFycmF5IG9mIG1vbnRoIG5hbWVzIGluIHRoZSBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkIGZvcm1hdC5cbiAgICogZS5nLiBgW0phbiwgRmViLCAuLi5dYCBmb3IgZW4tVVNcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxvY2FsZU1vbnRoc0FiYnJldmlhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2xvY2FsZU1vbnRoc0FiYnJldmlhdGVkID0gZ2V0TG9jYWxlTW9udGhOYW1lcyhcbiAgICAgIHRoaXMubG9jYWxlLFxuICAgICAgRm9ybVN0eWxlLlN0YW5kYWxvbmUsXG4gICAgICBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkXG4gICAgKS5zbGljZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBhcnJheSBvZiBtb250aCBuYW1lcyBpbiB0aGUgVHJhbnNsYXRpb25XaWR0aC5XaWRlIGZvcm1hdC5cbiAgICogZS5nLiBgW0phbnVhcnksIEZlYnJ1YXJ5LCAuLi5dYCBmb3IgZW4tVVNcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxvY2FsZU1vbnRoc1dpZGUoKTogdm9pZCB7XG4gICAgdGhpcy5fbG9jYWxlTW9udGhzV2lkZSA9IGdldExvY2FsZU1vbnRoTmFtZXModGhpcy5sb2NhbGUsIEZvcm1TdHlsZS5TdGFuZGFsb25lLCBUcmFuc2xhdGlvbldpZHRoLldpZGUpLnNsaWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBiYXNlZCBvbiB0aGUgbG9jYWxlLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplRmlyc3REYXlPZldlZWsoKTogdm9pZCB7XG4gICAgdGhpcy5fZmlyc3REYXlPZldlZWsgPSBnZXRMb2NhbGVGaXJzdERheU9mV2Vlayh0aGlzLmxvY2FsZSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMb2NhbGVEYXRlRm9ybWF0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xvY2FsZURhdGVGb3JtYXQgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KHRoaXMubG9jYWxlLCBGb3JtYXRXaWR0aC5TaG9ydCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBET1dOX0FSUk9XLCBMRUZUX0FSUk9XLCBSSUdIVF9BUlJPVywgVVBfQVJST1cgfSBmcm9tICcuLi8uLi91dGlscy9rZXktY29kZXMva2V5LWNvZGVzJztcblxuaW1wb3J0IHsgQ2FsZW5kYXJWaWV3TW9kZWwgfSBmcm9tICcuL21vZGVsL2NhbGVuZGFyLXZpZXcubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb2RlbCB9IGZyb20gJy4vbW9kZWwvY2FsZW5kYXIubW9kZWwnO1xuaW1wb3J0IHsgRGF5TW9kZWwgfSBmcm9tICcuL21vZGVsL2RheS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kYXRlLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlcGlja2VyRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZGF0ZXBpY2tlci1mb2N1cy5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9sb2NhbGUtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTk9fT0ZfREFZU19JTl9BX1dFRUsgfSBmcm9tICcuL3V0aWxzL2NvbnN0YW50cyc7XG5cbkBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2Nsci1jYWxlbmRhcicsIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5odG1sJyB9KVxuZXhwb3J0IGNsYXNzIENsckNhbGVuZGFyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2NhbGVIZWxwZXJTZXJ2aWNlOiBMb2NhbGVIZWxwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2RhdGVOYXZpZ2F0aW9uU2VydmljZTogRGF0ZU5hdmlnYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgX2RhdGVwaWNrZXJGb2N1c1NlcnZpY2U6IERhdGVwaWNrZXJGb2N1c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZWxSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyVmlldygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN1YnNjcmlwdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxlbmRhciBWaWV3IE1vZGVsIHRvIGdlbmVyYXRlIHRoZSBDYWxlbmRhci5cbiAgICovXG4gIGNhbGVuZGFyVmlld01vZGVsOiBDYWxlbmRhclZpZXdNb2RlbDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgbG9jYWxlIGRheXMgYWNjb3JkaW5nIHRvIHRoZSBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdyBmb3JtYXQuXG4gICAqL1xuICBnZXQgbG9jYWxlRGF5c05hcnJvdygpOiBSZWFkb25seUFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGVIZWxwZXJTZXJ2aWNlLmxvY2FsZURheXNOYXJyb3c7XG4gIH1cblxuICBnZXQgY2FsZW5kYXIoKTogQ2FsZW5kYXJNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5kaXNwbGF5ZWRDYWxlbmRhcjtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZERheSgpOiBEYXlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5zZWxlY3RlZERheTtcbiAgfVxuXG4gIGdldCBmb2N1c2VkRGF5KCk6IERheU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLmZvY3VzZWREYXk7XG4gIH1cblxuICBnZXQgdG9kYXkoKTogRGF5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UudG9kYXk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBzdWJzY3JpcHRpb25zIHRvOlxuICAgKiAxLiB1cGRhdGUgdGhlIGNhbGVuZGFyIHZpZXcgbW9kZWwuXG4gICAqIDIuIHVwZGF0ZSB0aGUgZm9jdXNhYmxlIGRheSBpbiB0aGUgY2FsZW5kYXIgdmlldyBtb2RlbC5cbiAgICogMy4gZm9jdXMgb24gdGhlIGZvY3VzYWJsZSBkYXkgaW4gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzLnB1c2goXG4gICAgICB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UuZGlzcGxheWVkQ2FsZW5kYXJDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyVmlldygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxuICAgICAgdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLmZvY3VzZWREYXlDaGFuZ2Uuc3Vic2NyaWJlKChmb2N1c2VkRGF5OiBEYXlNb2RlbCkgPT4ge1xuICAgICAgICB0aGlzLmNhbGVuZGFyVmlld01vZGVsLnVwZGF0ZUZvY3VzYWJsZURheShmb2N1c2VkRGF5KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnMucHVzaChcbiAgICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5mb2N1c09uQ2FsZW5kYXJDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGF0ZXBpY2tlckZvY3VzU2VydmljZS5mb2N1c0NlbGwodGhpcy5fZWxSZWYpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgQ2FsZW5kYXIgVmlldyBiYXNlZCBvbiB0aGUgY2FsZW5kYXIgcmV0cmlldmVkIGZyb20gdGhlIERhdGVOYXZpZ2F0aW9uU2VydmljZS5cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWxlbmRhclZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxlbmRhclZpZXdNb2RlbCA9IG5ldyBDYWxlbmRhclZpZXdNb2RlbChcbiAgICAgIHRoaXMuY2FsZW5kYXIsXG4gICAgICB0aGlzLnNlbGVjdGVkRGF5LFxuICAgICAgdGhpcy5mb2N1c2VkRGF5LFxuICAgICAgdGhpcy50b2RheSxcbiAgICAgIHRoaXMuX2xvY2FsZUhlbHBlclNlcnZpY2UuZmlyc3REYXlPZldlZWtcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGVnYXRlcyBLZXlib2FyZCBhcnJvdyBuYXZpZ2F0aW9uIHRvIHRoZSBEYXRlTmF2aWdhdGlvblNlcnZpY2UuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIHRoaXMuZm9jdXNlZERheSkge1xuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgVVBfQVJST1c6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UuaW5jcmVtZW50Rm9jdXNEYXkoLTEgKiBOT19PRl9EQVlTX0lOX0FfV0VFSyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5pbmNyZW1lbnRGb2N1c0RheShOT19PRl9EQVlTX0lOX0FfV0VFSyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTEVGVF9BUlJPVzpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5pbmNyZW1lbnRGb2N1c0RheSgtMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUklHSFRfQVJST1c6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UuaW5jcmVtZW50Rm9jdXNEYXkoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7IC8vIE5vIGRlZmF1bHQgY2FzZS4gVFNMaW50IHgtKFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIG9uIHRoZSBmb2N1c2FibGUgZGF5IHdoZW4gdGhlIENhbGVuZGFyIFZpZXcgaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fZGF0ZXBpY2tlckZvY3VzU2VydmljZS5mb2N1c0NlbGwodGhpcy5fZWxSZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gc3Vic2NyaXB0aW9ucy5cbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnMuZm9yRWFjaCgoc3ViOiBTdWJzY3JpcHRpb24pID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvY3VzU2VydmljZSB7XG4gIHByaXZhdGUgX2ZvY3VzZWQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBnZXQgZm9jdXNDaGFuZ2UoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgc2V0IGZvY3VzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9mb2N1c2VkLm5leHQoc3RhdGUpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGVGb3JtQ29udHJvbFNlcnZpY2Uge1xuICBwcml2YXRlIF90b3VjaGVkQ2hhbmdlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBnZXQgdG91Y2hlZENoYW5nZSgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdG91Y2hlZENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RpcnR5Q2hhbmdlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBnZXQgZGlydHlDaGFuZ2UoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcnR5Q2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl90b3VjaGVkQ2hhbmdlLm5leHQoKTtcbiAgfVxuXG4gIG1hcmtBc0RpcnR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2RpcnR5Q2hhbmdlLm5leHQoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIEJJR19FTkRJQU4sXG4gIERFRkFVTFRfTE9DQUxFX0ZPUk1BVCxcbiAgREVMSU1JVEVSX1JFR0VYLFxuICBJbnB1dERhdGVEaXNwbGF5Rm9ybWF0LFxuICBMSVRUTEVfRU5ESUFOLFxuICBMSVRUTEVfRU5ESUFOX1JFR0VYLFxuICBNSURETEVfRU5ESUFOLFxuICBNSURETEVfRU5ESUFOX1JFR0VYLFxuICBSVExfUkVHRVgsXG4gIFVTRVJfSU5QVVRfUkVHRVgsXG59IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXROdW1iZXJPZkRheXNJblRoZU1vbnRoLCBwYXJzZVRvRm91ckRpZ2l0WWVhciB9IGZyb20gJy4uL3V0aWxzL2RhdGUtdXRpbHMnO1xuXG5pbXBvcnQgeyBMb2NhbGVIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbGUtaGVscGVyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZUlPU2VydmljZSB7XG4gIHB1YmxpYyBjbGRyTG9jYWxlRGF0ZUZvcm1hdDogc3RyaW5nID0gREVGQVVMVF9MT0NBTEVfRk9STUFUO1xuICBwcml2YXRlIGxvY2FsZURpc3BsYXlGb3JtYXQ6IElucHV0RGF0ZURpc3BsYXlGb3JtYXQgPSBMSVRUTEVfRU5ESUFOO1xuICBwcml2YXRlIGRlbGltaXRlcnM6IFtzdHJpbmcsIHN0cmluZ10gPSBbJy8nLCAnLyddO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvY2FsZUhlbHBlclNlcnZpY2U6IExvY2FsZUhlbHBlclNlcnZpY2UpIHtcbiAgICB0aGlzLmNsZHJMb2NhbGVEYXRlRm9ybWF0ID0gdGhpcy5fbG9jYWxlSGVscGVyU2VydmljZS5sb2NhbGVEYXRlRm9ybWF0O1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxvY2FsZURpc3BsYXlGb3JtYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxvY2FsZURpc3BsYXlGb3JtYXQoKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybWF0OiBzdHJpbmcgPSB0aGlzLmNsZHJMb2NhbGVEYXRlRm9ybWF0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgaWYgKExJVFRMRV9FTkRJQU5fUkVHRVgudGVzdChmb3JtYXQpKSB7XG4gICAgICB0aGlzLmxvY2FsZURpc3BsYXlGb3JtYXQgPSBMSVRUTEVfRU5ESUFOO1xuICAgIH0gZWxzZSBpZiAoTUlERExFX0VORElBTl9SRUdFWC50ZXN0KGZvcm1hdCkpIHtcbiAgICAgIHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdCA9IE1JRERMRV9FTkRJQU47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBzZXQgdG8gQklHLUVORElBTiBGT1JNQVRcbiAgICAgIHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdCA9IEJJR19FTkRJQU47XG4gICAgfVxuICAgIHRoaXMuZXh0cmFjdERlbGltaXRlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdERlbGltaXRlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xkckxvY2FsZURhdGVGb3JtYXQpIHtcbiAgICAgIC8vIFNhbml0aXplIERhdGUgRm9ybWF0LiBSZW1vdmUgUlRMIGNoYXJhY3RlcnMuXG4gICAgICAvLyBGSVhNRTogV2hlbiB3ZSBzdXBwb3J0IFJUTCwgcmVtb3ZlIHRoaXMgYW5kIGhhbmRsZSBpdCBjb3JyZWN0bHkuXG4gICAgICBjb25zdCBsb2NhbGVGb3JtYXQ6IHN0cmluZyA9IHRoaXMuY2xkckxvY2FsZURhdGVGb3JtYXQucmVwbGFjZShSVExfUkVHRVgsICcnKTtcbiAgICAgIGNvbnN0IGRlbGltaXRlcnM6IHN0cmluZ1tdID0gbG9jYWxlRm9ybWF0LnNwbGl0KERFTElNSVRFUl9SRUdFWCk7XG5cbiAgICAgIC8vIE5PVEU6IFRoZSBzcGxpdCBmcm9tIHRoZSBDTERSIGRhdGUgZm9ybWF0IHNob3VsZCBhbHdheXMgcmVzdWx0XG4gICAgICAvLyBpbiBhbiBhcmFyeSB3aXRoIDQgZWxlbWVudHMuIFRoZSAxc3QgYW5kIHRoZSAybmQgdmFsdWVzIGFyZSB0aGUgZGVsaW1pdGVyc1xuICAgICAgLy8gd2Ugd2lsbCB1c2UgaW4gb3JkZXIuXG4gICAgICAvLyBFZzogXCJkZC9NTS95XCIuc3BsaXQoL2QrfG0rfHkrL2kpIHJlc3VsdHMgaW4gW1wiXCIsIFwiL1wiLCBcIi9cIiwgXCJcIl1cbiAgICAgIGlmIChkZWxpbWl0ZXJzICYmIGRlbGltaXRlcnMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgIHRoaXMuZGVsaW1pdGVycyA9IFtkZWxpbWl0ZXJzWzFdLCBkZWxpbWl0ZXJzWzJdXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgZGF0ZSBmb3JtYXQgcmVjZWl2ZWQuIERlbGltaXRlcnMgZXh0cmFjdGVkOiAnLCBkZWxpbWl0ZXJzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b0xvY2FsZURpc3BsYXlGb3JtYXRTdHJpbmcoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0ZU5vOiBudW1iZXIgPSBkYXRlLmdldERhdGUoKTtcbiAgICAgIGNvbnN0IG1vbnRoTm86IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XG4gICAgICBjb25zdCBkYXRlU3RyOiBzdHJpbmcgPSBkYXRlTm8gPiA5ID8gZGF0ZU5vLnRvU3RyaW5nKCkgOiAnMCcgKyBkYXRlTm87XG4gICAgICBjb25zdCBtb250aFN0cjogc3RyaW5nID0gbW9udGhObyA+IDkgPyBtb250aE5vLnRvU3RyaW5nKCkgOiAnMCcgKyBtb250aE5vO1xuICAgICAgaWYgKHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdCA9PT0gTElUVExFX0VORElBTikge1xuICAgICAgICByZXR1cm4gZGF0ZVN0ciArIHRoaXMuZGVsaW1pdGVyc1swXSArIG1vbnRoU3RyICsgdGhpcy5kZWxpbWl0ZXJzWzFdICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZURpc3BsYXlGb3JtYXQgPT09IE1JRERMRV9FTkRJQU4pIHtcbiAgICAgICAgcmV0dXJuIG1vbnRoU3RyICsgdGhpcy5kZWxpbWl0ZXJzWzBdICsgZGF0ZVN0ciArIHRoaXMuZGVsaW1pdGVyc1sxXSArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyB0aGlzLmRlbGltaXRlcnNbMF0gKyBtb250aFN0ciArIHRoaXMuZGVsaW1pdGVyc1sxXSArIGRhdGVTdHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBwbGFjZWhvbGRlclRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb3JtYXQ6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IHRoaXMubG9jYWxlRGlzcGxheUZvcm1hdC5mb3JtYXQ7XG4gICAgcmV0dXJuIGZvcm1hdFswXSArIHRoaXMuZGVsaW1pdGVyc1swXSArIGZvcm1hdFsxXSArIHRoaXMuZGVsaW1pdGVyc1sxXSArIGZvcm1hdFsyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIG1vbnRoIGVudGVyZWQgYnkgdGhlIHVzZXIgaXMgdmFsaWQgb3Igbm90LlxuICAgKiBOb3RlOiBNb250aCBpcyAwIGJhc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1ZhbGlkTW9udGgobW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtb250aCA+IC0xICYmIG1vbnRoIDwgMTI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBkYXRlIGlzIHZhbGlkIGRlcGVuZGluZyBvbiB0aGUgeWVhciBhbmQgbW9udGggcHJvdmlkZWQuXG4gICAqL1xuICBwcml2YXRlIGlzVmFsaWREYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGUgPiAwICYmIGRhdGUgPD0gZ2V0TnVtYmVyT2ZEYXlzSW5UaGVNb250aCh5ZWFyLCBtb250aCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIGFuZCByZXR1cm5zIHRoZSBkYXRlLlxuICAgKiBJZiB0aGUgcGFyYW1ldGVycyBhcmUgbm90XG4gICAqIHZhbGlkIHRoZW4gcmV0dXJuIG51bGwuXG4gICAqIE5PVEU6IChNb250aCBoZXJlIGlzIDEgYmFzZWQgc2luY2UgdGhlIHVzZXIgaGFzIHByb3ZpZGVkIHRoYXQgYXMgYW4gaW5wdXQpXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQW5kR2V0RGF0ZSh5ZWFyOiBzdHJpbmcsIG1vbnRoOiBzdHJpbmcsIGRhdGU6IHN0cmluZyk6IERhdGUge1xuICAgIC8vIEkgZG9uJ3Qga25vdyB3aGF0cyB3cm9uZyB3aXRoIHRoZSBUUyBjb21waWxlci4gSXQgdGhyb3dzIGFuIGVycm9yIGlmIEkgd3JpdGVcbiAgICAvLyB0aGUgYmVsb3cgaWYgc3RhdGVtZW50LiBUaGUgZXJyb3IgaXM6XG4gICAgLy8gT3BlcmF0b3IgJyE9PScgY2Fubm90IGJlIGFwcGxpZWQgdG8gdHlwZXMgJzInIGFuZCAnNCdcbiAgICAvLyBNb3JlIGluZm8gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xMjc5NCNpc3N1ZWNvbW1lbnQtMjcwMzQyOTM2XG4gICAgLypcbiAgICAgICAgaWYgKHllYXIubGVuZ3RoICE9PSAyIHx8IHllYXIubGVuZ3RoICE9PSA0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAqL1xuXG4gICAgLy8gSW5zdGVhZCBJIGhhdmUgdG8gd3JpdGUgdGhlIGxvZ2ljIGxpa2UgdGhpcyB4LShcbiAgICBjb25zdCB5OiBudW1iZXIgPSAreWVhcjtcbiAgICBjb25zdCBtOiBudW1iZXIgPSArbW9udGggLSAxOyAvLyBtb250aCBpcyAwIGJhc2VkXG4gICAgY29uc3QgZDogbnVtYmVyID0gK2RhdGU7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRNb250aChtKSB8fCAhdGhpcy5pc1ZhbGlkRGF0ZSh5LCBtLCBkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyID0gcGFyc2VUb0ZvdXJEaWdpdFllYXIoeSk7XG4gICAgcmV0dXJuIHJlc3VsdCAhPT0gLTEgPyBuZXcgRGF0ZShyZXN1bHQsIG0sIGQpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGlzIHZhbGlkLlxuICAgKi9cbiAgaXNWYWxpZElucHV0KGRhdGU6IHN0cmluZyk6IERhdGUge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRhdGVQYXJ0czogc3RyaW5nW10gPSBkYXRlLm1hdGNoKFVTRVJfSU5QVVRfUkVHRVgpO1xuICAgIGlmICghZGF0ZVBhcnRzIHx8IGRhdGVQYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBbZmlyc3RQYXJ0LCBzZWNvbmRQYXJ0LCB0aGlyZFBhcnRdID0gZGF0ZVBhcnRzO1xuICAgIGlmICh0aGlzLmxvY2FsZURpc3BsYXlGb3JtYXQgPT09IExJVFRMRV9FTkRJQU4pIHtcbiAgICAgIC8vIHNlY29uZFBhcnQgaXMgbW9udGggJiYgZmlyc3RQYXJ0IGlzIGRhdGVcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQW5kR2V0RGF0ZSh0aGlyZFBhcnQsIHNlY29uZFBhcnQsIGZpcnN0UGFydCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZURpc3BsYXlGb3JtYXQgPT09IE1JRERMRV9FTkRJQU4pIHtcbiAgICAgIC8vIGZpcnN0UGFydCBpcyBtb250aCAmJiBzZWNvbmRQYXJ0IGlzIGRhdGVcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQW5kR2V0RGF0ZSh0aGlyZFBhcnQsIGZpcnN0UGFydCwgc2Vjb25kUGFydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNlY29uZFBhcnQgaXMgbW9udGggJiYgdGhpcmRQYXJ0IGlzIGRhdGVcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQW5kR2V0RGF0ZShmaXJzdFBhcnQsIHNlY29uZFBhcnQsIHRoaXJkUGFydCk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbi8vIGlQYWQgbWluaSBzY3JlZW4gd2lkdGhcbi8vIGh0dHA6Ly9zdGVwaGVuLmlvL21lZGlhcXVlcmllcy8jaVBhZE1pbmlcbmV4cG9ydCBjb25zdCBEQVRFUElDS0VSX0VOQUJMRV9CUkVBS1BPSU5UOiBudW1iZXIgPSA3Njg7XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEQVRFUElDS0VSX0VOQUJMRV9CUkVBS1BPSU5UIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYnJlYWtwb2ludHMvYnJlYWtwb2ludHMnO1xuaW1wb3J0IHsgTU9CSUxFX1VTRVJBR0VOVF9SRUdFWCB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyRW5hYmxlZFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuX2RvY3VtZW50KSB7XG4gICAgICB0aGlzLl9pc1VzZXJBZ2VudE1vYmlsZSA9IE1PQklMRV9VU0VSQUdFTlRfUkVHRVgudGVzdChfZG9jdW1lbnQuZGVmYXVsdFZpZXcubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB0aGlzLl9pbm5lcldpZHRoID0gX2RvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGg7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNVc2VyQWdlbnRNb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaW5uZXJXaWR0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGlmIHRoZSBjYWxlbmRhciBzaG91bGQgYmUgYWN0aXZlIG9yIG5vdC5cbiAgICogSWYgdGhlIHVzZXIgYWdlbnQgaXMgbW9iaWxlIGFuZCB0aGUgc2NyZWVuIHdpZHRoIGlzIGxlc3MgdGhhbiBEQVRFUElDS0VSX0FDVElWRV9CUkVBS1BPSU5UXG4gICAqIHRoZW4gdGhlIGNhbGVuZGFyIGlzIGluYWN0aXZlLlxuICAgKi9cbiAgZ2V0IGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jyb3dzZXJfZGV0ZWN0aW9uX3VzaW5nX3RoZV91c2VyX2FnZW50XG4gICAgLy8gV2hhdCB0aGV5IHJlY29tbWVuZCBpczpcbiAgICAvL1wiSW4gc3VtbWFyeSwgd2UgcmVjb21tZW5kIGxvb2tpbmcgZm9yIHRoZSBzdHJpbmcgJ01vYmknXG4gICAgLy8gYW55d2hlcmUgaW4gdGhlIFVzZXIgQWdlbnQgdG8gZGV0ZWN0IGEgbW9iaWxlIGRldmljZS5cIlxuICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgaWYgKHRoaXMuX2lubmVyV2lkdGggPCBEQVRFUElDS0VSX0VOQUJMRV9CUkVBS1BPSU5UICYmIHRoaXMuX2lzVXNlckFnZW50TW9iaWxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBDb250ZW50Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBJZk9wZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZGl0aW9uYWwvaWYtb3Blbi5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuaW1wb3J0IHsgSWZFcnJvclNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vaWYtZXJyb3IvaWYtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBDb250cm9sQ2xhc3NTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9jb250cm9sLWNsYXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udHJvbElkU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1pZC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvY3VzU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvZm9jdXMuc2VydmljZSc7XG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9uZy1jb250cm9sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyTGFiZWwgfSBmcm9tICcuLi9jb21tb24vbGFiZWwnO1xuXG5pbXBvcnQgeyBEYXRlRm9ybUNvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZGF0ZS1mb3JtLWNvbnRyb2wuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlSU9TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZGF0ZS1pby5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RhdGUtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVwaWNrZXJFbmFibGVkU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RhdGVwaWNrZXItZW5hYmxlZC5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9sb2NhbGUtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcbmltcG9ydCB7IElTX05FV19GT1JNU19MQVlPVVQgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL25ldy1mb3Jtcy5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCBjb250YWlucyB0d28gdGVtcGxhdGUgZm9yIHRoZSBvbGQgYW5kIG5ldyBmb3JtcyBsYXlvdXRzLlxuICogV2hlbiBpdCBpcyB0aW1lIHRvIHJlbW92ZSB0aGUgb2xkIGZvcm1zIGxheW91dHMgc3VwcG9ydCwgcmVtb3ZlIHRoZSBuZy10ZW1wbGF0ZXNcbiAqIGFuZCBuZy1jb250YWluZXIsIGFuZCBqdXN0IGtlZXAgdGhlIGlubmVyIGNvbnRlbnQgb2YgdGhlICNuZXdMYXlvdXQgYXMgdGhlIHRlbXBsYXRlXG4gKiBhbmQgbW92ZSB0aGUgbmctY29udGVudCBmb3IgY2xyRGF0ZS5cbiAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItZGF0ZS1jb250YWluZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjb2xkTGF5b3V0PlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbHJEYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJkYXRlcGlja2VyLXRyaWdnZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURhdGVwaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAqbmdJZj1cImlzRW5hYmxlZFwiPlxuICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiY2FsZW5kYXJcIiBjbGFzcz1cImRhdGVwaWNrZXItdHJpZ2dlci1pY29uXCIgW2F0dHIudGl0bGVdPVwiY29tbW9uU3RyaW5ncy5vcGVuXCI+PC9jbHItaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxjbHItZGF0ZXBpY2tlci12aWV3LW1hbmFnZXIgKmNscklmT3BlbiBjbHJGb2N1c1RyYXA+PC9jbHItZGF0ZXBpY2tlci12aWV3LW1hbmFnZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBcbiAgICA8bmctdGVtcGxhdGUgI25ld0xheW91dD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImxhYmVsXCI+PC9uZy1jb250ZW50PlxuICAgICAgPGxhYmVsICpuZ0lmPVwiIWxhYmVsICYmIGFkZEdyaWQoKVwiPjwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2xyLWNvbnRyb2wtY29udGFpbmVyXCIgW25nQ2xhc3NdPVwiY29udHJvbENsYXNzKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsci1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1pbnB1dC1ncm91cFwiIFtjbGFzcy5jbHItZm9jdXNdPVwiZm9jdXNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbHJEYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRhdGVwaWNrZXItdHJpZ2dlclwiIChjbGljayk9XCJ0b2dnbGVEYXRlcGlja2VyKCRldmVudClcIiAqbmdJZj1cImlzRW5hYmxlZFwiIFthdHRyLnRpdGxlXT1cImNvbW1vblN0cmluZ3Mub3BlblwiIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJjYWxlbmRhclwiIGNsYXNzPVwiY2xyLWlucHV0LWdyb3VwLWljb24tYWN0aW9uXCI+PC9jbHItaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGNsci1kYXRlcGlja2VyLXZpZXctbWFuYWdlciAqY2xySWZPcGVuIGNsckZvY3VzVHJhcD48L2Nsci1kYXRlcGlja2VyLXZpZXctbWFuYWdlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Y2xyLWljb24gY2xhc3M9XCJjbHItdmFsaWRhdGUtaWNvblwiIHNoYXBlPVwiZXhjbGFtYXRpb24tY2lyY2xlXCI+PC9jbHItaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1jb250cm9sLWhlbHBlclwiICpuZ0lmPVwiIWludmFsaWRcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1jb250cm9sLWVycm9yXCIgKm5nSWY9XCJpbnZhbGlkXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBcbiAgICA8bmctdGVtcGxhdGUgI2NsckRhdGU+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY2xyRGF0ZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibmV3Rm9ybXNMYXlvdXQ7IHRoZW4gbmV3TGF5b3V0IGVsc2Ugb2xkTGF5b3V0XCI+PC9uZy1jb250YWluZXI+XG4gICAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAgQ29udHJvbElkU2VydmljZSxcbiAgICBJZk9wZW5TZXJ2aWNlLFxuICAgIExvY2FsZUhlbHBlclNlcnZpY2UsXG4gICAgSWZFcnJvclNlcnZpY2UsXG4gICAgQ29udHJvbENsYXNzU2VydmljZSxcbiAgICBGb2N1c1NlcnZpY2UsXG4gICAgTmdDb250cm9sU2VydmljZSxcbiAgICBEYXRlSU9TZXJ2aWNlLFxuICAgIERhdGVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICBEYXRlcGlja2VyRW5hYmxlZFNlcnZpY2UsXG4gICAgRGF0ZUZvcm1Db250cm9sU2VydmljZSxcbiAgXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuZGF0ZS1jb250YWluZXJdJzogJyFuZXdGb3Jtc0xheW91dCcsXG4gICAgJ1tjbGFzcy5jbHItZm9ybS1jb250cm9sLWRpc2FibGVkXSc6ICdjb250cm9sPy5kaXNhYmxlZCcsXG4gICAgJ1tjbGFzcy5jbHItZm9ybS1jb250cm9sXSc6ICduZXdGb3Jtc0xheW91dCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGVDb250YWluZXIgaW1wbGVtZW50cyBEeW5hbWljV3JhcHBlciwgT25EZXN0cm95IHtcbiAgX2R5bmFtaWM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW52YWxpZCA9IGZhbHNlO1xuICBmb2N1cyA9IGZhbHNlO1xuICBjb250cm9sOiBOZ0NvbnRyb2w7XG4gIEBDb250ZW50Q2hpbGQoQ2xyTGFiZWwpIGxhYmVsOiBDbHJMYWJlbDtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaWZPcGVuU2VydmljZTogSWZPcGVuU2VydmljZSxcbiAgICBwcml2YXRlIF9kYXRlTmF2aWdhdGlvblNlcnZpY2U6IERhdGVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIF9kYXRlcGlja2VyRW5hYmxlZFNlcnZpY2U6IERhdGVwaWNrZXJFbmFibGVkU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVGb3JtQ29udHJvbFNlcnZpY2U6IERhdGVGb3JtQ29udHJvbFNlcnZpY2UsXG4gICAgcHVibGljIGNvbW1vblN0cmluZ3M6IENsckNvbW1vblN0cmluZ3MsXG4gICAgcHJpdmF0ZSBpZkVycm9yU2VydmljZTogSWZFcnJvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb2N1c1NlcnZpY2U6IEZvY3VzU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRyb2xDbGFzc1NlcnZpY2U6IENvbnRyb2xDbGFzc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChJU19ORVdfRk9STVNfTEFZT1VUKVxuICAgIHB1YmxpYyBuZXdGb3Jtc0xheW91dDogYm9vbGVhbixcbiAgICBwcml2YXRlIG5nQ29udHJvbFNlcnZpY2U6IE5nQ29udHJvbFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLl9pZk9wZW5TZXJ2aWNlLm9wZW5DaGFuZ2Uuc3Vic2NyaWJlKG9wZW4gPT4ge1xuICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNhbGVuZGFyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuZm9jdXNTZXJ2aWNlLmZvY3VzQ2hhbmdlLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXMgPSBzdGF0ZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubmdDb250cm9sU2VydmljZS5jb250cm9sQ2hhbmdlcy5zdWJzY3JpYmUoY29udHJvbCA9PiB7XG4gICAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuaWZFcnJvclNlcnZpY2Uuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoaW52YWxpZCA9PiB7XG4gICAgICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgY29udHJvbFxuICAgKi9cbiAgY29udHJvbENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xDbGFzc1NlcnZpY2UuY29udHJvbENsYXNzKHRoaXMuaW52YWxpZCwgdGhpcy5hZGRHcmlkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGNvbnRyb2wgbmVlZHMgdG8gYWRkIGdyaWQgY2xhc3Nlc1xuICAgKi9cbiAgYWRkR3JpZCgpIHtcbiAgICBpZiAodGhpcy5sYXlvdXRTZXJ2aWNlICYmICF0aGlzLmxheW91dFNlcnZpY2UuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaWYgdGhlIERhdGVwaWNrZXIgaXMgZW5hYmxlZCBvciBub3QuIElmIGRpc2FibGVkLCBoaWRlcyB0aGUgZGF0ZXBpY2tlciB0cmlnZ2VyLlxuICAgKi9cbiAgZ2V0IGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZXBpY2tlckVuYWJsZWRTZXJ2aWNlLmlzRW5hYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgdGhlIHVzZXIgaW5wdXQgYW5kIEluaXRpYWxpemVzIHRoZSBDYWxlbmRhciBldmVyeXRpbWUgdGhlIGRhdGVwaWNrZXIgcG9wb3ZlciBpcyBvcGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLmluaXRpYWxpemVDYWxlbmRhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIERhdGVwaWNrZXIgUG9wb3Zlci5cbiAgICovXG4gIHRvZ2dsZURhdGVwaWNrZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLl9pZk9wZW5TZXJ2aWNlLnRvZ2dsZVdpdGhFdmVudChldmVudCk7XG4gICAgdGhpcy5kYXRlRm9ybUNvbnRyb2xTZXJ2aWNlLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMubWFwKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIFJlbmRlcmVyMixcbiAgU2VsZixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2ZvY3VzLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBXcmFwcGVkRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9jb21tb24vd3JhcHBlZC1jb250cm9sJztcblxuaW1wb3J0IHsgQ2xyRGF0ZUNvbnRhaW5lciB9IGZyb20gJy4vZGF0ZS1jb250YWluZXInO1xuaW1wb3J0IHsgRGF5TW9kZWwgfSBmcm9tICcuL21vZGVsL2RheS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlRm9ybUNvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZGF0ZS1mb3JtLWNvbnRyb2wuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlSU9TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZGF0ZS1pby5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RhdGUtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVwaWNrZXJFbmFibGVkU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RhdGVwaWNrZXItZW5hYmxlZC5zZXJ2aWNlJztcbmltcG9ydCB7IElTX05FV19GT1JNU19MQVlPVVQgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL25ldy1mb3Jtcy5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NsckRhdGVdJyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuZGF0ZS1pbnB1dF0nOiAnIW5ld0Zvcm1zTGF5b3V0JyxcbiAgICAnW2NsYXNzLmNsci1pbnB1dF0nOiAnbmV3Rm9ybXNMYXlvdXQnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRlSW5wdXQgZXh0ZW5kcyBXcmFwcGVkRm9ybUNvbnRyb2w8Q2xyRGF0ZUNvbnRhaW5lcj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBpbmRleCA9IDQ7XG5cbiAgLy9XZSBuZWVkIHRoaXMgdmFyaWFibGUgYmVjYXVzZSBpZiB0aGUgZGF0ZSBpbnB1dCBoYXMgYSB2YWx1ZSBpbml0aWFsaXplZFxuICAvL3dlIGRvIG5vdCBvdXRwdXQgaXQuIFRoaXMgdmFyaWFibGUgaXMgZmFsc2UgZHVyaW5nIGluaXRpYWwgbG9hZC4gV2UgbWFrZSBzdXJlIHRoYXRcbiAgLy9kdXJpbmcgaW5pdGlhbCBsb2FkIGRheU1vZGVsT3V0cHV0dGVkIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNvIHRoYXQgaW5pdGlhbGl6ZWRcbiAgLy92YWx1ZSBpc24ndCBlbWl0dGVkIGJhY2sgdG8gdGhlIHVzZXIuIEFmdGVyIGluaXRpYWwgbG9hZCxcbiAgLy93ZSBzZXQgdGhpcyB0byB0cnVlIGFuZCB0aGUgZGF5TW9kZWxPdXRwdXR0ZWQgaXMgc2V0IG9ubHlcbiAgLy93aGVuIHRoZSBPdXRwdXQgaXMgZW1pdHRlZCB0byB0aGUgdXNlci5cbiAgcHJpdmF0ZSBwcmV2aW91c091dHB1dEluaXRpYWxpemVkRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHByZXZpb3VzT3V0cHV0OiBEYXlNb2RlbDtcblxuICBwcml2YXRlIGluaXRpYWxpemVQcmV2aW91c091dHB1dChkYXlNb2RlbDogRGF5TW9kZWwpIHtcbiAgICBpZiAoIXRoaXMucHJldmlvdXNPdXRwdXRJbml0aWFsaXplZEZsYWcpIHtcbiAgICAgIHRoaXMucHJldmlvdXNPdXRwdXQgPSBkYXlNb2RlbDtcbiAgICAgIHRoaXMucHJldmlvdXNPdXRwdXRJbml0aWFsaXplZEZsYWcgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIGNsck5ld0xheW91dDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBlbDogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAU2VsZigpXG4gICAgQE9wdGlvbmFsKClcbiAgICBwcm90ZWN0ZWQgY29udHJvbDogTmdDb250cm9sLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udGFpbmVyOiBDbHJEYXRlQ29udGFpbmVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2RhdGVJT1NlcnZpY2U6IERhdGVJT1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZGF0ZU5hdmlnYXRpb25TZXJ2aWNlOiBEYXRlTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZGF0ZXBpY2tlckVuYWJsZWRTZXJ2aWNlOiBEYXRlcGlja2VyRW5hYmxlZFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXRlRm9ybUNvbnRyb2xTZXJ2aWNlOiBEYXRlRm9ybUNvbnRyb2xTZXJ2aWNlLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9jdXNTZXJ2aWNlOiBGb2N1c1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KElTX05FV19GT1JNU19MQVlPVVQpXG4gICAgcHVibGljIG5ld0Zvcm1zTGF5b3V0OiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHZjciwgQ2xyRGF0ZUNvbnRhaW5lciwgaW5qZWN0b3IsIGNvbnRyb2wsIHJlbmRlcmVyLCBlbCk7XG4gIH1cblxuICAvKipcbiAgICogMS4gUG9wdWxhdGUgc2VydmljZXMgaWYgdGhlIGRhdGUgY29udGFpbmVyIGlzIG5vdCBwcmVzZW50LlxuICAgKiAyLiBJbml0aWFsaXplIFN1YnNjcmlwdGlvbnMuXG4gICAqIDMuIFByb2Nlc3MgVXNlciBJbnB1dC5cbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy5wb3B1bGF0ZUNvbnRhaW5lclNlcnZpY2VzKCk7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZVN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLnByb2Nlc3NJbml0aWFsSW5wdXRzKCk7XG4gICAgaWYgKHRoaXMuY2xyTmV3TGF5b3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubmV3Rm9ybXNMYXlvdXQgPSAhIXRoaXMuY2xyTmV3TGF5b3V0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoZSBpbnB1dHMgaW5pdGlhbGl6ZWQgYnkgdGhlIHVzZXIgd2hpY2ggd2VyZSBtaXNzZWRcbiAgICogYmVjYXVzZSBvZiBsYXRlIHN1YnNjcmlwdGlvbnMgb3IgbGlmZWN5Y2xlIG1ldGhvZCBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc0luaXRpYWxJbnB1dHMoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzVXNlckRhdGVPYmplY3QodGhpcy5kYXRlVmFsdWVPbkluaXRpYWxMb2FkKTtcblxuICAgIC8vIEhhbmRsZSBJbml0YWwgVmFsdWUgZnJvbSBSZWFjdGl2ZSBGb3Jtc1xuICAgIC8vIFRPRE86IFdlIGFyZSByZXBlYXRpbmcgdGhpcyBsb2dpYyBhdCBtdWx0aXBsZSBwbGFjZXMuIFRoaXMgbWFrZXMgbWUgdGhpbmtcbiAgICAvLyBpZiB0aGlzIGNsYXNzIHNob3VsZCBoYXZlIGltcGxlbWVudGVkIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2UuXG4gICAgLy8gV2lsbCBleHBsb3JlIHRoYXQgbGF0ZXIgYW5kIHNlZSBpZiBpdHMgYSBjbGVhbmVyIHNvbHV0aW9uLlxuICAgIGlmICh0aGlzLmNvbnRyb2wgJiYgdGhpcy5jb250cm9sLnZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUlucHV0VmFsdWUodGhpcy5jb250cm9sLnZhbHVlKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVByZXZpb3VzT3V0cHV0KHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5zZWxlY3RlZERheSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIHRoZSBpbml0aWFsIGlucHV0IHNldCBieSB0aGUgdXNlciBvbiB0byB0aGUgaW5wdXQgZmllbGQuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gSSBkb24ndCBrbm93IHdoeSBJIGhhdmUgdG8gZG8gdGhpcyBidXQgYWZ0ZXIgdXNpbmcgdGhlIG5ldyBIb3N0V3JhcHBpbmcgTW9kdWxlIEkgaGF2ZSB0byBkZWxheSB0aGUgcHJvY2Vzc2luZ1xuICAgIC8vIG9mIHRoZSBpbml0aWFsIElucHV0IHNldCBieSB0aGUgdXNlciB0byBoZXJlLiAgSWYgSSBkbyBub3QgMiBpc3N1ZXMgb2NjdXI6XG4gICAgLy8gMS4gdGhlIElucHV0IHNldHRlciBpcyBjYWxsZWQgYmVmb3JlIG5nT25Jbml0LiBuZ09uSW5pdCBpbml0aWFsaXplcyB0aGUgc2VydmljZXMgd2l0aG91dCB3aGljaCB0aGUgc2V0dGVyXG4gICAgLy8gZmFpbHNcbiAgICAvLyAyLiBUaGUgUmVuZGVyZXIgZG9lc24ndCB3b3JrIGJlZm9yZSBuZ0FmdGVyVmlld0luaXRcbiAgICAvLyhJdCB1c2VkIHRvIGJlZm9yZSB0aGUgbmV3IEhvc3RXcmFwcGluZyBNb2R1bGUgZm9yIHNvbWUgcmVhc29uKS5cbiAgICAvLyBJIG5lZWQgdGhlIHJlbmRlcmVyIHRvIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgb24gdGhlIGlucHV0IHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZSB1c2VyIGhhcyBzdXBwbGllZCBhIERhdGVcbiAgICAvLyBpbnB1dCBvYmplY3QsICB3ZSByZWZsZWN0IGl0IHdpdGggdGhlIHJpZ2h0IGRhdGUgb24gdGhlIGlucHV0IGZpZWxkIHVzaW5nIHRoZSBJTyBzZXJ2aWNlLiAgSSBhbSBub3Qgc3VyZSBpZlxuICAgIC8vIHRoZXNlIGFyZSBtYWpvciBpc3N1ZXMgb3Igbm90IGJ1dCBqdXN0IG5vdGluZyB0aGVtIGRvd24gaGVyZS5cbiAgICBpZiAodGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlKSB7XG4gICAgICBjb25zdCBzZWxEYXk6IERheU1vZGVsID0gdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLnNlbGVjdGVkRGF5O1xuICAgICAgaWYgKHNlbERheSkge1xuICAgICAgICBjb25zdCBkYXRlU3RyOiBzdHJpbmcgPSB0aGlzLl9kYXRlSU9TZXJ2aWNlLnRvTG9jYWxlRGlzcGxheUZvcm1hdFN0cmluZyhzZWxEYXkudG9EYXRlKCkpO1xuICAgICAgICB0aGlzLndyaXRlRGF0ZVN0clRvSW5wdXRGaWVsZChkYXRlU3RyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbml0aWFsTG9hZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvcHVsYXRlcyB0aGUgc2VydmljZXMgZnJvbSB0aGUgY29udGFpbmVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgcG9wdWxhdGVDb250YWluZXJTZXJ2aWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlSU9TZXJ2aWNlID0gdGhpcy5nZXRQcm92aWRlckZyb21Db250YWluZXIoRGF0ZUlPU2VydmljZSk7XG4gICAgdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlID0gdGhpcy5nZXRQcm92aWRlckZyb21Db250YWluZXIoRGF0ZU5hdmlnYXRpb25TZXJ2aWNlKTtcbiAgICB0aGlzLl9kYXRlcGlja2VyRW5hYmxlZFNlcnZpY2UgPSB0aGlzLmdldFByb3ZpZGVyRnJvbUNvbnRhaW5lcihEYXRlcGlja2VyRW5hYmxlZFNlcnZpY2UpO1xuICAgIHRoaXMuZGF0ZUZvcm1Db250cm9sU2VydmljZSA9IHRoaXMuZ2V0UHJvdmlkZXJGcm9tQ29udGFpbmVyKERhdGVGb3JtQ29udHJvbFNlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgZGF0ZSBzdHJpbmcgdmFsdWUgdG8gdGhlIGlucHV0IGZpZWxkXG4gICAqL1xuICBwcml2YXRlIHdyaXRlRGF0ZVN0clRvSW5wdXRGaWVsZCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbExvYWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIGRhdGVWYWx1ZU9uSW5pdGlhbExvYWQ6IERhdGU7XG5cbiAgLyoqXG4gICAqIEphdmFzY3JpcHQgRGF0ZSBvYmplY3QgaW5wdXQgc2V0IGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgQElucHV0KCdjbHJEYXRlJylcbiAgc2V0IGRhdGUodmFsdWU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsTG9hZCkge1xuICAgICAgLy8gU3RvcmUgZGF0ZSB2YWx1ZSBwYXNzZWQgYnkgdGhlIHVzZXIgdG8gcHJvY2VzcyBhZnRlciB0aGUgc2VydmljZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5XG4gICAgICAvLyB0aGUgbmdPbkluaXQgaG9vay5cbiAgICAgIHRoaXMuZGF0ZVZhbHVlT25Jbml0aWFsTG9hZCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2Nlc3NVc2VyRGF0ZU9iamVjdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhIGRhdGUgb2JqZWN0IHRvIGNoZWNrIGlmIGl0cyB2YWxpZCBvciBub3QuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NVc2VyRGF0ZU9iamVjdCh2YWx1ZTogRGF0ZSkge1xuICAgIGlmICh0aGlzLl9kYXRlSU9TZXJ2aWNlKSB7XG4gICAgICAvLyBUaGUgZGF0ZSBvYmplY3QgaXMgY29udmVydGVkIGJhY2sgdG8gc3RyaW5nIGJlY2F1c2UgaW4gSmF2YXNjcmlwdCB5b3UgY2FuIGNyZWF0ZSBhIGRhdGUgb2JqZWN0XG4gICAgICAvLyBsaWtlIHRoaXM6IG5ldyBEYXRlKFwiVGVzdFwiKS4gVGhpcyBpcyBhIGRhdGUgb2JqZWN0IGJ1dCBpdCBpcyBpbnZhbGlkLiBDb252ZXJ0aW5nIHRoZSBkYXRlIG9iamVjdFxuICAgICAgLy8gdGhhdCB0aGUgdXNlciBwYXNzZWQgaGVscHMgdXMgdG8gdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiB0aGUgZGF0ZSBvYmplY3QuXG4gICAgICBjb25zdCBkYXRlU3RyOiBzdHJpbmcgPSB0aGlzLl9kYXRlSU9TZXJ2aWNlLnRvTG9jYWxlRGlzcGxheUZvcm1hdFN0cmluZyh2YWx1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZUlucHV0VmFsdWUoZGF0ZVN0cik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbnB1dFZhbHVlKGRhdGVTdHI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGU6IERhdGUgPSB0aGlzLl9kYXRlSU9TZXJ2aWNlLmlzVmFsaWRJbnB1dChkYXRlU3RyKTtcbiAgICBpZiAoZGF0ZSkge1xuICAgICAgY29uc3QgZGF5TW9kZWw6IERheU1vZGVsID0gbmV3IERheU1vZGVsKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gICAgICBpZiAoIWRheU1vZGVsLmlzRXF1YWwodGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLnNlbGVjdGVkRGF5KSkge1xuICAgICAgICB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2Uuc2VsZWN0ZWREYXkgPSBkYXlNb2RlbDtcbiAgICAgICAgdGhpcy53cml0ZURhdGVTdHJUb0lucHV0RmllbGQoZGF0ZVN0cik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5zZWxlY3RlZERheSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGF0ZSBmb3JtYXQgZm9yIHRoZSBwbGFjZWhvbGRlciBhY2NvcmRpbmcgdG8gd2hpY2ggdGhlIGlucHV0IHNob3VsZCBiZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnBsYWNlaG9sZGVyJylcbiAgZ2V0IHBsYWNlaG9sZGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyID8gdGhpcy5wbGFjZWhvbGRlciA6IHRoaXMuX2RhdGVJT1NlcnZpY2UucGxhY2Vob2xkZXJUZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0IHR5cGUgdG8gdGV4dCB3aGVuIHRoZSBkYXRlcGlja2VyIGlzIGVuYWJsZWQuIFJldmVydHMgYmFjayB0byB0aGUgbmF0aXZlIGRhdGUgaW5wdXRcbiAgICogd2hlbiB0aGUgZGF0ZXBpY2tlciBpcyBkaXNhYmxlZC4gRGF0ZXBpY2tlciBpcyBkaXNhYmxlZCBvbiBtb2JpbGVzLlxuICAgKi9cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnR5cGUnKVxuICBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgdGhpcy5fZGF0ZXBpY2tlckVuYWJsZWRTZXJ2aWNlLmlzRW5hYmxlZCA/ICd0ZXh0JyA6ICdkYXRlJztcbiAgfVxuXG4gIC8vXG4gIC8vIE91dHB1dCBNYW5hZ2VtZW50XG4gIC8vIE5vdGU6IEZvciBub3cgd2Ugd2lsbCBub3QgZW1pdCBib3RoIGNsckRhdGVDaGFuZ2UgYW5kIG5nQ29udHJvbCBvdXRwdXRzXG4gIC8vIGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMgcmVxdWlyZXMgdXMgdG8gbGlzdGVuIHRvIGtleWRvd24gYW5kIGJsdXIgZXZlbnRzIHRvIGZpZ3VyZSBvdXRcbiAgLy8gZXhhY3RseSB3aGVuIHRoZSBPdXRwdXQgc2hvdWxkIGJlIGVtaXR0ZWQuXG4gIC8vIE91ciByZWNvbW1lbmRhdGlvbiByaWdodCBub3cgaXMgdG8gZWl0aGVyIHVzZSBjbHJEYXRlIG9yIHVzZSBuZ01vZGVsL0Zvcm1Db250cm9sLlxuICAvLyBEbyBub3QgdXNlIGJvdGggb2YgdGhlbSB0b2dldGhlci5cbiAgLy9cblxuICBAT3V0cHV0KCdjbHJEYXRlQ2hhbmdlJykgX2RhdGVVcGRhdGVkOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KGZhbHNlKTtcblxuICBwcml2YXRlIGVtaXREYXRlT3V0cHV0KGRheU1vZGVsOiBEYXlNb2RlbCk6IHZvaWQge1xuICAgIGlmIChkYXlNb2RlbCAmJiAhZGF5TW9kZWwuaXNFcXVhbCh0aGlzLnByZXZpb3VzT3V0cHV0KSkge1xuICAgICAgdGhpcy5fZGF0ZVVwZGF0ZWQuZW1pdChkYXlNb2RlbC50b0RhdGUoKSk7XG4gICAgICB0aGlzLnByZXZpb3VzT3V0cHV0ID0gZGF5TW9kZWw7XG4gICAgfSBlbHNlIGlmICghZGF5TW9kZWwgJiYgdGhpcy5wcmV2aW91c091dHB1dCkge1xuICAgICAgdGhpcy5fZGF0ZVVwZGF0ZWQuZW1pdChudWxsKTtcbiAgICAgIHRoaXMucHJldmlvdXNPdXRwdXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgc2V0Rm9jdXNTdGF0ZXMoKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmZvY3VzU2VydmljZS5mb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgdHJpZ2dlclZhbGlkYXRpb24oKSB7XG4gICAgc3VwZXIudHJpZ2dlclZhbGlkYXRpb24oKTtcbiAgICBpZiAodGhpcy5mb2N1c1NlcnZpY2UpIHtcbiAgICAgIHRoaXMuZm9jdXNTZXJ2aWNlLmZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgdGhpcyBtZXRob2Qgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBpbnB1dCBmb2N1c2VzIG91dCBvZiB0aGUgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudC50YXJnZXQnXSlcbiAgb25WYWx1ZUNoYW5nZSh0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICBjb25zdCB2YWx1ZTogc3RyaW5nID0gdGFyZ2V0LnZhbHVlO1xuICAgIGNvbnN0IGRhdGU6IERhdGUgPSB0aGlzLl9kYXRlSU9TZXJ2aWNlLmlzVmFsaWRJbnB1dCh2YWx1ZSk7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIGNvbnN0IGRheU1vZGVsOiBEYXlNb2RlbCA9IG5ldyBEYXlNb2RlbChkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLnNlbGVjdGVkRGF5ID0gZGF5TW9kZWw7XG4gICAgICB0aGlzLmVtaXREYXRlT3V0cHV0KGRheU1vZGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLnNlbGVjdGVkRGF5ID0gbnVsbDtcbiAgICAgIHRoaXMuZW1pdERhdGVPdXRwdXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgRGF0ZUlPIFN1YnNjcmlwdGlvbnNcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZSAmJiB0aGlzLl9kYXRlSU9TZXJ2aWNlKSB7XG4gICAgICAvLyBUaGlzIHN1YnNjcmlwdGlvbiBpcyBmaXJlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBkYXRlIGZyb20gdGhlIHBvcG92ZXIuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLnNlbGVjdGVkRGF5Q2hhbmdlLnN1YnNjcmliZSgoZGF5TW9kZWw6IERheU1vZGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0ZVN0cjogc3RyaW5nID0gdGhpcy5fZGF0ZUlPU2VydmljZS50b0xvY2FsZURpc3BsYXlGb3JtYXRTdHJpbmcoZGF5TW9kZWwudG9EYXRlKCkpO1xuICAgICAgICAgIHRoaXMud3JpdGVEYXRlU3RyVG9JbnB1dEZpZWxkKGRhdGVTdHIpO1xuICAgICAgICAgIC8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG5nTW9kZWxDaGFuZ2UgaXMgZmlyZWRcbiAgICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy5cbiAgICAgICAgICAvLyBOT1RFOiBJdHMgaW1wb3J0YW50IHRvIHVzZSBOZ0NvbnRyb2wgYW5kIG5vdCBOZ01vZGVsIGJlY2F1c2VcbiAgICAgICAgICAvLyBOZ01vZGVsIG9ubHkgd29ya3Mgd2l0aCB0ZW1wbGF0ZSBkcml2ZW4gZm9ybXNcbiAgICAgICAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuY29udHJvbC5zZXRWYWx1ZShkYXRlU3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0RGF0ZU91dHB1dChkYXlNb2RlbCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBXZSBkbyBub3QgZW1pdCBhbiBPdXRwdXQgZnJvbSB0aGlzIHN1YnNjcmlwdGlvbiBiZWNhdXNlXG4gICAgICAvLyB3ZSBvbmx5IGVtaXQgdGhlIE91dHB1dCB3aGVuIHRoZSB1c2VyIGhhcyBmb2N1c2VkIG91dCBvZiB0aGUgaW5wdXQuXG4gICAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gdGhpcy5fZGF0ZUlPU2VydmljZS5pc1ZhbGlkSW5wdXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGF5TW9kZWw6IERheU1vZGVsID0gbmV3IERheU1vZGVsKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5zZWxlY3RlZERheSA9IGRheU1vZGVsO1xuICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQcmV2aW91c091dHB1dChkYXlNb2RlbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2Uuc2VsZWN0ZWREYXkgPSBudWxsO1xuICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQcmV2aW91c091dHB1dChudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVByZXZpb3VzT3V0cHV0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZUZvcm1Db250cm9sU2VydmljZSkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1Db250cm9sU2VydmljZS50b3VjaGVkQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLmRhdGVGb3JtQ29udHJvbFNlcnZpY2UuZGlydHlDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgUmVuZGVyZXIyLFxuICBTa2lwU2VsZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSWZPcGVuU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmRpdGlvbmFsL2lmLW9wZW4uc2VydmljZSc7XG5pbXBvcnQgeyBFU0MgfSBmcm9tICcuLi8uLi91dGlscy9rZXktY29kZXMva2V5LWNvZGVzJztcblxuaW1wb3J0IHsgUG9pbnQsIFBvcG92ZXIgfSBmcm9tICcuL3BvcG92ZXInO1xuaW1wb3J0IHsgUG9wb3Zlck9wdGlvbnMgfSBmcm9tICcuL3BvcG92ZXItb3B0aW9ucy5pbnRlcmZhY2UnO1xuXG4vLyBMaXRlcmFsbHkgYW55IGFubm90YXRpb24gd291bGQgd29yayBoZXJlLCBidXQgd3JpdGluZyBvdXIgb3duIEBIb25leUJhZGdlciBhbm5vdGF0aW9uIGZlZWxzIG92ZXJraWxsLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UG9wb3ZlciBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3RvciwgQFNraXBTZWxmKCkgcHJvdGVjdGVkIHBhcmVudEhvc3Q6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLmVsID0gaW5qZWN0b3IuZ2V0KEVsZW1lbnRSZWYpO1xuICAgIHRoaXMuaWZPcGVuU2VydmljZSA9IGluamVjdG9yLmdldChJZk9wZW5TZXJ2aWNlKTtcbiAgICB0aGlzLnJlbmRlcmVyID0gaW5qZWN0b3IuZ2V0KFJlbmRlcmVyMik7XG4gICAgLy8gRGVmYXVsdCBhbmNob3IgaXMgdGhlIHBhcmVudCBob3N0XG4gICAgdGhpcy5hbmNob3JFbGVtID0gcGFyZW50SG9zdC5uYXRpdmVFbGVtZW50O1xuXG4gICAgdGhpcy5wb3BvdmVySW5zdGFuY2UgPSBuZXcgUG9wb3Zlcih0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW5DaGFuZ2Uuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICBpZiAoY2hhbmdlKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yKCk7XG4gICAgICAgIHRoaXMuYXR0YWNoRVNDTGlzdGVuZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVsZWFzZSgpO1xuICAgICAgICB0aGlzLmRldGFjaEVTQ0xpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaWZPcGVuU2VydmljZS5vcGVuKSB7XG4gICAgICB0aGlzLmFuY2hvcigpO1xuICAgICAgdGhpcy5hdHRhY2hFU0NMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbDogRWxlbWVudFJlZjtcbiAgcHJvdGVjdGVkIGlmT3BlblNlcnZpY2U6IElmT3BlblNlcnZpY2U7XG4gIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyO1xuXG4gIHByaXZhdGUgcG9wb3Zlckluc3RhbmNlOiBQb3BvdmVyO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgdXBkYXRlQW5jaG9yID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGFuY2hvckVsZW06IGFueTtcbiAgcHJvdGVjdGVkIGFuY2hvclBvaW50OiBQb2ludDtcbiAgcHJvdGVjdGVkIHBvcG92ZXJQb2ludDogUG9pbnQ7XG4gIHByb3RlY3RlZCBwb3BvdmVyT3B0aW9uczogUG9wb3Zlck9wdGlvbnMgPSB7fTtcblxuICBwcm90ZWN0ZWQgaWdub3JlZEVsZW1lbnQ6IGFueTtcblxuICBwcm90ZWN0ZWQgYW5jaG9yKCkge1xuICAgIHRoaXMudXBkYXRlQW5jaG9yID0gdHJ1ZTtcbiAgICAvLyBVZ2hcbiAgICB0aGlzLmlnbm9yZSA9IHRoaXMuaWZPcGVuU2VydmljZS5vcmlnaW5hbEV2ZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5kZXRhY2hPdXRzaWRlQ2xpY2tMaXN0ZW5lcigpO1xuICAgIHRoaXMucG9wb3Zlckluc3RhbmNlLnJlbGVhc2UoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy51cGRhdGVBbmNob3IpIHtcbiAgICAgIHRoaXMudXBkYXRlQW5jaG9yID0gZmFsc2U7XG4gICAgICB0aGlzLnBvcG92ZXJJbnN0YW5jZVxuICAgICAgICAuYW5jaG9yKHRoaXMuYW5jaG9yRWxlbSwgdGhpcy5hbmNob3JQb2ludCwgdGhpcy5wb3BvdmVyUG9pbnQsIHRoaXMucG9wb3Zlck9wdGlvbnMpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIC8vIGlmIGEgc2Nyb2xsIGV2ZW50IGlzIGRldGVjdGVkLCBjbG9zZSB0aGUgcG9wb3ZlclxuICAgICAgICAgIHRoaXMuaWZPcGVuU2VydmljZS5vcGVuID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5hdHRhY2hPdXRzaWRlQ2xpY2tMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMucmVsZWFzZSgpO1xuICAgIHRoaXMuZGV0YWNoRVNDTGlzdGVuZXIoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLypcbiAgICAgKiBGYWxsYmFjayB0byBoaWRlIHdoZW4gKmNscklmT3BlbiBpcyBub3QgYmVpbmcgdXNlZFxuICAgICAqL1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtb2ZmLXNjcmVlbicpXG4gIGdldCBpc09mZlNjcmVlbigpIHtcbiAgICByZXR1cm4gdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW4gPyBmYWxzZSA6IHRydWU7XG4gIH1cblxuICAvKlxuICAgICAqIFVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzg3ODUgaXMgc3VwcG9ydGVkLCB3ZSBkb24ndCBoYXZlIGFueSB3YXkgdG8gaW5zdGFudGlhdGVcbiAgICAgKiBhIHNlcGFyYXRlIGRpcmVjdGl2ZSBvbiB0aGUgaG9zdC4gU28gbGV0J3MgZG8gZGlydHkgYnV0IHBlcmZvcm1hbnQgZm9yIG5vdy5cbiAgICAgKi9cbiAgcHVibGljIGNsb3NlT25PdXRzaWRlQ2xpY2sgPSBmYWxzZTtcbiAgcHJpdmF0ZSBob3N0Q2xpY2tMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBkb2N1bWVudENsaWNrTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgZG9jdW1lbnRFU0NMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpZ25vcmVkRWxlbWVudENsaWNrTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaWdub3JlOiBhbnk7XG5cbiAgcHJpdmF0ZSBhdHRhY2hFU0NMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLmRvY3VtZW50RVNDTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAna2V5ZG93bicsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCAmJiBldmVudC5rZXlDb2RlID09PSBFU0MpIHtcbiAgICAgICAgdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0YWNoRVNDTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnRFU0NMaXN0ZW5lcikge1xuICAgICAgdGhpcy5kb2N1bWVudEVTQ0xpc3RlbmVyKCk7XG4gICAgICBkZWxldGUgdGhpcy5kb2N1bWVudEVTQ0xpc3RlbmVyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoT3V0c2lkZUNsaWNrTGlzdGVuZXIoKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VPbk91dHNpZGVDbGljaykge1xuICAgICAgdGhpcy5ob3N0Q2xpY2tMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgZXZlbnQgPT4gKHRoaXMuaWdub3JlID0gZXZlbnQpKTtcbiAgICAgIGlmICh0aGlzLmlnbm9yZWRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaWdub3JlZEVsZW1lbnRDbGlja0xpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oXG4gICAgICAgICAgdGhpcy5pZ25vcmVkRWxlbWVudCxcbiAgICAgICAgICAnY2xpY2snLFxuICAgICAgICAgIGV2ZW50ID0+ICh0aGlzLmlnbm9yZSA9IGV2ZW50KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgIGlmIChldmVudCA9PT0gdGhpcy5pZ25vcmUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5pZ25vcmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hPdXRzaWRlQ2xpY2tMaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5jbG9zZU9uT3V0c2lkZUNsaWNrKSB7XG4gICAgICBpZiAodGhpcy5ob3N0Q2xpY2tMaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmhvc3RDbGlja0xpc3RlbmVyKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmhvc3RDbGlja0xpc3RlbmVyO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaWdub3JlZEVsZW1lbnRDbGlja0xpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuaWdub3JlZEVsZW1lbnRDbGlja0xpc3RlbmVyKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmlnbm9yZWRFbGVtZW50Q2xpY2tMaXN0ZW5lcjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRvY3VtZW50Q2xpY2tMaXN0ZW5lcikge1xuICAgICAgICB0aGlzLmRvY3VtZW50Q2xpY2tMaXN0ZW5lcigpO1xuICAgICAgICBkZWxldGUgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuY29uc3QgZW51bSBEYXRlcGlja2VyVmlld0VudW0ge1xuICBNT05USFZJRVcgPSAnTU9OVEhWSUVXJyxcbiAgWUVBUlZJRVcgPSAnWUVBUlZJRVcnLFxuICBEQVlWSUVXID0gJ0RBWVZJRVcnLFxufVxuXG4vKipcbiAqIFRoaXMgc2VydmljZSBtYW5hZ2VzIHdoaWNoIHZpZXcgaXMgdmlzaWJsZSBpbiB0aGUgZGF0ZXBpY2tlciBwb3BvdmVyLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmlld01hbmFnZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfY3VycmVudFZpZXc6IERhdGVwaWNrZXJWaWV3RW51bSA9IERhdGVwaWNrZXJWaWV3RW51bS5EQVlWSUVXO1xuXG4gIGdldCBpc0RheVZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWaWV3ID09PSBEYXRlcGlja2VyVmlld0VudW0uREFZVklFVztcbiAgfVxuXG4gIGdldCBpc1llYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmlldyA9PT0gRGF0ZXBpY2tlclZpZXdFbnVtLllFQVJWSUVXO1xuICB9XG5cbiAgZ2V0IGlzTW9udGhWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmlldyA9PT0gRGF0ZXBpY2tlclZpZXdFbnVtLk1PTlRIVklFVztcbiAgfVxuXG4gIGNoYW5nZVRvTW9udGhWaWV3KCk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnRWaWV3ID0gRGF0ZXBpY2tlclZpZXdFbnVtLk1PTlRIVklFVztcbiAgfVxuXG4gIGNoYW5nZVRvWWVhclZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZpZXcgPSBEYXRlcGlja2VyVmlld0VudW0uWUVBUlZJRVc7XG4gIH1cblxuICBjaGFuZ2VUb0RheVZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZpZXcgPSBEYXRlcGlja2VyVmlld0VudW0uREFZVklFVztcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9wb3BvdmVyL2NvbW1vbi9hYnN0cmFjdC1wb3BvdmVyJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vLi4vcG9wb3Zlci9jb21tb24vcG9wb3Zlcic7XG5cbmltcG9ydCB7IERhdGVwaWNrZXJGb2N1c1NlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kYXRlcGlja2VyLWZvY3VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld01hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvdmlldy1tYW5hZ2VyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItZGF0ZXBpY2tlci12aWV3LW1hbmFnZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci12aWV3LW1hbmFnZXIuaHRtbCcsXG4gIHByb3ZpZGVyczogW1ZpZXdNYW5hZ2VyU2VydmljZSwgRGF0ZXBpY2tlckZvY3VzU2VydmljZV0sXG4gIGhvc3Q6IHsgJ1tjbGFzcy5kYXRlcGlja2VyXSc6ICd0cnVlJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRlcGlja2VyVmlld01hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFBvcG92ZXIge1xuICBjb25zdHJ1Y3RvcihAU2tpcFNlbGYoKSBwYXJlbnQ6IEVsZW1lbnRSZWYsIF9pbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgX3ZpZXdNYW5hZ2VyU2VydmljZTogVmlld01hbmFnZXJTZXJ2aWNlKSB7XG4gICAgc3VwZXIoX2luamVjdG9yLCBwYXJlbnQpO1xuICAgIHRoaXMuY29uZmlndXJlUG9wb3ZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBQb3BvdmVyIERpcmVjdGlvbiBhbmQgQ2xvc2UgaW5kaWNhdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVQb3BvdmVyKCk6IHZvaWQge1xuICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5CT1RUT01fTEVGVDtcbiAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LkxFRlRfVE9QO1xuICAgIHRoaXMuY2xvc2VPbk91dHNpZGVDbGljayA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCB2aWV3IGlzIHRoZSBtb250aHBpY2tlci5cbiAgICovXG4gIGdldCBpc01vbnRoVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld01hbmFnZXJTZXJ2aWNlLmlzTW9udGhWaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaWYgdGhlIGN1cnJlbnQgdmlldyBpcyB0aGUgeWVhcnBpY2tlci5cbiAgICovXG4gIGdldCBpc1llYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92aWV3TWFuYWdlclNlcnZpY2UuaXNZZWFyVmlldztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGlmIHRoZSBjdXJyZW50IHZpZXcgaXMgdGhlIGRheXBpY2tlci5cbiAgICovXG4gIGdldCBpc0RheVZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdNYW5hZ2VyU2VydmljZS5pc0RheVZpZXc7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJZk9wZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZGl0aW9uYWwvaWYtb3Blbi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRGF5Vmlld01vZGVsIH0gZnJvbSAnLi9tb2RlbC9kYXktdmlldy5tb2RlbCc7XG5pbXBvcnQgeyBEYXlNb2RlbCB9IGZyb20gJy4vbW9kZWwvZGF5Lm1vZGVsJztcbmltcG9ydCB7IERhdGVGb3JtQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kYXRlLWZvcm0tY29udHJvbC5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RhdGUtbmF2aWdhdGlvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWRheScsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiZGF5LWJ0blwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy10b2RheV09XCJkYXlWaWV3LmlzVG9kYXlzRGF0ZVwiXG4gICAgICAgICAgICBbY2xhc3MuaXMtZGlzYWJsZWRdPVwiZGF5Vmlldy5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJkYXlWaWV3LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZGF5Vmlldy50YWJJbmRleFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KClcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRGF5Vmlld0ZvY3VzKClcIj5cbiAgICAgICAgICAgIHt7ZGF5Vmlldy5kYXlNb2RlbC5kYXRlfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgYCxcbiAgaG9zdDogeyAnW2NsYXNzLmRheV0nOiAndHJ1ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRGF5IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGF0ZU5hdmlnYXRpb25TZXJ2aWNlOiBEYXRlTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfaWZPcGVuU2VydmljZTogSWZPcGVuU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVGb3JtQ29udHJvbFNlcnZpY2U6IERhdGVGb3JtQ29udHJvbFNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBEYXlWaWV3TW9kZWwgaW5wdXQgd2hpY2ggaXMgdXNlZCB0byBidWlsZCB0aGUgRGF5IFZpZXcuXG4gICAqL1xuICBASW5wdXQoJ2NsckRheVZpZXcnKSBkYXlWaWV3OiBEYXlWaWV3TW9kZWw7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGZvY3VzZWREYXkgaW4gdGhlIERhdGVOYXZpZ2F0aW9uU2VydmljZSB3aGVuIHRoZSBDbHJEYXkgaXMgZm9jdXNlZC5cbiAgICovXG4gIG9uRGF5Vmlld0ZvY3VzKCkge1xuICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5mb2N1c2VkRGF5ID0gdGhpcy5kYXlWaWV3LmRheU1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkRGF5IHdoZW4gdGhlIENsckRheSBpcyBzZWxlY3RlZCBhbmQgY2xvc2VzIHRoZSBkYXRlcGlja2VyIHBvcG92ZXIuXG4gICAqL1xuICBzZWxlY3REYXkoKTogdm9pZCB7XG4gICAgY29uc3QgZGF5OiBEYXlNb2RlbCA9IHRoaXMuZGF5Vmlldy5kYXlNb2RlbDtcbiAgICB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2Uubm90aWZ5U2VsZWN0ZWREYXlDaGFuZ2VkKGRheSk7XG4gICAgdGhpcy5kYXRlRm9ybUNvbnRyb2xTZXJ2aWNlLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5faWZPcGVuU2VydmljZS5vcGVuID0gZmFsc2U7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEYXRlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kYXRlLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbGVIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvbG9jYWxlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZXdNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL3ZpZXctbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2Nsci1kYXlwaWNrZXInLCB0ZW1wbGF0ZVVybDogJy4vZGF5cGlja2VyLmh0bWwnLCBob3N0OiB7ICdbY2xhc3MuZGF5cGlja2VyXSc6ICd0cnVlJyB9IH0pXG5leHBvcnQgY2xhc3MgQ2xyRGF5cGlja2VyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdmlld01hbmFnZXJTZXJ2aWNlOiBWaWV3TWFuYWdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZGF0ZU5hdmlnYXRpb25TZXJ2aWNlOiBEYXRlTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfbG9jYWxlSGVscGVyU2VydmljZTogTG9jYWxlSGVscGVyU2VydmljZSxcbiAgICBwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5nc1xuICApIHt9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBWaWV3TWFuYWdlclNlcnZpY2UgdG8gY2hhbmdlIHRvIHRoZSBtb250aHBpY2tlciB2aWV3LlxuICAgKi9cbiAgY2hhbmdlVG9Nb250aFZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld01hbmFnZXJTZXJ2aWNlLmNoYW5nZVRvTW9udGhWaWV3KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIFZpZXdNYW5hZ2VyU2VydmljZSB0byBjaGFuZ2UgdG8gdGhlIHllYXJwaWNrZXIgdmlldy5cbiAgICovXG4gIGNoYW5nZVRvWWVhclZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld01hbmFnZXJTZXJ2aWNlLmNoYW5nZVRvWWVhclZpZXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtb250aCB2YWx1ZSBvZiB0aGUgY2FsZW5kYXIgaW4gdGhlIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQgZm9ybWF0LlxuICAgKi9cbiAgZ2V0IGNhbGVuZGFyTW9udGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlSGVscGVyU2VydmljZS5sb2NhbGVNb250aHNBYmJyZXZpYXRlZFt0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UuZGlzcGxheWVkQ2FsZW5kYXIubW9udGhdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHllYXIgdmFsdWUgb2YgdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgZ2V0IGNhbGVuZGFyWWVhcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UuZGlzcGxheWVkQ2FsZW5kYXIueWVhcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyB0aGUgRGF0ZU5hdmlnYXRpb25TZXJ2aWNlIHRvIG1vdmUgdG8gdGhlIG5leHQgbW9udGguXG4gICAqL1xuICBuZXh0TW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLm1vdmVUb05leHRNb250aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBEYXRlTmF2aWdhdGlvblNlcnZpY2UgdG8gbW92ZSB0byB0aGUgcHJldmlvdXMgbW9udGguXG4gICAqL1xuICBwcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5tb3ZlVG9QcmV2aW91c01vbnRoKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIERhdGVOYXZpZ2F0aW9uU2VydmljZSB0byBtb3ZlIHRvIHRoZSBjdXJyZW50IG1vbnRoLlxuICAgKi9cbiAgY3VycmVudE1vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5tb3ZlVG9DdXJyZW50TW9udGgoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRE9XTl9BUlJPVywgTEVGVF9BUlJPVywgUklHSFRfQVJST1csIFVQX0FSUk9XIH0gZnJvbSAnLi4vLi4vdXRpbHMva2V5LWNvZGVzL2tleS1jb2Rlcyc7XG5cbmltcG9ydCB7IERhdGVOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RhdGUtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVwaWNrZXJGb2N1c1NlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kYXRlcGlja2VyLWZvY3VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxlSGVscGVyU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2xvY2FsZS1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBWaWV3TWFuYWdlclNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy92aWV3LW1hbmFnZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1tb250aHBpY2tlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1idG4gbW9udGhcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoTmFtZXM7IGxldCBtb250aEluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vbnRoKG1vbnRoSW5kZXgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJtb250aEluZGV4ID09PSBjYWxlbmRhck1vbnRoSW5kZXhcIlxuICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZ2V0VGFiSW5kZXgobW9udGhJbmRleClcIj5cbiAgICAgICAgICAgIHt7bW9udGh9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICBgLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5tb250aHBpY2tlcl0nOiAndHJ1ZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsck1vbnRocGlja2VyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZpZXdNYW5hZ2VyU2VydmljZTogVmlld01hbmFnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2xvY2FsZUhlbHBlclNlcnZpY2U6IExvY2FsZUhlbHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZGF0ZU5hdmlnYXRpb25TZXJ2aWNlOiBEYXRlTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZGF0ZXBpY2tlckZvY3VzU2VydmljZTogRGF0ZXBpY2tlckZvY3VzU2VydmljZSxcbiAgICBwcml2YXRlIF9lbFJlZjogRWxlbWVudFJlZlxuICApIHtcbiAgICB0aGlzLl9mb2N1c2VkTW9udGhJbmRleCA9IHRoaXMuY2FsZW5kYXJNb250aEluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGZvY3VzZWQgbW9udGguXG4gICAqL1xuICBwcml2YXRlIF9mb2N1c2VkTW9udGhJbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBtb250aHMgYXJyYXkgd2hpY2ggaXMgdXNlZCB0byByZW5kZXJlZCB0aGUgbW9udGhwaWNrZXIgdmlldy5cbiAgICogTW9udGhzIGFyZSBpbiB0aGUgVHJhbnNsYXRpb25XaWR0aC5XaWRlIGZvcm1hdC5cbiAgICovXG4gIGdldCBtb250aE5hbWVzKCk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZUhlbHBlclNlcnZpY2UubG9jYWxlTW9udGhzV2lkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBtb250aCB2YWx1ZSBvZiB0aGUgQ2FsZW5kYXIuXG4gICAqL1xuICBnZXQgY2FsZW5kYXJNb250aEluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5kaXNwbGF5ZWRDYWxlbmRhci5tb250aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyB0aGUgRGF0ZU5hdmlnYXRpb25TZXJ2aWNlIHRvIHVwZGF0ZSB0aGUgbW9udGggdmFsdWUgb2YgdGhlIGNhbGVuZGFyLlxuICAgKiBBbHNvIGNoYW5nZXMgdGhlIHZpZXcgdG8gdGhlIGRheXBpY2tlci5cbiAgICovXG4gIGNoYW5nZU1vbnRoKG1vbnRoSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX2RhdGVOYXZpZ2F0aW9uU2VydmljZS5jaGFuZ2VNb250aChtb250aEluZGV4KTtcbiAgICB0aGlzLl92aWV3TWFuYWdlclNlcnZpY2UuY2hhbmdlVG9EYXlWaWV3KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZXMgdGhlIG1vbnRoIHBhc3NlZCB0byB0aGUgZm9jdXNlZCBtb250aCBhbmQgcmV0dXJucyB0aGUgdGFiIGluZGV4LlxuICAgKi9cbiAgZ2V0VGFiSW5kZXgobW9udGhJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbW9udGhJbmRleCA9PT0gdGhpcy5fZm9jdXNlZE1vbnRoSW5kZXggPyAwIDogLTE7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgS2V5Ym9hcmQgYXJyb3cgbmF2aWdhdGlvbiBmb3IgdGhlIG1vbnRocGlja2VyLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vIE5PVEU6IERpZG4ndCBtb3ZlIHRoaXMgdG8gdGhlIGRhdGUgbmF2aWdhdGlvbiBzZXJ2aWNlIGJlY2F1c2VcbiAgICAvLyB0aGUgbG9naWMgaXMgZmFpcmx5IHNpbXBsZSBhbmQgaXQgZGlkbid0IG1ha2Ugc2Vuc2UgZm9yIG1lXG4gICAgLy8gdG8gY3JlYXRlIGV4dHJhIG9ic2VydmFibGVzIGp1c3QgdG8gbW92ZSB0aGlzIGxvZ2ljIHRvIHRoZSBzZXJ2aWNlLlxuICAgIGlmIChldmVudCkge1xuICAgICAgY29uc3Qga2V5Q29kZTogbnVtYmVyID0gZXZlbnQua2V5Q29kZTtcbiAgICAgIGlmIChrZXlDb2RlID09PSBVUF9BUlJPVyAmJiB0aGlzLl9mb2N1c2VkTW9udGhJbmRleCA+IDApIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fZm9jdXNlZE1vbnRoSW5kZXgtLTtcbiAgICAgICAgdGhpcy5fZGF0ZXBpY2tlckZvY3VzU2VydmljZS5mb2N1c0NlbGwodGhpcy5fZWxSZWYpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBET1dOX0FSUk9XICYmIHRoaXMuX2ZvY3VzZWRNb250aEluZGV4IDwgMTEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fZm9jdXNlZE1vbnRoSW5kZXgrKztcbiAgICAgICAgdGhpcy5fZGF0ZXBpY2tlckZvY3VzU2VydmljZS5mb2N1c0NlbGwodGhpcy5fZWxSZWYpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBSSUdIVF9BUlJPVyAmJiB0aGlzLl9mb2N1c2VkTW9udGhJbmRleCA8IDYpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fZm9jdXNlZE1vbnRoSW5kZXggPSB0aGlzLl9mb2N1c2VkTW9udGhJbmRleCArIDY7XG4gICAgICAgIHRoaXMuX2RhdGVwaWNrZXJGb2N1c1NlcnZpY2UuZm9jdXNDZWxsKHRoaXMuX2VsUmVmKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gTEVGVF9BUlJPVyAmJiB0aGlzLl9mb2N1c2VkTW9udGhJbmRleCA+IDUpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fZm9jdXNlZE1vbnRoSW5kZXggPSB0aGlzLl9mb2N1c2VkTW9udGhJbmRleCAtIDY7XG4gICAgICAgIHRoaXMuX2RhdGVwaWNrZXJGb2N1c1NlcnZpY2UuZm9jdXNDZWxsKHRoaXMuX2VsUmVmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyBvbiB0aGUgY3VycmVudCBjYWxlbmRhciBtb250aCB3aGVuIHRoZSBWaWV3IGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX2RhdGVwaWNrZXJGb2N1c1NlcnZpY2UuZm9jdXNDZWxsKHRoaXMuX2VsUmVmKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5jb25zdCBZRUFSU19UT19ESVNQTEFZOiBudW1iZXIgPSAxMDtcblxuZXhwb3J0IGNsYXNzIFllYXJSYW5nZU1vZGVsIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB5ZWFyOiBudW1iZXIpIHtcbiAgICB0aGlzLmdlbmVyYXRlWWVhclJhbmdlKCk7XG4gIH1cblxuICB5ZWFyUmFuZ2U6IG51bWJlcltdID0gW107XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBpbiB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZS5cbiAgICovXG4gIGdldCBtaWRkbGVZZWFyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMueWVhclJhbmdlW01hdGguZmxvb3IodGhpcy55ZWFyUmFuZ2UubGVuZ3RoIC8gMildO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgeWVhciByYW5nZSBiYXNlZCBvbiB0aGUgeWVhciBwYXJhbWV0ZXIuXG4gICAqIGVnOiBJZiAyMDE4IGlzIHBhc3NlZCB0aGUgb3V0cHV0IHdpbGwgYmUgWzIwMTAsIDIwMTEsIC4uLiwgMjAxOV1cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVZZWFyUmFuZ2UoKSB7XG4gICAgY29uc3QgcmVtYWluZGVyOiBudW1iZXIgPSB0aGlzLnllYXIgJSBZRUFSU19UT19ESVNQTEFZO1xuICAgIGNvbnN0IGZsb29yOiBudW1iZXIgPSB0aGlzLnllYXIgLSByZW1haW5kZXI7XG4gICAgY29uc3QgY2VpbDogbnVtYmVyID0gZmxvb3IgKyBZRUFSU19UT19ESVNQTEFZO1xuICAgIHRoaXMueWVhclJhbmdlID0gdGhpcy5nZW5lcmF0ZVJhbmdlKGZsb29yLCBjZWlsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB3aGljaCBnZW5lcmF0ZSBhIHJhbmdlIG9mIG51bWJlcnMgZnJvbSBmbG9vciB0byBjZWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJhbmdlKGZsb29yOiBudW1iZXIsIGNlaWw6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2VpbCAtIGZsb29yIH0sICh2LCBrKSA9PiBrICsgZmxvb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgWWVhclJhbmdlTW9kZWwgZm9yIHRoZSBuZXh0IGRlY2FkZS5cbiAgICovXG4gIG5leHREZWNhZGUoKTogWWVhclJhbmdlTW9kZWwge1xuICAgIHJldHVybiBuZXcgWWVhclJhbmdlTW9kZWwodGhpcy55ZWFyICsgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgWWVhclJhbmdlTW9kZWwgZm9yIHRoZSBwcmV2aW91cyBkZWNhZGUuXG4gICAqL1xuICBwcmV2aW91c0RlY2FkZSgpOiBZZWFyUmFuZ2VNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBZZWFyUmFuZ2VNb2RlbCh0aGlzLnllYXIgLSAxMCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBZZWFyUmFuZ2VNb2RlbCBmb3IgdGhlIGN1cnJlbnQgZGVjYWRlLlxuICAgKi9cbiAgY3VycmVudERlY2FkZSgpOiBZZWFyUmFuZ2VNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBZZWFyUmFuZ2VNb2RlbChuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdmFsdWUgaXMgaW4gdGhlIFllYXJSYW5nZU1vZGVsLlxuICAgKi9cbiAgaW5SYW5nZSh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMueWVhclJhbmdlLmluZGV4T2YodmFsdWUpID4gLTE7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERPV05fQVJST1csIExFRlRfQVJST1csIFJJR0hUX0FSUk9XLCBVUF9BUlJPVyB9IGZyb20gJy4uLy4uL3V0aWxzL2tleS1jb2Rlcy9rZXktY29kZXMnO1xuXG5pbXBvcnQgeyBZZWFyUmFuZ2VNb2RlbCB9IGZyb20gJy4vbW9kZWwveWVhci1yYW5nZS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kYXRlLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlcGlja2VyRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZGF0ZXBpY2tlci1mb2N1cy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZXdNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL3ZpZXctbWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci15ZWFycGlja2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInllYXItc3dpdGNoZXJzXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsZW5kYXItYnRuIHN3aXRjaGVyXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwcmV2aW91c0RlY2FkZSgpXCI+XG4gICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiYW5nbGVcIiBkaXI9XCJsZWZ0XCIgW2F0dHIudGl0bGVdPVwiY29tbW9uU3RyaW5ncy5wcmV2aW91c1wiPjwvY2xyLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYWxlbmRhci1idG4gc3dpdGNoZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImN1cnJlbnREZWNhZGUoKVwiPlxuICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImV2ZW50XCIgW2F0dHIudGl0bGVdPVwiY29tbW9uU3RyaW5ncy5jdXJyZW50XCI+PC9jbHItaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGVuZGFyLWJ0biBzd2l0Y2hlclwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibmV4dERlY2FkZSgpXCI+XG4gICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiYW5nbGVcIiBkaXI9XCJyaWdodFwiIFthdHRyLnRpdGxlXT1cImNvbW1vblN0cmluZ3MubmV4dFwiPjwvY2xyLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ5ZWFyc1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJSYW5nZU1vZGVsLnllYXJSYW5nZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1idG4geWVhclwiXG4gICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZ2V0VGFiSW5kZXgoeWVhcilcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJ5ZWFyID09PSBjYWxlbmRhclllYXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VZZWFyKHllYXIpXCI+XG4gICAgICAgICAgICAgICAge3t5ZWFyfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy55ZWFycGlja2VyXSc6ICd0cnVlJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyWWVhcnBpY2tlciBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXRlTmF2aWdhdGlvblNlcnZpY2U6IERhdGVOYXZpZ2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIF92aWV3TWFuYWdlclNlcnZpY2U6IFZpZXdNYW5hZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIF9kYXRlcGlja2VyRm9jdXNTZXJ2aWNlOiBEYXRlcGlja2VyRm9jdXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2VsUmVmOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzXG4gICkge1xuICAgIHRoaXMueWVhclJhbmdlTW9kZWwgPSBuZXcgWWVhclJhbmdlTW9kZWwodGhpcy5jYWxlbmRhclllYXIpO1xuICAgIHRoaXMuX2ZvY3VzZWRZZWFyID0gdGhpcy5jYWxlbmRhclllYXI7XG4gIH1cblxuICAvKipcbiAgICogWWVhclJhbmdlTW9kZWwgd2hpY2ggaXMgdXNlZCB0byBidWlsZCB0aGUgWWVhclBpY2tlciB2aWV3LlxuICAgKi9cbiAgeWVhclJhbmdlTW9kZWw6IFllYXJSYW5nZU1vZGVsO1xuXG4gIC8qKlxuICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBmb2N1c2VkIHllYXIuXG4gICAqL1xuICBwcml2YXRlIF9mb2N1c2VkWWVhcjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB5ZWFyIHdoaWNoIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBvbi5cbiAgICovXG4gIGdldCBjYWxlbmRhclllYXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZU5hdmlnYXRpb25TZXJ2aWNlLmRpc3BsYXllZENhbGVuZGFyLnllYXI7XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVtZW50cyB0aGUgZm9jdXMgeWVhciBieSB0aGUgdmFsdWUgcGFzc2VkLiBVcGRhdGVzIHRoZSBZZWFyUmFuZ2VNb2RlbCBpZiB0aGVcbiAgICogbmV3IHZhbHVlIGlzIG5vdCBpbiB0aGUgY3VycmVudCBkZWNhZGUuXG4gICAqL1xuICBwcml2YXRlIGluY3JlbWVudEZvY3VzWWVhckJ5KHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9mb2N1c2VkWWVhciA9IHRoaXMuX2ZvY3VzZWRZZWFyICsgdmFsdWU7XG4gICAgaWYgKCF0aGlzLnllYXJSYW5nZU1vZGVsLmluUmFuZ2UodGhpcy5fZm9jdXNlZFllYXIpKSB7XG4gICAgICBpZiAodmFsdWUgPiAwKSB7XG4gICAgICAgIHRoaXMueWVhclJhbmdlTW9kZWwgPSB0aGlzLnllYXJSYW5nZU1vZGVsLm5leHREZWNhZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMueWVhclJhbmdlTW9kZWwgPSB0aGlzLnllYXJSYW5nZU1vZGVsLnByZXZpb3VzRGVjYWRlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RhdGVwaWNrZXJGb2N1c1NlcnZpY2UuZm9jdXNDZWxsKHRoaXMuX2VsUmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyB0aGUgRGF0ZU5hdmlnYXRpb25TZXJ2aWNlIHRvIHVwZGF0ZSB0aGUgeWVhciB2YWx1ZSBvZiB0aGUgY2FsZW5kYXIuXG4gICAqIEFsc28gY2hhbmdlcyB0aGUgdmlldyB0byB0aGUgZGF5cGlja2VyLlxuICAgKi9cbiAgY2hhbmdlWWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UuY2hhbmdlWWVhcih5ZWFyKTtcbiAgICB0aGlzLl92aWV3TWFuYWdlclNlcnZpY2UuY2hhbmdlVG9EYXlWaWV3KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgWWVhclJhbmdlTW9kZWwgdG8gdGhlIHByZXZpb3VzIGRlY2FkZS5cbiAgICovXG4gIHByZXZpb3VzRGVjYWRlKCk6IHZvaWQge1xuICAgIHRoaXMueWVhclJhbmdlTW9kZWwgPSB0aGlzLnllYXJSYW5nZU1vZGVsLnByZXZpb3VzRGVjYWRlKCk7XG4gICAgLy8gWWVhciBpbiB0aGUgeWVhcnBpY2tlciBpcyBub3QgZm9jdXNlZCBiZWNhdXNlIHdoaWxlIG5hdmlnYXRpbmcgdG8gYSBkaWZmZXJlbnQgZGVjYWRlLFxuICAgIC8vIHlvdSB3YW50IHRoZSBmb2N1cyB0byByZW1haW4gb24gdGhlIGRlY2FkZSBzd2l0Y2hlciBhcnJvd3MuXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgWWVhclJhbmdlTW9kZWwgdG8gdGhlIGN1cnJlbnQgZGVjYWRlLlxuICAgKi9cbiAgY3VycmVudERlY2FkZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMueWVhclJhbmdlTW9kZWwuaW5SYW5nZSh0aGlzLl9kYXRlTmF2aWdhdGlvblNlcnZpY2UudG9kYXkueWVhcikpIHtcbiAgICAgIHRoaXMueWVhclJhbmdlTW9kZWwgPSB0aGlzLnllYXJSYW5nZU1vZGVsLmN1cnJlbnREZWNhZGUoKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0ZXBpY2tlckZvY3VzU2VydmljZS5mb2N1c0NlbGwodGhpcy5fZWxSZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIFllYXJSYW5nZU1vZGVsIHRvIHRoZSBuZXh0IGRlY2FkZS5cbiAgICovXG4gIG5leHREZWNhZGUoKTogdm9pZCB7XG4gICAgdGhpcy55ZWFyUmFuZ2VNb2RlbCA9IHRoaXMueWVhclJhbmdlTW9kZWwubmV4dERlY2FkZSgpO1xuICAgIC8vIFllYXIgaW4gdGhlIHllYXJwaWNrZXIgaXMgbm90IGZvY3VzZWQgYmVjYXVzZSB3aGlsZSBuYXZpZ2F0aW5nIHRvIGEgZGlmZmVyZW50IGRlY2FkZSxcbiAgICAvLyB5b3Ugd2FudCB0aGUgZm9jdXMgdG8gcmVtYWluIG9uIHRoZSBkZWNhZGUgc3dpdGNoZXIgYXJyb3dzLlxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIHRoZSB5ZWFyIHBhc3NlZCB0byB0aGUgZm9jdXNlZCB5ZWFyIGFuZCByZXR1cm5zIHRoZSB0YWIgaW5kZXguXG4gICAqL1xuICBnZXRUYWJJbmRleCh5ZWFyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy55ZWFyUmFuZ2VNb2RlbC5pblJhbmdlKHRoaXMuX2ZvY3VzZWRZZWFyKSkge1xuICAgICAgaWYgKHRoaXMueWVhclJhbmdlTW9kZWwuaW5SYW5nZSh0aGlzLmNhbGVuZGFyWWVhcikpIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZFllYXIgPSB0aGlzLmNhbGVuZGFyWWVhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzZWRZZWFyID0gdGhpcy55ZWFyUmFuZ2VNb2RlbC5taWRkbGVZZWFyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZFllYXIgPT09IHllYXIgPyAwIDogLTE7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgS2V5Ym9hcmQgYXJyb3cgbmF2aWdhdGlvbiBmb3IgdGhlIHllYXJwaWNrZXIuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgLy8gTk9URTogRGlkbid0IG1vdmUgdGhpcyB0byB0aGUgZGF0ZSBuYXZpZ2F0aW9uIHNlcnZpY2UgYmVjYXVzZVxuICAgIC8vIHRoZSBsb2dpYyBpcyBmYWlybHkgc2ltcGxlIGFuZCBpdCBkaWRuJ3QgbWFrZSBzZW5zZSBmb3IgbWVcbiAgICAvLyB0byBjcmVhdGUgZXh0cmEgb2JzZXJ2YWJsZXMganVzdCB0byBtb3ZlIHRoaXMgbG9naWMgdG8gdGhlIHNlcnZpY2UuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjb25zdCBrZXlDb2RlOiBudW1iZXIgPSBldmVudC5rZXlDb2RlO1xuICAgICAgaWYgKGtleUNvZGUgPT09IFVQX0FSUk9XKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Rm9jdXNZZWFyQnkoLTEpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBET1dOX0FSUk9XKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Rm9jdXNZZWFyQnkoMSk7XG4gICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IFJJR0hUX0FSUk9XKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Rm9jdXNZZWFyQnkoNSk7XG4gICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IExFRlRfQVJST1cpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRGb2N1c1llYXJCeSgtNSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgb24gdGhlIGN1cnJlbnQgY2FsZW5kYXIgeWVhciB3aGVuIHRoZSBWaWV3IGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX2RhdGVwaWNrZXJGb2N1c1NlcnZpY2UuZm9jdXNDZWxsKHRoaXMuX2VsUmVmKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xySWNvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyQ29uZGl0aW9uYWxNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9jb25kaXRpb25hbC9jb25kaXRpb25hbC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyRm9jdXNUcmFwTW9kdWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9jdXMtdHJhcC9mb2N1cy10cmFwLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJIb3N0V3JhcHBpbmdNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9ob3N0LXdyYXBwaW5nL2hvc3Qtd3JhcHBpbmcubW9kdWxlJztcbmltcG9ydCB7IENsckNvbW1vbkZvcm1zTW9kdWxlIH0gZnJvbSAnLi4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xuXG5pbXBvcnQgeyBDbHJDYWxlbmRhciB9IGZyb20gJy4vY2FsZW5kYXInO1xuaW1wb3J0IHsgQ2xyRGF0ZUNvbnRhaW5lciB9IGZyb20gJy4vZGF0ZS1jb250YWluZXInO1xuaW1wb3J0IHsgQ2xyRGF0ZUlucHV0IH0gZnJvbSAnLi9kYXRlLWlucHV0JztcbmltcG9ydCB7IENsckRhdGVwaWNrZXJWaWV3TWFuYWdlciB9IGZyb20gJy4vZGF0ZXBpY2tlci12aWV3LW1hbmFnZXInO1xuaW1wb3J0IHsgQ2xyRGF5IH0gZnJvbSAnLi9kYXknO1xuaW1wb3J0IHsgQ2xyRGF5cGlja2VyIH0gZnJvbSAnLi9kYXlwaWNrZXInO1xuaW1wb3J0IHsgQ2xyTW9udGhwaWNrZXIgfSBmcm9tICcuL21vbnRocGlja2VyJztcbmltcG9ydCB7IENsclllYXJwaWNrZXIgfSBmcm9tICcuL3llYXJwaWNrZXInO1xuXG5leHBvcnQgY29uc3QgQ0xSX0RBVEVQSUNLRVJfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbXG4gIENsckRheSxcbiAgQ2xyRGF0ZUNvbnRhaW5lcixcbiAgQ2xyRGF0ZUlucHV0LFxuICBDbHJEYXRlcGlja2VyVmlld01hbmFnZXIsXG4gIENsck1vbnRocGlja2VyLFxuICBDbHJZZWFycGlja2VyLFxuICBDbHJEYXlwaWNrZXIsXG4gIENsckNhbGVuZGFyLFxuXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDbHJIb3N0V3JhcHBpbmdNb2R1bGUsXG4gICAgQ2xyQ29uZGl0aW9uYWxNb2R1bGUsXG4gICAgQ2xySWNvbk1vZHVsZSxcbiAgICBDbHJGb2N1c1RyYXBNb2R1bGUsXG4gICAgQ2xyQ29tbW9uRm9ybXNNb2R1bGUsXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9EQVRFUElDS0VSX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX0RBVEVQSUNLRVJfRElSRUNUSVZFU10sXG4gIGVudHJ5Q29tcG9uZW50czogW0NsckRhdGVDb250YWluZXJdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRlcGlja2VyTW9kdWxlIHt9XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IElmRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2lmLWVycm9yL2lmLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvbmctY29udHJvbC5zZXJ2aWNlJztcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2xheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuaW1wb3J0IHsgQ29udHJvbElkU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1pZC5zZXJ2aWNlJztcbmltcG9ydCB7IENsckxhYmVsIH0gZnJvbSAnLi4vY29tbW9uL2xhYmVsJztcbmltcG9ydCB7IENvbnRyb2xDbGFzc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2NvbnRyb2wtY2xhc3Muc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1pbnB1dC1jb250YWluZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJsYWJlbFwiPjwvbmctY29udGVudD5cbiAgICAgICAgPGxhYmVsICpuZ0lmPVwiIWxhYmVsICYmIGFkZEdyaWQoKVwiPjwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbHItY29udHJvbC1jb250YWluZXJcIiBbbmdDbGFzc109XCJjb250cm9sQ2xhc3MoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsci1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2NscklucHV0XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICA8Y2xyLWljb24gKm5nSWY9XCJpbnZhbGlkXCIgY2xhc3M9XCJjbHItdmFsaWRhdGUtaWNvblwiIHNoYXBlPVwiZXhjbGFtYXRpb24tY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9jbHItaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWNvbnRyb2wtaGVscGVyXCIgKm5nSWY9XCIhaW52YWxpZFwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1jb250cm9sLWVycm9yXCIgKm5nSWY9XCJpbnZhbGlkXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5jbHItZm9ybS1jb250cm9sXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmNsci1mb3JtLWNvbnRyb2wtZGlzYWJsZWRdJzogJ2NvbnRyb2w/LmRpc2FibGVkJyxcbiAgICAnW2NsYXNzLmNsci1yb3ddJzogJ2FkZEdyaWQoKScsXG4gIH0sXG4gIHByb3ZpZGVyczogW0lmRXJyb3JTZXJ2aWNlLCBOZ0NvbnRyb2xTZXJ2aWNlLCBDb250cm9sSWRTZXJ2aWNlLCBDb250cm9sQ2xhc3NTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xySW5wdXRDb250YWluZXIgaW1wbGVtZW50cyBEeW5hbWljV3JhcHBlciwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBpbnZhbGlkID0gZmFsc2U7XG4gIF9keW5hbWljID0gZmFsc2U7XG4gIEBDb250ZW50Q2hpbGQoQ2xyTGFiZWwpIGxhYmVsOiBDbHJMYWJlbDtcbiAgY29udHJvbDogTmdDb250cm9sO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaWZFcnJvclNlcnZpY2U6IElmRXJyb3JTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRyb2xDbGFzc1NlcnZpY2U6IENvbnRyb2xDbGFzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ0NvbnRyb2xTZXJ2aWNlOiBOZ0NvbnRyb2xTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5pZkVycm9yU2VydmljZS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZShpbnZhbGlkID0+IHtcbiAgICAgICAgdGhpcy5pbnZhbGlkID0gaW52YWxpZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubmdDb250cm9sU2VydmljZS5jb250cm9sQ2hhbmdlcy5zdWJzY3JpYmUoY29udHJvbCA9PiB7XG4gICAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb250cm9sQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbENsYXNzU2VydmljZS5jb250cm9sQ2xhc3ModGhpcy5pbnZhbGlkLCB0aGlzLmFkZEdyaWQoKSk7XG4gIH1cblxuICBhZGRHcmlkKCkge1xuICAgIGlmICh0aGlzLmxheW91dFNlcnZpY2UgJiYgIXRoaXMubGF5b3V0U2VydmljZS5pc1ZlcnRpY2FsKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMubWFwKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIE9wdGlvbmFsLCBWaWV3Q29udGFpbmVyUmVmLCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IENscklucHV0Q29udGFpbmVyIH0gZnJvbSAnLi9pbnB1dC1jb250YWluZXInO1xuaW1wb3J0IHsgV3JhcHBlZEZvcm1Db250cm9sIH0gZnJvbSAnLi4vY29tbW9uL3dyYXBwZWQtY29udHJvbCc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJJbnB1dF0nLCBob3N0OiB7ICdbY2xhc3MuY2xyLWlucHV0XSc6ICd0cnVlJyB9IH0pXG5leHBvcnQgY2xhc3MgQ2xySW5wdXQgZXh0ZW5kcyBXcmFwcGVkRm9ybUNvbnRyb2w8Q2xySW5wdXRDb250YWluZXI+IHtcbiAgcHJvdGVjdGVkIGluZGV4ID0gMTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBTZWxmKClcbiAgICBAT3B0aW9uYWwoKVxuICAgIGNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIGVsOiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKHZjciwgQ2xySW5wdXRDb250YWluZXIsIGluamVjdG9yLCBjb250cm9sLCByZW5kZXJlciwgZWwpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDbHJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb21tb25Gb3Jtc01vZHVsZSB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24ubW9kdWxlJztcblxuaW1wb3J0IHsgQ2xySW5wdXQgfSBmcm9tICcuL2lucHV0JztcbmltcG9ydCB7IENscklucHV0Q29udGFpbmVyIH0gZnJvbSAnLi9pbnB1dC1jb250YWluZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ2xySWNvbk1vZHVsZSwgQ2xyQ29tbW9uRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDbHJJbnB1dCwgQ2xySW5wdXRDb250YWluZXJdLFxuICBleHBvcnRzOiBbQ2xyQ29tbW9uRm9ybXNNb2R1bGUsIENscklucHV0LCBDbHJJbnB1dENvbnRhaW5lcl0sXG4gIGVudHJ5Q29tcG9uZW50czogW0NscklucHV0Q29udGFpbmVyXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xySW5wdXRNb2R1bGUge31cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBJbmplY3QsIEluamVjdGlvblRva2VuLCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuXG5pbXBvcnQgeyBJZkVycm9yU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9pZi1lcnJvci9pZi1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IENsckxhYmVsIH0gZnJvbSAnLi4vY29tbW9uL2xhYmVsJztcbmltcG9ydCB7IENvbnRyb2xDbGFzc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2NvbnRyb2wtY2xhc3Muc2VydmljZSc7XG5pbXBvcnQgeyBDb250cm9sSWRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9jb250cm9sLWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9mb2N1cy5zZXJ2aWNlJztcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2xheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IE5nQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL25nLWNvbnRyb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDbHJDb21tb25TdHJpbmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UnO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZSAqL1xuZXhwb3J0IGNvbnN0IFRvZ2dsZVNlcnZpY2UgPSBuZXcgSW5qZWN0aW9uVG9rZW48YW55Pih1bmRlZmluZWQpO1xuLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUgKi9cbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVTZXJ2aWNlUHJvdmlkZXIoKSB7XG4gIHJldHVybiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXBhc3N3b3JkLWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibGFiZWxcIj48L25nLWNvbnRlbnQ+XG4gICAgPGxhYmVsICpuZ0lmPVwiIWxhYmVsICYmIGFkZEdyaWQoKVwiPjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImNvbnRyb2xDbGFzcygpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2xyLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsci1pbnB1dC1ncm91cFwiIFtjbGFzcy5jbHItZm9jdXNdPVwiZm9jdXNcIj5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY2xyUGFzc3dvcmRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgIDxjbHItaWNvbiAqbmdJZj1cIiFzaG93ICYmIGNsclRvZ2dsZVwiXG4gICAgICAgICAgICBzaGFwZT1cImV5ZVwiIFxuICAgICAgICAgICAgY2xhc3M9XCJjbHItaW5wdXQtZ3JvdXAtaWNvbi1hY3Rpb25cIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29tbW9uU3RyaW5ncy5zaG93XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiPjwvY2xyLWljb24+XG4gICAgICAgICAgPGNsci1pY29uICpuZ0lmPVwic2hvdyAmJiBjbHJUb2dnbGVcIiBcbiAgICAgICAgICAgIHNoYXBlPVwiZXllLWhpZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJjbHItaW5wdXQtZ3JvdXAtaWNvbi1hY3Rpb25cIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY29tbW9uU3RyaW5ncy5oaWRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiPjwvY2xyLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Y2xyLWljb24gKm5nSWY9XCJpbnZhbGlkXCIgY2xhc3M9XCJjbHItdmFsaWRhdGUtaWNvblwiIHNoYXBlPVwiZXhjbGFtYXRpb24tY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9jbHItaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWNvbnRyb2wtaGVscGVyXCIgKm5nSWY9XCIhaW52YWxpZFwiPjwvbmctY29udGVudD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1jb250cm9sLWVycm9yXCIgKm5nSWY9XCJpbnZhbGlkXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmNsci1mb3JtLWNvbnRyb2xdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuY2xyLWZvcm0tY29udHJvbC1kaXNhYmxlZF0nOiAnY29udHJvbD8uZGlzYWJsZWQnLFxuICAgICdbY2xhc3MuY2xyLXJvd10nOiAnYWRkR3JpZCgpJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgSWZFcnJvclNlcnZpY2UsXG4gICAgTmdDb250cm9sU2VydmljZSxcbiAgICBDb250cm9sSWRTZXJ2aWNlLFxuICAgIENvbnRyb2xDbGFzc1NlcnZpY2UsXG4gICAgRm9jdXNTZXJ2aWNlLFxuICAgIHsgcHJvdmlkZTogVG9nZ2xlU2VydmljZSwgdXNlRmFjdG9yeTogVG9nZ2xlU2VydmljZVByb3ZpZGVyIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENsclBhc3N3b3JkQ29udGFpbmVyIGltcGxlbWVudHMgRHluYW1pY1dyYXBwZXIsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgaW52YWxpZCA9IGZhbHNlO1xuICBjb250cm9sOiBOZ0NvbnRyb2w7XG4gIF9keW5hbWljID0gZmFsc2U7XG4gIHNob3cgPSBmYWxzZTtcbiAgZm9jdXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdG9nZ2xlID0gdHJ1ZTtcblxuICBASW5wdXQoJ2NsclRvZ2dsZScpXG4gIHNldCBjbHJUb2dnbGUoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl90b2dnbGUgPSBzdGF0ZTtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNsclRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9nZ2xlO1xuICB9XG4gIEBDb250ZW50Q2hpbGQoQ2xyTGFiZWwpIGxhYmVsOiBDbHJMYWJlbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlmRXJyb3JTZXJ2aWNlOiBJZkVycm9yU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGxheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250cm9sQ2xhc3NTZXJ2aWNlOiBDb250cm9sQ2xhc3NTZXJ2aWNlLFxuICAgIHB1YmxpYyBmb2N1c1NlcnZpY2U6IEZvY3VzU2VydmljZSxcbiAgICBwcml2YXRlIG5nQ29udHJvbFNlcnZpY2U6IE5nQ29udHJvbFNlcnZpY2UsXG4gICAgQEluamVjdChUb2dnbGVTZXJ2aWNlKSBwcml2YXRlIHRvZ2dsZVNlcnZpY2U6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPixcbiAgICBwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5nc1xuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuaWZFcnJvclNlcnZpY2Uuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoaW52YWxpZCA9PiB7XG4gICAgICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmZvY3VzU2VydmljZS5mb2N1c0NoYW5nZS5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICB0aGlzLmZvY3VzID0gc3RhdGU7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLm5nQ29udHJvbFNlcnZpY2UuY29udHJvbENoYW5nZXMuc3Vic2NyaWJlKGNvbnRyb2wgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdG9nZ2xlKCkge1xuICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG4gICAgdGhpcy50b2dnbGVTZXJ2aWNlLm5leHQodGhpcy5zaG93KTtcbiAgfVxuXG4gIGNvbnRyb2xDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sQ2xhc3NTZXJ2aWNlLmNvbnRyb2xDbGFzcyh0aGlzLmludmFsaWQsIHRoaXMuYWRkR3JpZCgpKTtcbiAgfVxuXG4gIGFkZEdyaWQoKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0U2VydmljZSAmJiAhdGhpcy5sYXlvdXRTZXJ2aWNlLmlzVmVydGljYWwoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5tYXAoc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgU2VsZixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQ2xyUGFzc3dvcmRDb250YWluZXIsIFRvZ2dsZVNlcnZpY2UgfSBmcm9tICcuL3Bhc3N3b3JkLWNvbnRhaW5lcic7XG5pbXBvcnQgeyBXcmFwcGVkRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9jb21tb24vd3JhcHBlZC1jb250cm9sJztcbmltcG9ydCB7IEZvY3VzU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvZm9jdXMuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJQYXNzd29yZF0nLCBob3N0OiB7ICdbY2xhc3MuY2xyLWlucHV0XSc6ICd0cnVlJyB9IH0pXG5leHBvcnQgY2xhc3MgQ2xyUGFzc3dvcmQgZXh0ZW5kcyBXcmFwcGVkRm9ybUNvbnRyb2w8Q2xyUGFzc3dvcmRDb250YWluZXI+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgaW5kZXggPSAxO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQFNlbGYoKVxuICAgIEBPcHRpb25hbCgpXG4gICAgY29udHJvbDogTmdDb250cm9sLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb2N1c1NlcnZpY2U6IEZvY3VzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoVG9nZ2xlU2VydmljZSlcbiAgICBwcml2YXRlIHRvZ2dsZVNlcnZpY2U6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxuICApIHtcbiAgICBzdXBlcih2Y3IsIENsclBhc3N3b3JkQ29udGFpbmVyLCBpbmplY3RvciwgY29udHJvbCwgcmVuZGVyZXIsIGVsKTtcblxuICAgIGlmICghdGhpcy5mb2N1c1NlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xyUGFzc3dvcmQgcmVxdWlyZXMgYmVpbmcgd3JhcHBlZCBpbiA8Y2xyLXBhc3N3b3JkLWNvbnRhaW5lcj4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudG9nZ2xlU2VydmljZS5zdWJzY3JpYmUodG9nZ2xlID0+IHtcbiAgICAgICAgcmVuZGVyZXIuc2V0UHJvcGVydHkoZWwubmF0aXZlRWxlbWVudCwgJ3R5cGUnLCB0b2dnbGUgPyAndGV4dCcgOiAncGFzc3dvcmQnKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgdHJpZ2dlckZvY3VzKCkge1xuICAgIGlmICh0aGlzLmZvY3VzU2VydmljZSkge1xuICAgICAgdGhpcy5mb2N1c1NlcnZpY2UuZm9jdXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXG4gIHRyaWdnZXJWYWxpZGF0aW9uKCkge1xuICAgIHN1cGVyLnRyaWdnZXJWYWxpZGF0aW9uKCk7XG4gICAgaWYgKHRoaXMuZm9jdXNTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmZvY3VzU2VydmljZS5mb2N1c2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDbHJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb21tb25Gb3Jtc01vZHVsZSB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24ubW9kdWxlJztcblxuaW1wb3J0IHsgQ2xyUGFzc3dvcmQgfSBmcm9tICcuL3Bhc3N3b3JkJztcbmltcG9ydCB7IENsclBhc3N3b3JkQ29udGFpbmVyIH0gZnJvbSAnLi9wYXNzd29yZC1jb250YWluZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ2xySWNvbk1vZHVsZSwgQ2xyQ29tbW9uRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDbHJQYXNzd29yZCwgQ2xyUGFzc3dvcmRDb250YWluZXJdLFxuICBleHBvcnRzOiBbQ2xyQ29tbW9uRm9ybXNNb2R1bGUsIENsclBhc3N3b3JkLCBDbHJQYXNzd29yZENvbnRhaW5lcl0sXG4gIGVudHJ5Q29tcG9uZW50czogW0NsclBhc3N3b3JkQ29udGFpbmVyXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyUGFzc3dvcmRNb2R1bGUge31cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuaW1wb3J0IHsgQ29udHJvbElkU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1pZC5zZXJ2aWNlJztcbmltcG9ydCB7IENsckxhYmVsIH0gZnJvbSAnLi4vY29tbW9uL2xhYmVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXJhZGlvLXdyYXBwZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjbHJSYWRpb11cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibGFiZWxcIj48L25nLWNvbnRlbnQ+XG4gICAgPGxhYmVsICpuZ0lmPVwiIWxhYmVsXCI+PC9sYWJlbD5cbiAgYCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY2xyLXJhZGlvLXdyYXBwZXJdJzogJ3RydWUnLFxuICB9LFxuICBwcm92aWRlcnM6IFtDb250cm9sSWRTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyUmFkaW9XcmFwcGVyIGltcGxlbWVudHMgRHluYW1pY1dyYXBwZXIge1xuICAvLyBXZSBuZWVkIGJvdGggX2R5bmFtaWMgZm9yIEhvc3RXcmFwcGVyIGFuZCBDb250ZW50Q2hpbGQoQ2xyTGFiZWwpIGluIGNhc2VzIHdoZXJlXG4gIC8vIHRoZSB1c2VyIHB1dHMgYSByYWRpbyBpbnNpZGUgYSB3cmFwcGVyIHdpdGhvdXQgYSBsYWJlbCwgaG9zdCB3cmFwcGluZyBkb2Vzbid0IGFwcGx5XG4gIC8vIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdG8gaW5zZXJ0IGEgbGFiZWxcbiAgX2R5bmFtaWMgPSBmYWxzZTtcbiAgQENvbnRlbnRDaGlsZChDbHJMYWJlbCkgbGFiZWw6IENsckxhYmVsO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbmplY3RvciwgT3B0aW9uYWwsIFJlbmRlcmVyMiwgU2VsZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBXcmFwcGVkRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9jb21tb24vd3JhcHBlZC1jb250cm9sJztcbmltcG9ydCB7IENsclJhZGlvV3JhcHBlciB9IGZyb20gJy4uL3JhZGlvL3JhZGlvLXdyYXBwZXInO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY2xyUmFkaW9dJyB9KVxuZXhwb3J0IGNsYXNzIENsclJhZGlvIGV4dGVuZHMgV3JhcHBlZEZvcm1Db250cm9sPENsclJhZGlvV3JhcHBlcj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBTZWxmKClcbiAgICBAT3B0aW9uYWwoKVxuICAgIGNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIGVsOiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKHZjciwgQ2xyUmFkaW9XcmFwcGVyLCBpbmplY3RvciwgY29udHJvbCwgcmVuZGVyZXIsIGVsKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSWZFcnJvclNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vaWYtZXJyb3IvaWYtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBDbHJMYWJlbCB9IGZyb20gJy4uL2NvbW1vbi9sYWJlbCc7XG5pbXBvcnQgeyBDb250cm9sQ2xhc3NTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9jb250cm9sLWNsYXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGF5b3V0U2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvbmctY29udHJvbC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXJhZGlvLWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibGFiZWxcIj48L25nLWNvbnRlbnQ+XG4gICAgPGxhYmVsICpuZ0lmPVwiIWxhYmVsICYmIGFkZEdyaWQoKVwiPjwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiIFtjbGFzcy5jbHItY29udHJvbC1pbmxpbmVdPVwiY2xySW5saW5lXCIgW25nQ2xhc3NdPVwiY29udHJvbENsYXNzKClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1yYWRpby13cmFwcGVyXCI+PC9uZy1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cImNsci1zdWJ0ZXh0LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWNvbnRyb2wtaGVscGVyXCIgKm5nSWY9XCIhaW52YWxpZFwiPjwvbmctY29udGVudD5cbiAgICAgICAgPGNsci1pY29uICpuZ0lmPVwiaW52YWxpZFwiIGNsYXNzPVwiY2xyLXZhbGlkYXRlLWljb25cIiBzaGFwZT1cImV4Y2xhbWF0aW9uLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvY2xyLWljb24+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1jb250cm9sLWVycm9yXCIgKm5nSWY9XCJpbnZhbGlkXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgYCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY2xyLWZvcm0tY29udHJvbF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5jbHItZm9ybS1jb250cm9sLWRpc2FibGVkXSc6ICdjb250cm9sPy5kaXNhYmxlZCcsXG4gICAgJ1tjbGFzcy5jbHItcm93XSc6ICdhZGRHcmlkKCknLFxuICB9LFxuICBwcm92aWRlcnM6IFtOZ0NvbnRyb2xTZXJ2aWNlLCBDb250cm9sQ2xhc3NTZXJ2aWNlLCBJZkVycm9yU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIENsclJhZGlvQ29udGFpbmVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBpbnZhbGlkID0gZmFsc2U7XG4gIEBDb250ZW50Q2hpbGQoQ2xyTGFiZWwpIGxhYmVsOiBDbHJMYWJlbDtcbiAgcHJpdmF0ZSBpbmxpbmUgPSBmYWxzZTtcbiAgY29udHJvbDogTmdDb250cm9sO1xuXG4gIC8qXG4gICAqIEhlcmUgd2Ugd2FudCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgY2FzZXNcbiAgICogY2xySW5saW5lIC0gdHJ1ZSBieSBwcmVzZW5jZVxuICAgKiBjbHJJbmxpbmU9XCJ0cnVlfGZhbHNlXCIgLSB1bmxlc3MgaXQgaXMgZXhwbGljaXRseSBmYWxzZSwgc3RyaW5ncyBhcmUgY29uc2lkZXJlZCB0cnVlXG4gICAqIFtjbHJJbmxpbmVdPVwidHJ1ZXxmYWxzZVwiIC0gZXhwZWN0IGEgYm9vbGVhblxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGNscklubGluZSh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmlubGluZSA9IHZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlubGluZSA9ICEhdmFsdWU7XG4gICAgfVxuICB9XG4gIGdldCBjbHJJbmxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5saW5lO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpZkVycm9yU2VydmljZTogSWZFcnJvclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udHJvbENsYXNzU2VydmljZTogQ29udHJvbENsYXNzU2VydmljZSxcbiAgICBwcml2YXRlIG5nQ29udHJvbFNlcnZpY2U6IE5nQ29udHJvbFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmlmRXJyb3JTZXJ2aWNlLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKGludmFsaWQgPT4ge1xuICAgICAgICB0aGlzLmludmFsaWQgPSBpbnZhbGlkO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5uZ0NvbnRyb2xTZXJ2aWNlLmNvbnRyb2xDaGFuZ2VzLnN1YnNjcmliZShjb250cm9sID0+IHtcbiAgICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNvbnRyb2xDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sQ2xhc3NTZXJ2aWNlLmNvbnRyb2xDbGFzcyh0aGlzLmludmFsaWQsIHRoaXMuYWRkR3JpZCgpLCB0aGlzLmlubGluZSA/ICdjbHItY29udHJvbC1pbmxpbmUnIDogJycpO1xuICB9XG5cbiAgYWRkR3JpZCgpIHtcbiAgICBpZiAodGhpcy5sYXlvdXRTZXJ2aWNlICYmICF0aGlzLmxheW91dFNlcnZpY2UuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLm1hcChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9pY29uL2ljb24ubW9kdWxlJztcblxuaW1wb3J0IHsgQ2xySG9zdFdyYXBwaW5nTW9kdWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9ob3N0LXdyYXBwaW5nLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb21tb25Gb3Jtc01vZHVsZSB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24ubW9kdWxlJztcblxuaW1wb3J0IHsgQ2xyUmFkaW8gfSBmcm9tICcuL3JhZGlvJztcbmltcG9ydCB7IENsclJhZGlvQ29udGFpbmVyIH0gZnJvbSAnLi9yYWRpby1jb250YWluZXInO1xuaW1wb3J0IHsgQ2xyUmFkaW9XcmFwcGVyIH0gZnJvbSAnLi9yYWRpby13cmFwcGVyJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2xyQ29tbW9uRm9ybXNNb2R1bGUsIENsckhvc3RXcmFwcGluZ01vZHVsZSwgQ2xySWNvbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NsclJhZGlvLCBDbHJSYWRpb0NvbnRhaW5lciwgQ2xyUmFkaW9XcmFwcGVyXSxcbiAgZXhwb3J0czogW0NsckNvbW1vbkZvcm1zTW9kdWxlLCBDbHJSYWRpbywgQ2xyUmFkaW9Db250YWluZXIsIENsclJhZGlvV3JhcHBlcl0sXG4gIGVudHJ5Q29tcG9uZW50czogW0NsclJhZGlvV3JhcHBlcl0sXG59KVxuZXhwb3J0IGNsYXNzIENsclJhZGlvTW9kdWxlIHt9XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElmRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2lmLWVycm9yL2lmLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvbmctY29udHJvbC5zZXJ2aWNlJztcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2xheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuaW1wb3J0IHsgQ29udHJvbElkU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1pZC5zZXJ2aWNlJztcbmltcG9ydCB7IENsckxhYmVsIH0gZnJvbSAnLi4vY29tbW9uL2xhYmVsJztcbmltcG9ydCB7IENvbnRyb2xDbGFzc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vcHJvdmlkZXJzL2NvbnRyb2wtY2xhc3Muc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1zZWxlY3QtY29udGFpbmVyJyxcbiAgdGVtcGxhdGU6IGAgICAgXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImxhYmVsXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8bGFiZWwgKm5nSWY9XCIhbGFiZWwgJiYgYWRkR3JpZCgpXCI+PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImNvbnRyb2xDbGFzcygpXCI+XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIndyYXBwZXJDbGFzcygpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2NsclNlbGVjdF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGNsci1pY29uICpuZ0lmPVwiaW52YWxpZFwiIGNsYXNzPVwiY2xyLXZhbGlkYXRlLWljb25cIiBzaGFwZT1cImV4Y2xhbWF0aW9uLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvY2xyLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1jb250cm9sLWhlbHBlclwiICpuZ0lmPVwiIWludmFsaWRcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItY29udHJvbC1lcnJvclwiICpuZ0lmPVwiaW52YWxpZFwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgYCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY2xyLWZvcm0tY29udHJvbF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5jbHItZm9ybS1jb250cm9sLWRpc2FibGVkXSc6ICdjb250cm9sPy5kaXNhYmxlZCcsXG5cbiAgICAnW2NsYXNzLmNsci1yb3ddJzogJ2FkZEdyaWQoKScsXG4gIH0sXG4gIHByb3ZpZGVyczogW0lmRXJyb3JTZXJ2aWNlLCBOZ0NvbnRyb2xTZXJ2aWNlLCBDb250cm9sSWRTZXJ2aWNlLCBDb250cm9sQ2xhc3NTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyU2VsZWN0Q29udGFpbmVyIGltcGxlbWVudHMgRHluYW1pY1dyYXBwZXIsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgaW52YWxpZCA9IGZhbHNlO1xuICBfZHluYW1pYyA9IGZhbHNlO1xuICBAQ29udGVudENoaWxkKENsckxhYmVsKSBsYWJlbDogQ2xyTGFiZWw7XG4gIEBDb250ZW50Q2hpbGQoU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvcikgbXVsdGlwbGU6IFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3I7XG4gIHByaXZhdGUgbXVsdGkgPSBmYWxzZTtcbiAgY29udHJvbDogTmdDb250cm9sO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaWZFcnJvclNlcnZpY2U6IElmRXJyb3JTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRyb2xDbGFzc1NlcnZpY2U6IENvbnRyb2xDbGFzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ0NvbnRyb2xTZXJ2aWNlOiBOZ0NvbnRyb2xTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5pZkVycm9yU2VydmljZS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZShpbnZhbGlkID0+IHtcbiAgICAgICAgdGhpcy5pbnZhbGlkID0gaW52YWxpZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubmdDb250cm9sU2VydmljZS5jb250cm9sQ2hhbmdlcy5zdWJzY3JpYmUoY29udHJvbCA9PiB7XG4gICAgICAgIHRoaXMubXVsdGkgPSBjb250cm9sLnZhbHVlQWNjZXNzb3IgaW5zdGFuY2VvZiBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yO1xuICAgICAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgd3JhcHBlckNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpID8gJ2Nsci1tdWx0aXNlbGVjdC13cmFwcGVyJyA6ICdjbHItc2VsZWN0LXdyYXBwZXInO1xuICB9XG5cbiAgY29udHJvbENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xDbGFzc1NlcnZpY2UuY29udHJvbENsYXNzKHRoaXMuaW52YWxpZCwgdGhpcy5hZGRHcmlkKCkpO1xuICB9XG5cbiAgYWRkR3JpZCgpIHtcbiAgICBpZiAodGhpcy5sYXlvdXRTZXJ2aWNlICYmICF0aGlzLmxheW91dFNlcnZpY2UuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLm1hcChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBWaWV3Q29udGFpbmVyUmVmLCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBPcHRpb25hbCwgU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBXcmFwcGVkRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9jb21tb24vd3JhcHBlZC1jb250cm9sJztcbmltcG9ydCB7IENsclNlbGVjdENvbnRhaW5lciB9IGZyb20gJy4vc2VsZWN0LWNvbnRhaW5lcic7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJTZWxlY3RdJywgaG9zdDogeyAnW2NsYXNzLmNsci1zZWxlY3RdJzogJ3RydWUnIH0gfSlcbmV4cG9ydCBjbGFzcyBDbHJTZWxlY3QgZXh0ZW5kcyBXcmFwcGVkRm9ybUNvbnRyb2w8Q2xyU2VsZWN0Q29udGFpbmVyPiB7XG4gIHByb3RlY3RlZCBpbmRleCA9IDE7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBAU2VsZigpXG4gICAgQE9wdGlvbmFsKClcbiAgICBjb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBlbDogRWxlbWVudFJlZlxuICApIHtcbiAgICBzdXBlcih2Y3IsIENsclNlbGVjdENvbnRhaW5lciwgaW5qZWN0b3IsIGNvbnRyb2wsIHJlbmRlcmVyLCBlbCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9pY29uL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IENsckNvbW1vbkZvcm1zTW9kdWxlIH0gZnJvbSAnLi4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xuXG5pbXBvcnQgeyBDbHJTZWxlY3QgfSBmcm9tICcuL3NlbGVjdCc7XG5pbXBvcnQgeyBDbHJTZWxlY3RDb250YWluZXIgfSBmcm9tICcuL3NlbGVjdC1jb250YWluZXInO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ2xySWNvbk1vZHVsZSwgQ2xyQ29tbW9uRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDbHJTZWxlY3QsIENsclNlbGVjdENvbnRhaW5lcl0sXG4gIGV4cG9ydHM6IFtDbHJDb21tb25Gb3Jtc01vZHVsZSwgQ2xyU2VsZWN0LCBDbHJTZWxlY3RDb250YWluZXJdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtDbHJTZWxlY3RDb250YWluZXJdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJTZWxlY3RNb2R1bGUge31cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgSWZFcnJvclNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vaWYtZXJyb3IvaWYtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9uZy1jb250cm9sLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGF5b3V0U2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY1dyYXBwZXIgfSBmcm9tICcuLi8uLi91dGlscy9ob3N0LXdyYXBwaW5nL2R5bmFtaWMtd3JhcHBlcic7XG5pbXBvcnQgeyBDb250cm9sSWRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3Byb3ZpZGVycy9jb250cm9sLWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyTGFiZWwgfSBmcm9tICcuLi9jb21tb24vbGFiZWwnO1xuaW1wb3J0IHsgQ29udHJvbENsYXNzU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9wcm92aWRlcnMvY29udHJvbC1jbGFzcy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXRleHRhcmVhLWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImxhYmVsXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8bGFiZWwgKm5nSWY9XCIhbGFiZWwgJiYgYWRkR3JpZCgpXCI+PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNsci1jb250cm9sLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImNvbnRyb2xDbGFzcygpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xyLXRleHRhcmVhLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY2xyVGV4dGFyZWFdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDxjbHItaWNvbiAqbmdJZj1cImludmFsaWRcIiBjbGFzcz1cImNsci12YWxpZGF0ZS1pY29uXCIgc2hhcGU9XCJleGNsYW1hdGlvbi1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Nsci1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItY29udHJvbC1oZWxwZXJcIiAqbmdJZj1cIiFpbnZhbGlkXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWNvbnRyb2wtZXJyb3JcIiAqbmdJZj1cImludmFsaWRcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmNsci1mb3JtLWNvbnRyb2xdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuY2xyLWZvcm0tY29udHJvbC1kaXNhYmxlZF0nOiAnY29udHJvbD8uZGlzYWJsZWQnLFxuICAgICdbY2xhc3MuY2xyLXJvd10nOiAnYWRkR3JpZCgpJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbSWZFcnJvclNlcnZpY2UsIE5nQ29udHJvbFNlcnZpY2UsIENvbnRyb2xJZFNlcnZpY2UsIENvbnRyb2xDbGFzc1NlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUZXh0YXJlYUNvbnRhaW5lciBpbXBsZW1lbnRzIER5bmFtaWNXcmFwcGVyLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGludmFsaWQgPSBmYWxzZTtcbiAgX2R5bmFtaWMgPSBmYWxzZTtcbiAgQENvbnRlbnRDaGlsZChDbHJMYWJlbCkgbGFiZWw6IENsckxhYmVsO1xuICBjb250cm9sOiBOZ0NvbnRyb2w7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpZkVycm9yU2VydmljZTogSWZFcnJvclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udHJvbENsYXNzU2VydmljZTogQ29udHJvbENsYXNzU2VydmljZSxcbiAgICBwcml2YXRlIG5nQ29udHJvbFNlcnZpY2U6IE5nQ29udHJvbFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmlmRXJyb3JTZXJ2aWNlLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKGludmFsaWQgPT4ge1xuICAgICAgICB0aGlzLmludmFsaWQgPSBpbnZhbGlkO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5uZ0NvbnRyb2xTZXJ2aWNlLmNvbnRyb2xDaGFuZ2VzLnN1YnNjcmliZShjb250cm9sID0+IHtcbiAgICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNvbnRyb2xDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sQ2xhc3NTZXJ2aWNlLmNvbnRyb2xDbGFzcyh0aGlzLmludmFsaWQsIHRoaXMuYWRkR3JpZCgpKTtcbiAgfVxuXG4gIGFkZEdyaWQoKSB7XG4gICAgaWYgKHRoaXMubGF5b3V0U2VydmljZSAmJiAhdGhpcy5sYXlvdXRTZXJ2aWNlLmlzVmVydGljYWwoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5tYXAoc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgVmlld0NvbnRhaW5lclJlZiwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBJbmplY3RvciwgT3B0aW9uYWwsIFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgV3JhcHBlZEZvcm1Db250cm9sIH0gZnJvbSAnLi4vY29tbW9uL3dyYXBwZWQtY29udHJvbCc7XG5pbXBvcnQgeyBDbHJUZXh0YXJlYUNvbnRhaW5lciB9IGZyb20gJy4vdGV4dGFyZWEtY29udGFpbmVyJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NsclRleHRhcmVhXScsIGhvc3Q6IHsgJ1tjbGFzcy5jbHItdGV4dGFyZWFdJzogJ3RydWUnIH0gfSlcbmV4cG9ydCBjbGFzcyBDbHJUZXh0YXJlYSBleHRlbmRzIFdyYXBwZWRGb3JtQ29udHJvbDxDbHJUZXh0YXJlYUNvbnRhaW5lcj4ge1xuICBwcm90ZWN0ZWQgaW5kZXggPSAxO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQFNlbGYoKVxuICAgIEBPcHRpb25hbCgpXG4gICAgY29udHJvbDogTmdDb250cm9sLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgc3VwZXIodmNyLCBDbHJUZXh0YXJlYUNvbnRhaW5lciwgaW5qZWN0b3IsIGNvbnRyb2wsIHJlbmRlcmVyLCBlbCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9pY29uL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IENsckNvbW1vbkZvcm1zTW9kdWxlIH0gZnJvbSAnLi4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xuXG5pbXBvcnQgeyBDbHJUZXh0YXJlYSB9IGZyb20gJy4vdGV4dGFyZWEnO1xuaW1wb3J0IHsgQ2xyVGV4dGFyZWFDb250YWluZXIgfSBmcm9tICcuL3RleHRhcmVhLWNvbnRhaW5lcic7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBDbHJJY29uTW9kdWxlLCBDbHJDb21tb25Gb3Jtc01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NsclRleHRhcmVhLCBDbHJUZXh0YXJlYUNvbnRhaW5lcl0sXG4gIGV4cG9ydHM6IFtDbHJDb21tb25Gb3Jtc01vZHVsZSwgQ2xyVGV4dGFyZWEsIENsclRleHRhcmVhQ29udGFpbmVyXSxcbiAgZW50cnlDb21wb25lbnRzOiBbQ2xyVGV4dGFyZWFDb250YWluZXJdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUZXh0YXJlYU1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyQ2hlY2tib3hNb2R1bGUgfSBmcm9tICcuL2NoZWNrYm94L2NoZWNrYm94Lm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb21tb25Gb3Jtc01vZHVsZSB9IGZyb20gJy4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyRGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJy4vZGF0ZXBpY2tlci9kYXRlcGlja2VyLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJJbnB1dE1vZHVsZSB9IGZyb20gJy4vaW5wdXQvaW5wdXQubW9kdWxlJztcbmltcG9ydCB7IENsclBhc3N3b3JkTW9kdWxlIH0gZnJvbSAnLi9wYXNzd29yZC9wYXNzd29yZC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyUmFkaW9Nb2R1bGUgfSBmcm9tICcuL3JhZGlvL3JhZGlvLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJTZWxlY3RNb2R1bGUgfSBmcm9tICcuL3NlbGVjdC9zZWxlY3QubW9kdWxlJztcbmltcG9ydCB7IENsclRleHRhcmVhTW9kdWxlIH0gZnJvbSAnLi90ZXh0YXJlYS90ZXh0YXJlYS5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZXhwb3J0czogW1xuICAgIENsckNvbW1vbkZvcm1zTW9kdWxlLFxuICAgIENsckNoZWNrYm94TW9kdWxlLFxuICAgIENsckRhdGVwaWNrZXJNb2R1bGUsXG4gICAgQ2xySW5wdXRNb2R1bGUsXG4gICAgQ2xyUGFzc3dvcmRNb2R1bGUsXG4gICAgQ2xyUmFkaW9Nb2R1bGUsXG4gICAgQ2xyU2VsZWN0TW9kdWxlLFxuICAgIENsclRleHRhcmVhTW9kdWxlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJGb3Jtc01vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IExvYWRpbmdMaXN0ZW5lciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xvYWRpbmcvbG9hZGluZy1saXN0ZW5lcic7XG5pbXBvcnQgeyBDbHJMb2FkaW5nU3RhdGUgfSBmcm9tICcuLi8uLi9sb2FkaW5nL2xvYWRpbmcnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXhwYW5kIGltcGxlbWVudHMgTG9hZGluZ0xpc3RlbmVyIHtcbiAgcHVibGljIGV4cGFuZGFibGU6IG51bWJlciA9IDA7XG5cbiAgLy8gcHJpdmF0ZSBfcmVwbGFjZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXBsYWNlOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHVibGljIGdldCByZXBsYWNlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBsYWNlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHNldFJlcGxhY2UocmVwbGFjZVZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVwbGFjZS5uZXh0KHJlcGxhY2VWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9sb2FkaW5nKSB7XG4gICAgICB0aGlzLl9sb2FkaW5nID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZ2V0IGV4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9leHBhbmRlZDtcbiAgfVxuXG4gIHNldCBleHBhbmRlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHZhbHVlID0gISF2YWx1ZTtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2V4cGFuZGVkKSB7XG4gICAgICB0aGlzLl9leHBhbmRlZCA9IHZhbHVlO1xuICAgICAgdGhpcy5fYW5pbWF0ZS5uZXh0KCk7XG4gICAgICB0aGlzLl9leHBhbmRDaGFuZ2UubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuX2V4cGFuZGVkO1xuICB9XG5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIHRoZSBkYXRhZ3JpZCBSb3dFeHBhbmQuXG4gIC8vIEkgc3BlbnQgc29tZSB0aW1lIGRvaW5nIHRoaXMgYnV0IHJhbiBpbnRvIGEgY291cGxlIG9mIGlzc3Vlc1xuICAvLyBXaWxsIHRha2UgY2FyZSBvZiB0aGlzIGxhdGVyLlxuICBwcml2YXRlIF9hbmltYXRlOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHVibGljIGdldCBhbmltYXRlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9hbmltYXRlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhwYW5kQ2hhbmdlOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHVibGljIGdldCBleHBhbmRDaGFuZ2UoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cGFuZENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGxvYWRpbmdTdGF0ZUNoYW5nZShzdGF0ZTogQ2xyTG9hZGluZ1N0YXRlKTogdm9pZCB7XG4gICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgY2FzZSBDbHJMb2FkaW5nU3RhdGUuTE9BRElORzpcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYW5pbWF0ZS5uZXh0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRXhwYW5kIH0gZnJvbSAnLi9wcm92aWRlcnMvZXhwYW5kJztcblxuLyoqXG4gKiBUT0RPOiBtYWtlIHRoaXMgYSByZXVzYWJsZSBkaXJlY3RpdmUgb3V0c2lkZSBvZiBEYXRhZ3JpZCwgbGlrZSBbY2xyTG9hZGluZ10uXG4gKi9cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJJZkV4cGFuZGVkXScgfSlcbmV4cG9ydCBjbGFzcyBDbHJJZkV4cGFuZGVkIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9leHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBleHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kZWQ7XG4gIH1cblxuICBASW5wdXQoJ2NscklmRXhwYW5kZWQnKVxuICBzZXQgZXhwYW5kZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuZXhwYW5kLmV4cGFuZGVkID0gdmFsdWU7XG4gICAgICB0aGlzLl9leHBhbmRlZCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoJ2NscklmRXhwYW5kZWRDaGFuZ2UnKSBleHBhbmRlZENoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPih0cnVlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIHByaXZhdGUgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZXhwYW5kOiBFeHBhbmRcbiAgKSB7XG4gICAgZXhwYW5kLmV4cGFuZGFibGUrKztcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBleHBhbmQuZXhwYW5kQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlLmVtaXQodGhpcy5leHBhbmQuZXhwYW5kZWQpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbnMgdG8gYWxsIHRoZSBzZXJ2aWNlcyBhbmQgcXVlcmllcyBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHByaXZhdGUgdXBkYXRlVmlldygpIHtcbiAgICBpZiAodGhpcy5leHBhbmQuZXhwYW5kZWQgJiYgdGhpcy5jb250YWluZXIubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnRlbXBsYXRlKSB7XG4gICAgICBpZiAodGhpcy5leHBhbmQuZXhwYW5kZWQpIHtcbiAgICAgICAgLy8gU2hvdWxkIHdlIHBhc3MgYSBjb250ZXh0PyBJIGRvbid0IHNlZSBhbnl0aGluZyB1c2VmdWwgdG8gcGFzcyByaWdodCBub3csXG4gICAgICAgIC8vIGJ1dCB3ZSBjYW4gY29tZSBiYWNrIHRvIGl0IGluIHRoZSBmdXR1cmUgYXMgYSBzb2x1dGlvbiBmb3IgYWRkaXRpb25hbCBmZWF0dXJlcy5cbiAgICAgICAgdGhpcy5jb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB3aGVuIHdlIG1vdmUgdGhlIGFuaW1hdGlvbiBsb2dpYyB0byBEYXRhZ3JpZCBSb3cgRXhwYW5kXG4gICAgICAgIC8vIFdlIGNsZWFyIGJlZm9yZSB0aGUgYW5pbWF0aW9uIGlzIG92ZXIuIE5vdCBpZGVhbCwgYnV0IGRvaW5nIGJldHRlciB3b3VsZCBpbnZvbHZlIGEgbXVjaCBoZWF2aWVyXG4gICAgICAgIC8vIHByb2Nlc3MgZm9yIHZlcnkgbGl0dGxlIGdhaW4uIE9uY2UgQW5ndWxhciBhbmltYXRpb25zIGFyZSBkeW5hbWljIGVub3VnaCwgd2Ugc2hvdWxkIGJlIGFibGUgdG9cbiAgICAgICAgLy8gZ2V0IHRoZSBvcHRpbWFsIGJlaGF2aW9yLlxuICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdGVtcGxhdGUgcmVmLCB3ZSBmYWxsYmFjayB0byBhIGNydWRlIGRpc3BsYXk6IG5vbmUgZm9yIG5vdy5cbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kLmV4cGFuZGVkKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBXZSBjYXRjaCB0aGUgY2FzZSB3aGVyZSBjbHJJZkV4cGFuZGVkIHdhcyBwdXQgb24gYSBub24tRE9NIGVsZW1lbnQsIGFuZCB3ZSBqdXN0IGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZXhwYW5kLmV4cGFuZGFibGUtLTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENscklmRXhwYW5kZWQgfSBmcm9tICcuL2lmLWV4cGFuZGVkJztcblxuZXhwb3J0ICogZnJvbSAnLi9pZi1leHBhbmRlZCc7XG5cbmV4cG9ydCBjb25zdCBFWFBBTkRfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xySWZFeHBhbmRlZF07XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRVhQQU5EX0RJUkVDVElWRVMgfSBmcm9tICcuL2luZGV4JztcblxuQE5nTW9kdWxlKHsgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGRlY2xhcmF0aW9uczogW0VYUEFORF9ESVJFQ1RJVkVTXSwgZXhwb3J0czogW0VYUEFORF9ESVJFQ1RJVkVTXSB9KVxuZXhwb3J0IGNsYXNzIENscklmRXhwYW5kTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyTG9hZGluZyB9IGZyb20gJy4vbG9hZGluZyc7XG5cbmV4cG9ydCBjb25zdCBDTFJfTE9BRElOR19ESVJFQ1RJVkVTOiBUeXBlPGFueT5bXSA9IFtDbHJMb2FkaW5nXTtcblxuQE5nTW9kdWxlKHsgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGRlY2xhcmF0aW9uczogW0NMUl9MT0FESU5HX0RJUkVDVElWRVNdLCBleHBvcnRzOiBbQ0xSX0xPQURJTkdfRElSRUNUSVZFU10gfSlcbmV4cG9ydCBjbGFzcyBDbHJMb2FkaW5nTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJPdXRzaWRlQ2xpY2tdJyB9KVxuZXhwb3J0IGNsYXNzIE91dHNpZGVDbGljayB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgQElucHV0KCdjbHJTdHJpY3QnKSBzdHJpY3QgPSBmYWxzZTtcblxuICBAT3V0cHV0KCdjbHJPdXRzaWRlQ2xpY2snKSBvdXRzaWRlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oZmFsc2UpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgZG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsgLy8gR2V0IHRoZSBlbGVtZW50IGluIHRoZSBET00gb24gd2hpY2ggdGhlIG1vdXNlIHdhcyBjbGlja2VkXG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDsgLy8gR2V0IHRoZSBjdXJyZW50IGFjdGlvbk1lbnUgbmF0aXZlIEhUTUwgZWxlbWVudFxuXG4gICAgaWYgKHRhcmdldCA9PT0gaG9zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3RyaWN0ICYmIGhvc3QuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dHNpZGVDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3V0c2lkZUNsaWNrIH0gZnJvbSAnLi9vdXRzaWRlLWNsaWNrJztcblxuZXhwb3J0ICogZnJvbSAnLi9vdXRzaWRlLWNsaWNrJztcblxuZXhwb3J0IGNvbnN0IE9VU1RJREVfQ0xJQ0tfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbT3V0c2lkZUNsaWNrXTtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPVVNUSURFX0NMSUNLX0RJUkVDVElWRVMgfSBmcm9tICcuL2luZGV4JztcblxuQE5nTW9kdWxlKHsgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGRlY2xhcmF0aW9uczogW09VU1RJREVfQ0xJQ0tfRElSRUNUSVZFU10sIGV4cG9ydHM6IFtPVVNUSURFX0NMSUNLX0RJUkVDVElWRVNdIH0pXG5leHBvcnQgY2xhc3MgQ2xyT3V0c2lkZUNsaWNrTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbi8qXG4gKiBJZiB3ZSBzb21lZGF5IHdhbnQgdG8gYmUgYWJsZSB0byByZW5kZXIgdGhlIGRhdGFncmlkIGluIGEgd2Vid29ya2VyLFxuICogdGhpcyBpcyB3aGVyZSB3ZSB3b3VsZCB0ZXN0IGlmIHdlJ3JlIGluIGhlYWRsZXNzIG1vZGUuIFJpZ2h0IG5vdyBpdCdzIG5vdCB0ZXN0aW5nIGFueXRoaW5nLCBidXQgYW55IGFjY2Vzc1xuICogdG8gbmF0aXZlIERPTSBlbGVtZW50cycgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBpbiB0aGUgRGF0YWdyaWQgaGFwcGVucyBoZXJlLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvbUFkYXB0ZXIge1xuICB1c2VyRGVmaW5lZFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RhdGFncmlkLWNlbGwtd2lkdGgtemVybycpO1xuICAgIGNvbnN0IHVzZXJEZWZpbmVkV2lkdGggPSB0aGlzLmNsaWVudFJlY3QoZWxlbWVudCkud2lkdGg7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkYXRhZ3JpZC1jZWxsLXdpZHRoLXplcm8nKTtcbiAgICByZXR1cm4gdXNlckRlZmluZWRXaWR0aDtcbiAgfVxuXG4gIHNjcm9sbEJhcldpZHRoKGVsZW1lbnQ6IGFueSkge1xuICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoIC0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfVxuXG4gIHNjcm9sbFdpZHRoKGVsZW1lbnQ6IGFueSkge1xuICAgIHJldHVybiBlbGVtZW50LnNjcm9sbFdpZHRoIHx8IDA7XG4gIH1cblxuICBjb21wdXRlZEhlaWdodChlbGVtZW50OiBhbnkpOiBudW1iZXIge1xuICAgIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpLCAxMCk7XG4gIH1cblxuICBjbGllbnRSZWN0KGVsZW1lbnQ6IGFueSk6IENsaWVudFJlY3Qge1xuICAgIGNvbnN0IGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9wOiBwYXJzZUludChlbGVtZW50Q2xpZW50UmVjdC50b3AsIDEwKSxcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoZWxlbWVudENsaWVudFJlY3QuYm90dG9tLCAxMCksXG4gICAgICBsZWZ0OiBwYXJzZUludChlbGVtZW50Q2xpZW50UmVjdC5sZWZ0LCAxMCksXG4gICAgICByaWdodDogcGFyc2VJbnQoZWxlbWVudENsaWVudFJlY3QucmlnaHQsIDEwKSxcbiAgICAgIHdpZHRoOiBwYXJzZUludChlbGVtZW50Q2xpZW50UmVjdC53aWR0aCwgMTApLFxuICAgICAgaGVpZ2h0OiBwYXJzZUludChlbGVtZW50Q2xpZW50UmVjdC5oZWlnaHQsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgbWluV2lkdGgoZWxlbWVudDogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdtaW4td2lkdGgnKSwgMTApO1xuICB9XG5cbiAgZm9jdXMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgZWxlbWVudC5mb2N1cygpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbi8qXG4gKiBUaGlzIGlzIGEgaGFjayB0aGF0IHdlIGhhdmUgdG8gd3JpdGUgZm9yIG5vdyBiZWNhdXNlIG9mIGJ1Z3MgYW5kIGxpbWl0YXRpb25zIGluIEFuZ3VsYXIsXG4gKiBwbGVhc2UgZG8gbm90IHVzZSB0aGlzIGFzIGFuIGV4YW1wbGUuXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRXhwYW5kIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZXhwYW5kL3Byb3ZpZGVycy9leHBhbmQnO1xuaW1wb3J0IHsgRG9tQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2RvbS1hZGFwdGVyL2RvbS1hZGFwdGVyJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnY2xyLWRnLXJvdycgfSlcbmV4cG9ydCBjbGFzcyBEYXRhZ3JpZFJvd0V4cGFuZEFuaW1hdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBkb21BZGFwdGVyOiBEb21BZGFwdGVyLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGV4cGFuZDogRXhwYW5kXG4gICkge1xuICAgIGlmIChleHBhbmQgJiYgZXhwYW5kLmFuaW1hdGUpIHtcbiAgICAgIGV4cGFuZC5hbmltYXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIFdlIGFscmVhZHkgaGFkIGFuIGFuaW1hdGlvbiB3YWl0aW5nLCBzbyB3ZSBqdXN0IGhhdmUgdG8gcnVuIGluLCBub3QgcHJlcGFyZSBhZ2FpblxuICAgICAgICBpZiAodGhpcy5vbGRIZWlnaHQpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucnVuKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYW5pbWF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJ1bm5pbmc6IGFueTtcbiAgcHJpdmF0ZSBvbGRIZWlnaHQ6IG51bWJlcjtcblxuICAvKlxuICAgICAqIERpcnR5IG1hbnVhbCBhbmltYXRpb24gaGFuZGxpbmcsIGJ1dCB3ZSBoYXZlIG5vIHdheSB0byB1c2UgZHluYW1pYyBoZWlnaHRzIGluIEFuZ3VsYXIncyBjdXJyZW50IEFQSS5cbiAgICAgKiBUaGV5J3JlIHdvcmtpbmcgb24gaXQsIGJ1dCBoYXZlIG5vIEVUQS5cbiAgICAgKi9cbiAgcHJpdmF0ZSBhbmltYXRlKCkge1xuICAgIC8vIENoZWNrIGlmIHdlIGRvIGhhdmUgd2ViLWFuaW1hdGlvbnMgYXZhaWxhYmxlLiBJZiBub3QsIGp1c3Qgc2tpcCB0aGUgYW5pbWF0aW9uLlxuICAgIGlmICghdGhpcy5lbC5uYXRpdmVFbGVtZW50LmFuaW1hdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXZSBoYWQgYW4gYW5pbWF0aW9uIHJ1bm5pbmcsIHdlIHNraXAgdG8gdGhlIGVuZFxuICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgIHRoaXMucnVubmluZy5maW5pc2goKTtcbiAgICB9XG5cbiAgICB0aGlzLm9sZEhlaWdodCA9IHRoaXMuZG9tQWRhcHRlci5jb21wdXRlZEhlaWdodCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIC8vIEluIGNhc2UgaGVpZ2h0IGhhcyBub3QgeWV0IGJlZW4gc2V0LiBXaGVuIHN0YXJ0aW5nIGV4cGFuZGVkLCBmb3IgZXhhbXBsZS5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Ztd2FyZS9jbGFyaXR5L2lzc3Vlcy8yOTA0XG4gICAgaWYgKGlzTmFOKHRoaXMub2xkSGVpZ2h0KSkge1xuICAgICAgdGhpcy5vbGRIZWlnaHQgPSAwO1xuICAgIH1cbiAgICAvLyBXZSBzZXQgdGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSB0byBhdm9pZCBhIGZsaWNrZXIgYmVmb3JlIHRoZSBhbmltYXRpb24gc3RhcnRzLlxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnaGVpZ2h0JywgdGhpcy5vbGRIZWlnaHQgKyAncHgnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ292ZXJmbG93LXknLCAnaGlkZGVuJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5leHBhbmQubG9hZGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBydW4oKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCBudWxsKTtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSB0aGlzLmRvbUFkYXB0ZXIuY29tcHV0ZWRIZWlnaHQodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLnJ1bm5pbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuYW5pbWF0ZShcbiAgICAgIHsgaGVpZ2h0OiBbdGhpcy5vbGRIZWlnaHQgKyAncHgnLCBuZXdIZWlnaHQgKyAncHgnXSwgZWFzaW5nOiAnZWFzZS1pbi1vdXQnIH0sXG4gICAgICB7IGR1cmF0aW9uOiAyMDAgfVxuICAgICk7XG4gICAgdGhpcy5ydW5uaW5nLm9uZmluaXNoID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvdmVyZmxvdy15JywgbnVsbCk7XG4gICAgICBkZWxldGUgdGhpcy5ydW5uaW5nO1xuICAgIH07XG4gICAgZGVsZXRlIHRoaXMub2xkSGVpZ2h0O1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3VzdG9tRmlsdGVyIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLypcbiAqIFRoaXMgcHJvdmlkZXIgaW1wbGVtZW50cyBzb21lIGZvcm0gb2Ygc3luY2hyb25vdXMgZGVib3VuY2luZyB0aHJvdWdoIGEgbG9jayBwYXR0ZXJuXG4gKiB0byBhdm9pZCBlbWl0dGluZyBtdWx0aXBsZSBzdGF0ZSBjaGFuZ2VzIGZvciBhIHNpbmdsZSB1c2VyIGFjdGlvbi5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFN0YXRlRGVib3VuY2VyIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNlcnZhYmxlIHRoYXQgbGV0cyBvdGhlciBjbGFzc2VzIHN1YnNjcmliZSB0byBnbG9iYWwgc3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBfY2hhbmdlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLy8gV2UgZG8gbm90IHdhbnQgdG8gZXhwb3NlIHRoZSBTdWJqZWN0IGl0c2VsZiwgYnV0IHRoZSBPYnNlcnZhYmxlIHdoaWNoIGlzIHJlYWQtb25seVxuICBwdWJsaWMgZ2V0IGNoYW5nZSgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLypcbiAgICAgKiBUaGlzIGlzIHRoZSBsb2NrLCB0byBvbmx5IGVtaXQgb25jZSBhbGwgdGhlIGNoYW5nZXMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nXG4gICAgICovXG4gIHByaXZhdGUgbmJDaGFuZ2VzID0gMDtcblxuICBwdWJsaWMgY2hhbmdlU3RhcnQoKSB7XG4gICAgdGhpcy5uYkNoYW5nZXMrKztcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VEb25lKCkge1xuICAgIGlmICgtLXRoaXMubmJDaGFuZ2VzID09PSAwKSB7XG4gICAgICB0aGlzLl9jaGFuZ2UubmV4dCgpO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RhdGVEZWJvdW5jZXIgfSBmcm9tICcuL3N0YXRlLWRlYm91bmNlci5wcm92aWRlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQYWdlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdGF0ZURlYm91bmNlcjogU3RhdGVEZWJvdW5jZXIpIHt9XG5cbiAgLyoqXG4gICAqIFBhZ2Ugc2l6ZSwgYSB2YWx1ZSBvZiAwIG1lYW5zIG5vIHBhZ2luYXRpb25cbiAgICovXG4gIHByaXZhdGUgX3NpemUgPSAwO1xuICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgb2xkU2l6ZSA9IHRoaXMuX3NpemU7XG4gICAgaWYgKHNpemUgIT09IG9sZFNpemUpIHtcbiAgICAgIHRoaXMuc3RhdGVEZWJvdW5jZXIuY2hhbmdlU3RhcnQoKTtcbiAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgICAgaWYgKHNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5fY3VycmVudCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBZZWFwLiBUaGF0J3MgdGhlIGZvcm11bGEgdG8ga2VlcCB0aGUgZmlyc3QgaXRlbSBmcm9tIHRoZSBvbGQgcGFnZSBzdGlsbFxuICAgICAgICAvLyBkaXNwbGF5ZWQgaW4gdGhlIG5ldyBvbmUuXG4gICAgICAgIHRoaXMuX2N1cnJlbnQgPSBNYXRoLmZsb29yKG9sZFNpemUgLyBzaXplICogKHRoaXMuX2N1cnJlbnQgLSAxKSkgKyAxO1xuICAgICAgfVxuICAgICAgLy8gV2UgYWx3YXlzIGVtaXQgYW4gZXZlbnQgZXZlbiBpZiB0aGUgY3VycmVudCBwYWdlIGluZGV4IGRpZG4ndCBjaGFuZ2UsIGJlY2F1c2VcbiAgICAgIC8vIHRoZSBzaXplIGNoYW5naW5nIG1lYW5zIHRoZSBpdGVtcyBpbnNpZGUgdGhlIHBhZ2UgYXJlIGRpZmZlcmVudFxuICAgICAgdGhpcy5fY2hhbmdlLm5leHQodGhpcy5fY3VycmVudCk7XG4gICAgICB0aGlzLl9zaXplQ2hhbmdlLm5leHQodGhpcy5fc2l6ZSk7XG4gICAgICB0aGlzLnN0YXRlRGVib3VuY2VyLmNoYW5nZURvbmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG90YWwgaXRlbXMgKG5lZWRlZCB0byBndWVzcyB0aGUgbGFzdCBwYWdlKVxuICAgKi9cbiAgcHJpdmF0ZSBfdG90YWxJdGVtcyA9IDA7XG4gIHB1YmxpYyBnZXQgdG90YWxJdGVtcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbEl0ZW1zO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxJdGVtcyh0b3RhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdG90YWxJdGVtcyA9IHRvdGFsO1xuICAgIC8vIElmIHdlIGhhdmUgbGVzcyBpdGVtcyB0aGFuIGJlZm9yZSwgd2UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhlIGN1cnJlbnQgcGFnZVxuICAgIGlmICh0aGlzLmN1cnJlbnQgPiB0aGlzLmxhc3QpIHtcbiAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMubGFzdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGFzdCBwYWdlXG4gICAqL1xuICBwcml2YXRlIF9sYXN0OiBudW1iZXI7XG4gIHB1YmxpYyBnZXQgbGFzdCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl9sYXN0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGFzdDtcbiAgICB9XG4gICAgLy8gSWYgdGhlIGxhc3QgcGFnZSBpc24ndCBrbm93biwgd2UgY29tcHV0ZSBpdCBmcm9tIHRoZSBsYXN0IGl0ZW0ncyBpbmRleFxuICAgIGlmICh0aGlzLnNpemUgPiAwICYmIHRoaXMudG90YWxJdGVtcykge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsSXRlbXMgLyB0aGlzLnNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbiAgfVxuICBwdWJsaWMgc2V0IGxhc3QocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGFzdCA9IHBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ic2VydmFibGUgdGhhdCBsZXRzIG90aGVyIGNsYXNzZXMgc3Vic2NyaWJlIHRvIHBhZ2UgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBfY2hhbmdlID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAvLyBXZSBkbyBub3Qgd2FudCB0byBleHBvc2UgdGhlIFN1YmplY3QgaXRzZWxmLCBidXQgdGhlIE9ic2VydmFibGUgd2hpY2ggaXMgcmVhZC1vbmx5XG4gIHB1YmxpYyBnZXQgY2hhbmdlKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NpemVDaGFuZ2UgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgcHVibGljIGdldCBzaXplQ2hhbmdlKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemVDaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCBwYWdlXG4gICAqL1xuICBwcml2YXRlIF9jdXJyZW50ID0gMTtcbiAgcHVibGljIGdldCBjdXJyZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50KHBhZ2U6IG51bWJlcikge1xuICAgIGlmIChwYWdlICE9PSB0aGlzLl9jdXJyZW50KSB7XG4gICAgICB0aGlzLnN0YXRlRGVib3VuY2VyLmNoYW5nZVN0YXJ0KCk7XG4gICAgICB0aGlzLl9jdXJyZW50ID0gcGFnZTtcbiAgICAgIHRoaXMuX2NoYW5nZS5uZXh0KHBhZ2UpO1xuICAgICAgdGhpcy5zdGF0ZURlYm91bmNlci5jaGFuZ2VEb25lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRvIHRoZSBwcmV2aW91cyBwYWdlIGlmIGl0IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIHByZXZpb3VzKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnQgPiAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnQtLTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdG8gdGhlIG5leHQgcGFnZSBpZiBpdCBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBuZXh0KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnQgPCB0aGlzLmxhc3QpIHtcbiAgICAgIHRoaXMuY3VycmVudCsrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgZmlyc3QgaXRlbSBkaXNwbGF5ZWQgb24gdGhlIGN1cnJlbnQgcGFnZSwgc3RhcnRpbmcgYXQgMFxuICAgKi9cbiAgcHVibGljIGdldCBmaXJzdEl0ZW0oKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnQgLSAxKSAqIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgbGFzdCBpdGVtIGRpc3BsYXllZCBvbiB0aGUgY3VycmVudCBwYWdlLCBzdGFydGluZyBhdCAwXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhc3RJdGVtKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMudG90YWxJdGVtcyAtIDE7XG4gICAgfVxuICAgIGxldCBsYXN0SW5QYWdlID0gdGhpcy5jdXJyZW50ICogdGhpcy5zaXplIC0gMTtcbiAgICBpZiAodGhpcy50b3RhbEl0ZW1zKSB7XG4gICAgICBsYXN0SW5QYWdlID0gTWF0aC5taW4obGFzdEluUGFnZSwgdGhpcy50b3RhbEl0ZW1zIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBsYXN0SW5QYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgcGFnZSBzaXplIHRvIDBcbiAgICovXG4gIHB1YmxpYyByZXNldFBhZ2VTaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2l6ZSA9IDA7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2xyRGF0YWdyaWRGaWx0ZXJJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5pbXBvcnQgeyBTdGF0ZURlYm91bmNlciB9IGZyb20gJy4vc3RhdGUtZGVib3VuY2VyLnByb3ZpZGVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpbHRlcnNQcm92aWRlcjxUID0gYW55PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BhZ2U6IFBhZ2UsIHByaXZhdGUgc3RhdGVEZWJvdW5jZXI6IFN0YXRlRGVib3VuY2VyKSB7fVxuICAvKipcbiAgICogVGhpcyBzdWJqZWN0IGlzIHRoZSBsaXN0IG9mIGZpbHRlcnMgdGhhdCBjaGFuZ2VkIGxhc3QsIG5vdCB0aGUgd2hvbGUgbGlzdC5cbiAgICogV2UgZW1pdCBhIGxpc3QgcmF0aGVyIHRoYW4ganVzdCBvbmUgZmlsdGVyIHRvIGFsbG93IGJhdGNoIGNoYW5nZXMgdG8gc2V2ZXJhbCBhdCBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2hhbmdlID0gbmV3IFN1YmplY3Q8Q2xyRGF0YWdyaWRGaWx0ZXJJbnRlcmZhY2U8VD5bXT4oKTtcbiAgLy8gV2UgZG8gbm90IHdhbnQgdG8gZXhwb3NlIHRoZSBTdWJqZWN0IGl0c2VsZiwgYnV0IHRoZSBPYnNlcnZhYmxlIHdoaWNoIGlzIHJlYWQtb25seVxuICBwdWJsaWMgZ2V0IGNoYW5nZSgpOiBPYnNlcnZhYmxlPENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlPFQ+W10+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYWxsIGZpbHRlcnMsIHdoZXRoZXIgdGhleSdyZSBhY3RpdmUgb3Igbm90XG4gICAqL1xuICBwcml2YXRlIF9hbGw6IFJlZ2lzdGVyZWRGaWx0ZXI8VCwgQ2xyRGF0YWdyaWRGaWx0ZXJJbnRlcmZhY2U8VD4+W10gPSBbXTtcblxuICAvKipcbiAgICogVGVzdHMgaWYgYXQgbGVhc3Qgb25lIGZpbHRlciBpcyBjdXJyZW50bHkgYWN0aXZlXG4gICAqL1xuICBwdWJsaWMgaGFzQWN0aXZlRmlsdGVycygpOiBib29sZWFuIHtcbiAgICAvLyBXZSBkbyBub3QgdXNlIGdldEFjdGl2ZUZpbHRlcnMoKSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgbXVjaCBtb3JlIG9mdGVuXG4gICAgLy8gYW5kIHN0b3BwaW5nIHRoZSBsb29wIGVhcmx5IG1pZ2h0IGJlIHJlbGV2YW50LlxuICAgIGZvciAoY29uc3QgeyBmaWx0ZXIgfSBvZiB0aGlzLl9hbGwpIHtcbiAgICAgIGlmIChmaWx0ZXIgJiYgZmlsdGVyLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY3VycmVudGx5IGFjdGl2ZSBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZlRmlsdGVycygpOiBDbHJEYXRhZ3JpZEZpbHRlckludGVyZmFjZTxUPltdIHtcbiAgICBjb25zdCByZXQ6IENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlPFQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHsgZmlsdGVyIH0gb2YgdGhpcy5fYWxsKSB7XG4gICAgICBpZiAoZmlsdGVyICYmIGZpbHRlci5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIHJldC5wdXNoKGZpbHRlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZmlsdGVyLCBhbmQgcmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgYWRkPEYgZXh0ZW5kcyBDbHJEYXRhZ3JpZEZpbHRlckludGVyZmFjZTxUPj4oZmlsdGVyOiBGKTogUmVnaXN0ZXJlZEZpbHRlcjxULCBGPiB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9hbGwubGVuZ3RoO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGZpbHRlci5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2V0UGFnZUFuZEVtaXRGaWx0ZXJDaGFuZ2UoW2ZpbHRlcl0pKTtcbiAgICBsZXQgaGFzVW5yZWdpc3RlcmVkID0gZmFsc2U7XG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IG5ldyBSZWdpc3RlcmVkRmlsdGVyKGZpbHRlciwgKCkgPT4ge1xuICAgICAgaWYgKGhhc1VucmVnaXN0ZXJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX2FsbC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgaWYgKGZpbHRlci5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIHRoaXMucmVzZXRQYWdlQW5kRW1pdEZpbHRlckNoYW5nZShbXSk7XG4gICAgICB9XG4gICAgICBoYXNVbnJlZ2lzdGVyZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuX2FsbC5wdXNoKHJlZ2lzdGVyZWQpO1xuICAgIGlmIChmaWx0ZXIuaXNBY3RpdmUoKSkge1xuICAgICAgdGhpcy5yZXNldFBhZ2VBbmRFbWl0RmlsdGVyQ2hhbmdlKFtmaWx0ZXJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhbiBpdGVtIGlmIGl0IGlzIGFjY2VwdGVkIGJ5IGFsbCBjdXJyZW50bHkgYWN0aXZlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBhY2NlcHRzKGl0ZW06IFQpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHsgZmlsdGVyIH0gb2YgdGhpcy5fYWxsKSB7XG4gICAgICBpZiAoZmlsdGVyICYmIGZpbHRlci5pc0FjdGl2ZSgpICYmICFmaWx0ZXIuYWNjZXB0cyhpdGVtKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFBhZ2VBbmRFbWl0RmlsdGVyQ2hhbmdlKGZpbHRlcnM6IENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlPFQ+W10pIHtcbiAgICB0aGlzLnN0YXRlRGVib3VuY2VyLmNoYW5nZVN0YXJ0KCk7XG4gICAgLy8gZmlsdGVyaW5nIG1heSBjaGFuZ2UgdGhlIHBhZ2UgbnVtYmVyIHN1Y2ggdGhhdCBjdXJyZW50IHBhZ2UgbnVtYmVyIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZpbHRlcmVkIGRhdGFzZXQuXG4gICAgLy8gU28gaGVyZSB3ZSBhbHdheXMgc2V0IHRoZSBjdXJyZW50IHBhZ2UgdG8gMSBzbyB0aGF0IGl0J2xsIGZldGNoIGZpcnN0IHBhZ2UncyBkYXRhIHdpdGggdGhlIGdpdmVuIGZpbHRlci5cbiAgICB0aGlzLl9wYWdlLmN1cnJlbnQgPSAxO1xuICAgIHRoaXMuX2NoYW5nZS5uZXh0KGZpbHRlcnMpO1xuICAgIHRoaXMuc3RhdGVEZWJvdW5jZXIuY2hhbmdlRG9uZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RlcmVkRmlsdGVyPFQsIEYgZXh0ZW5kcyBDbHJEYXRhZ3JpZEZpbHRlckludGVyZmFjZTxUPj4ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZmlsdGVyOiBGLCBwdWJsaWMgdW5yZWdpc3RlcjogKCkgPT4gdm9pZCkge31cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRGaWx0ZXJJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsdGVyc1Byb3ZpZGVyLCBSZWdpc3RlcmVkRmlsdGVyIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2ZpbHRlcnMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGF0YWdyaWRGaWx0ZXJSZWdpc3RyYXI8VCwgRiBleHRlbmRzIENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlPFQ+PiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsdGVyczogRmlsdGVyc1Byb3ZpZGVyPFQ+KSB7fVxuXG4gIHB1YmxpYyByZWdpc3RlcmVkOiBSZWdpc3RlcmVkRmlsdGVyPFQsIEY+O1xuXG4gIHB1YmxpYyBnZXQgZmlsdGVyKCk6IEYge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyZWQgJiYgdGhpcy5yZWdpc3RlcmVkLmZpbHRlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGIHwgUmVnaXN0ZXJlZEZpbHRlcjxULCBGPikge1xuICAgIC8vIElmIHdlIHByZXZpb3VzbHkgaGFkIGFub3RoZXIgZmlsdGVyLCB3ZSB1bnJlZ2lzdGVyIGl0XG4gICAgdGhpcy5kZWxldGVGaWx0ZXIoKTtcbiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgUmVnaXN0ZXJlZEZpbHRlcikge1xuICAgICAgdGhpcy5yZWdpc3RlcmVkID0gZmlsdGVyO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyZWQgPSB0aGlzLmZpbHRlcnMuYWRkKGZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlbGV0ZUZpbHRlcigpIHtcbiAgICBpZiAodGhpcy5yZWdpc3RlcmVkKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyZWQudW5yZWdpc3RlcigpO1xuICAgICAgZGVsZXRlIHRoaXMucmVnaXN0ZXJlZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVGaWx0ZXIoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi8uLi9wb3BvdmVyL2NvbW1vbi9wb3BvdmVyJztcbmltcG9ydCB7IFBvcG92ZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vcG9wb3Zlci9jb21tb24vcG9wb3Zlci1vcHRpb25zLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3VzdG9tRmlsdGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvY3VzdG9tLWZpbHRlcic7XG5pbXBvcnQgeyBGaWx0ZXJzUHJvdmlkZXIsIFJlZ2lzdGVyZWRGaWx0ZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9maWx0ZXJzJztcbmltcG9ydCB7IERhdGFncmlkRmlsdGVyUmVnaXN0cmFyIH0gZnJvbSAnLi91dGlscy9kYXRhZ3JpZC1maWx0ZXItcmVnaXN0cmFyJztcbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQ3VzdG9tIGZpbHRlciB0aGF0IGNhbiBiZSBhZGRlZCBpbiBhbnkgY29sdW1uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9iamVjdCBwcm9wZXJ0eSBzdHJpbmcgZmlsdGVyLlxuICogVGhlIHJlYXNvbiB0aGlzIGlzIG5vdCBqdXN0IGFuIGlucHV0IG9uIERhdGFncmlkQ29sdW1uIGlzIGJlY2F1c2Ugd2UgbmVlZCB0aGUgZmlsdGVyJ3MgdGVtcGxhdGUgdG8gYmUgcHJvamVjdGVkLFxuICogc2luY2UgaXQgY2FuIGJlIGFueXRoaW5nIChub3QganVzdCBhIHRleHQgaW5wdXQpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItZGctZmlsdGVyJyxcbiAgLy8gV2UgcmVnaXN0ZXIgdGhpcyBjb21wb25lbnQgYXMgYSBDdXN0b21GaWx0ZXIsIGZvciB0aGUgcGFyZW50IGNvbHVtbiB0byBkZXRlY3QgaXQuXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogQ3VzdG9tRmlsdGVyLCB1c2VFeGlzdGluZzogQ2xyRGF0YWdyaWRGaWx0ZXIgfV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxidXR0b24gI2FuY2hvciBjbGFzcz1cImRhdGFncmlkLWZpbHRlci10b2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAgICAgW2NsYXNzLmRhdGFncmlkLWZpbHRlci1vcGVuXT1cIm9wZW5cIiBbY2xhc3MuZGF0YWdyaWQtZmlsdGVyZWRdPVwiYWN0aXZlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgWyhjbHJQb3BvdmVyT2xkKV09XCJvcGVuXCIgW2NsclBvcG92ZXJPbGRBbmNob3JdPVwiYW5jaG9yXCIgW2NsclBvcG92ZXJPbGRBbmNob3JQb2ludF09XCJhbmNob3JQb2ludFwiXG4gICAgICAgICAgICAgW2NsclBvcG92ZXJPbGRQb3BvdmVyUG9pbnRdPVwicG9wb3ZlclBvaW50XCIgW2NsclBvcG92ZXJPbGRPcHRpb25zXT1cInBvcG92ZXJPcHRpb25zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YWdyaWQtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBGSVhNRTogdGhpcyB3aG9sZSBmaWx0ZXIgcGFydCBuZWVkcyBhIGZpbmFsIGRlc2lnbiBiZWZvcmUgd2UgY2FuIHRyeSB0byBoYXZlIGEgY2xlYW5lciBET00gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFncmlkLWZpbHRlci1jbG9zZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiAoY2xpY2spPVwib3BlbiA9IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJjbG9zZVwiIFthdHRyLnRpdGxlXT1cImNvbW1vblN0cmluZ3MuY2xvc2VcIj48L2Nsci1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICBcbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRhZ3JpZEZpbHRlcjxUID0gYW55PiBleHRlbmRzIERhdGFncmlkRmlsdGVyUmVnaXN0cmFyPFQsIENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlPFQ+PlxuICBpbXBsZW1lbnRzIEN1c3RvbUZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKF9maWx0ZXJzOiBGaWx0ZXJzUHJvdmlkZXI8VD4sIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzKSB7XG4gICAgc3VwZXIoX2ZpbHRlcnMpO1xuICB9XG5cbiAgcHVibGljIGFuY2hvclBvaW50OiBQb2ludCA9IFBvaW50LlJJR0hUX0JPVFRPTTtcbiAgcHVibGljIHBvcG92ZXJQb2ludDogUG9pbnQgPSBQb2ludC5SSUdIVF9UT1A7XG4gIHB1YmxpYyBwb3BvdmVyT3B0aW9uczogUG9wb3Zlck9wdGlvbnMgPSB7IGFsbG93TXVsdGlwbGVPcGVuOiB0cnVlIH07XG4gIC8qKlxuICAgKiBUcmFja3Mgd2hldGhlciB0aGUgZmlsdGVyIGRyb3Bkb3duIGlzIG9wZW4gb3Igbm90XG4gICAqL1xuICBwcml2YXRlIF9vcGVuID0gZmFsc2U7XG4gIHB1YmxpYyBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlbjtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRGdGaWx0ZXJPcGVuJylcbiAgcHVibGljIHNldCBvcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICBjb25zdCBib29sT3BlbiA9ICEhb3BlbjtcbiAgICBpZiAoYm9vbE9wZW4gIT09IHRoaXMuX29wZW4pIHtcbiAgICAgIHRoaXMuX29wZW4gPSBib29sT3BlbjtcbiAgICAgIHRoaXMub3BlbkNoYW5nZWQuZW1pdChib29sT3Blbik7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgnY2xyRGdGaWx0ZXJPcGVuQ2hhbmdlJykgcHVibGljIG9wZW5DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG5cbiAgQElucHV0KCdjbHJEZ0ZpbHRlcicpXG4gIHB1YmxpYyBzZXQgY3VzdG9tRmlsdGVyKGZpbHRlcjogQ2xyRGF0YWdyaWRGaWx0ZXJJbnRlcmZhY2U8VD4gfCBSZWdpc3RlcmVkRmlsdGVyPFQsIENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlPFQ+Pikge1xuICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmaWx0ZXIgaXMgY3VycmVudGx5IGFjdGl2ZVxuICAgKi9cbiAgcHVibGljIGdldCBhY3RpdmUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5maWx0ZXIgJiYgdGhpcy5maWx0ZXIuaXNBY3RpdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cy9oaWRlcyB0aGUgZmlsdGVyIGRyb3Bkb3duXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENsckRhdGFncmlkRmlsdGVySW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IENsckRhdGFncmlkU3RyaW5nRmlsdGVySW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zdHJpbmctZmlsdGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhZ3JpZFN0cmluZ0ZpbHRlckltcGw8VCA9IGFueT4gaW1wbGVtZW50cyBDbHJEYXRhZ3JpZEZpbHRlckludGVyZmFjZTxUPiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBmaWx0ZXJGbjogQ2xyRGF0YWdyaWRTdHJpbmdGaWx0ZXJJbnRlcmZhY2U8VD4pIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNlcnZhYmxlIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIEZpbHRlciBpbnRlcmZhY2VcbiAgICovXG4gIHByaXZhdGUgX2NoYW5nZXMgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIC8vIFdlIGRvIG5vdCB3YW50IHRvIGV4cG9zZSB0aGUgU3ViamVjdCBpdHNlbGYsIGJ1dCB0aGUgT2JzZXJ2YWJsZSB3aGljaCBpcyByZWFkLW9ubHlcbiAgcHVibGljIGdldCBjaGFuZ2VzKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZXMuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmF3IGlucHV0IHZhbHVlXG4gICAqL1xuICBwcml2YXRlIF9yYXdWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmF3VmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIElucHV0IHZhbHVlIGNvbnZlcnRlZCB0byBsb3dlcmNhc2VcbiAgICovXG4gIHByaXZhdGUgX2xvd2VyQ2FzZVZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGdldCBsb3dlckNhc2VWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG93ZXJDYXNlVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIENvbW1vbiBzZXR0ZXIgZm9yIHRoZSBpbnB1dCB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9yYXdWYWx1ZSkge1xuICAgICAgdGhpcy5fcmF3VmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2xvd2VyQ2FzZVZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VzLm5leHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGZpbHRlciBpcyBjdXJyZW50bHkgYWN0aXZlLCBtZWFuaW5nIHRoZSBpbnB1dCBpcyBub3QgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3RzIGlmIGFuIGl0ZW0gbWF0Y2hlcyBhIHNlYXJjaCB0ZXh0XG4gICAqL1xuICBwdWJsaWMgYWNjZXB0cyhpdGVtOiBUKTogYm9vbGVhbiB7XG4gICAgLy8gV2UgYWx3YXlzIHRlc3Qgd2l0aCB0aGUgbG93ZXJjYXNlIHZhbHVlIG9mIHRoZSBpbnB1dCwgdG8gc3RheSBjYXNlIGluc2Vuc2l0aXZlXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRm4uYWNjZXB0cyhpdGVtLCB0aGlzLmxvd2VyQ2FzZVZhbHVlKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJEYXRhZ3JpZEZpbHRlciB9IGZyb20gJy4uLy4uL2RhdGFncmlkLWZpbHRlcic7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZFN0cmluZ0ZpbHRlckludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc3RyaW5nLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3VzdG9tRmlsdGVyIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL2N1c3RvbS1maWx0ZXInO1xuaW1wb3J0IHsgRmlsdGVyc1Byb3ZpZGVyLCBSZWdpc3RlcmVkRmlsdGVyIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL2ZpbHRlcnMnO1xuaW1wb3J0IHsgRG9tQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL2RvbS1hZGFwdGVyL2RvbS1hZGFwdGVyJztcbmltcG9ydCB7IERhdGFncmlkRmlsdGVyUmVnaXN0cmFyIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0YWdyaWQtZmlsdGVyLXJlZ2lzdHJhcic7XG5cbmltcG9ydCB7IERhdGFncmlkU3RyaW5nRmlsdGVySW1wbCB9IGZyb20gJy4vZGF0YWdyaWQtc3RyaW5nLWZpbHRlci1pbXBsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWRnLXN0cmluZy1maWx0ZXInLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IEN1c3RvbUZpbHRlciwgdXNlRXhpc3Rpbmc6IERhdGFncmlkU3RyaW5nRmlsdGVyIH1dLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8Y2xyLWRnLWZpbHRlciBbY2xyRGdGaWx0ZXJdPVwicmVnaXN0ZXJlZFwiIFsoY2xyRGdGaWx0ZXJPcGVuKV09XCJvcGVuXCI+XG4gICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgRXZlbiB0aG91Z2ggdGhpcyAqbmdJZiBsb29rcyB1c2VsZXNzIGJlY2F1c2UgdGhlIGZpbHRlciBjb250YWluZXIgYWxyZWFkeSBoYXMgb25lLFxuICAgICAgICAgICAgICAgIGl0IHByZXZlbnRzIE5nQ29udHJvbFN0YXR1cyBhbmQgb3RoZXIgZGlyZWN0aXZlcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IEFuZ3VsYXJcbiAgICAgICAgICAgICAgICBvbiBpbnB1dHMgd2l0aCBOZ01vZGVsIGZyb20gZnJlYWtpbmcgb3V0IGJlY2F1c2Ugb2YgdGhlaXIgaG9zdCBiaW5kaW5nIGNoYW5naW5nXG4gICAgICAgICAgICAgICAgbWlkLWNoYW5nZSBkZXRlY3Rpb24gd2hlbiB0aGUgaW5wdXQgaXMgZGVzdHJveWVkLlxuICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICA8aW5wdXQgI2lucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInNlYXJjaFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAqbmdJZj1cIm9wZW5cIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJjbG9zZSgpXCIgKGtleXVwLmVzY2FwZSk9XCJjbG9zZSgpXCIvPlxuICAgICAgICA8L2Nsci1kZy1maWx0ZXI+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YWdyaWRTdHJpbmdGaWx0ZXI8VCA9IGFueT4gZXh0ZW5kcyBEYXRhZ3JpZEZpbHRlclJlZ2lzdHJhcjxULCBEYXRhZ3JpZFN0cmluZ0ZpbHRlckltcGw8VD4+XG4gIGltcGxlbWVudHMgQ3VzdG9tRmlsdGVyLCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IoZmlsdGVyczogRmlsdGVyc1Byb3ZpZGVyPFQ+LCBwcml2YXRlIGRvbUFkYXB0ZXI6IERvbUFkYXB0ZXIpIHtcbiAgICBzdXBlcihmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b21pemFibGUgZmlsdGVyIGxvZ2ljIGJhc2VkIG9uIGEgc2VhcmNoIHRleHRcbiAgICovXG4gIEBJbnB1dCgnY2xyRGdTdHJpbmdGaWx0ZXInKVxuICBzZXQgY3VzdG9tU3RyaW5nRmlsdGVyKFxuICAgIHZhbHVlOiBDbHJEYXRhZ3JpZFN0cmluZ0ZpbHRlckludGVyZmFjZTxUPiB8IFJlZ2lzdGVyZWRGaWx0ZXI8VCwgRGF0YWdyaWRTdHJpbmdGaWx0ZXJJbXBsPFQ+PlxuICApIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdpc3RlcmVkRmlsdGVyKSB7XG4gICAgICB0aGlzLnNldEZpbHRlcih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0RmlsdGVyKG5ldyBEYXRhZ3JpZFN0cmluZ0ZpbHRlckltcGwodmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmaWx0ZXIgZHJvcGRvd24gaXMgb3BlblxuICAgKi9cbiAgcHVibGljIG9wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogV2UgbmVlZCB0aGUgYWN0dWFsIGlucHV0IGVsZW1lbnQgdG8gYXV0b21hdGljYWxseSBmb2N1cyBvbiBpdFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBwdWJsaWMgaW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIFdlIGdyYWIgdGhlIENsckRhdGFncmlkRmlsdGVyIHdlIHdyYXAgdG8gcmVnaXN0ZXIgdGhpcyBTdHJpbmdGaWx0ZXIgdG8gaXQuXG4gICAqL1xuICBAVmlld0NoaWxkKENsckRhdGFncmlkRmlsdGVyKSBwdWJsaWMgZmlsdGVyQ29udGFpbmVyOiBDbHJEYXRhZ3JpZEZpbHRlcjxUPjtcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbmVyLm9wZW5DaGFuZ2VkLnN1YnNjcmliZSgob3BlbjogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0aGUgdGltZW91dCBiZWNhdXNlIGF0IHRoZSB0aW1lIHRoaXMgZXhlY3V0ZXMsIHRoZSBpbnB1dCBpc24ndFxuICAgICAgICAvLyBkaXNwbGF5ZWQgeWV0LlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRvbUFkYXB0ZXIuZm9jdXModGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbW9uIHNldHRlciBmb3IgdGhlIGlucHV0IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlci52YWx1ZTtcbiAgfVxuICBASW5wdXQoJ2NsckZpbHRlclZhbHVlJylcbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZmlsdGVyLnZhbHVlKSB7XG4gICAgICB0aGlzLmZpbHRlci52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5maWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCdjbHJGaWx0ZXJWYWx1ZUNoYW5nZScpIGZpbHRlclZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBjbG9zZSgpIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBXaWxseVdvbmthIH0gZnJvbSAnLi93aWxseS13b25rYSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPb21wYUxvb21wYSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudENoZWNrZWQsIE9uRGVzdHJveSB7XG4gIC8vIEZJWE1FOiBSZXF1ZXN0IEluamVjdG9yIG9uY2Ugd2UgbW92ZSB0byBBbmd1bGFyIDQuMissIGl0J2xsIGFsbG93IGVhc2llciByZWZhY3RvcnNcbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgd2lsbHlXb25rYTogV2lsbHlXb25rYSkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gd2lsbHlXb25rYS5jaG9jb2xhdGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmxhdGVzdEZsYXZvciAhPT0gdGhpcy5mbGF2b3IpIHtcbiAgICAgICAgY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBsYXRlc3RGbGF2b3I6IGFueTtcblxuICBhYnN0cmFjdCBnZXQgZmxhdm9yKCk6IGFueTtcblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgdGhpcy5sYXRlc3RGbGF2b3IgPSB0aGlzLmZsYXZvcjtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUm93QWN0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgYWN0aW9uYWJsZUNvdW50ID0gMDtcblxuICBwdWJsaWMgcmVnaXN0ZXIoKSB7XG4gICAgdGhpcy5hY3Rpb25hYmxlQ291bnQrKztcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyKCkge1xuICAgIHRoaXMuYWN0aW9uYWJsZUNvdW50LS07XG4gIH1cblxuICAvKipcbiAgICogZmFsc2UgbWVhbnMgbm8gcm93cyB3aXRoIGFjdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBoYXNBY3Rpb25hYmxlUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbmFibGVDb3VudCA+IDA7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLypcbiAqIEFmdGVyIGEgY29udmVyc2F0aW9uIHdpdGggdGhlIEFuZ3VsYXIgY29yZSB0ZWFtLCBpdCB0dXJucyBvdXQgd2UgZG9uJ3QgaGF2ZSBtdWNoIG9mIGEgY2hvaWNlIGZvciBvdXJcbiAqIGRlY2xhcmF0aXZlIEFQSSwgd2UgbmVlZCB0byBmaWdodCBhZ2FpbnN0IGNoYW5nZSBkZXRlY3Rpb24gYW5kIGl0cyBvbmUtd2F5IGZsb3cuIFRoaXMgaXNcbiAqIGN1cnJlbnRseSB0aGUgbGVhc3QgZGlydHkgc29sdXRpb24gdG8gZG8gd2hhdCB3ZSB3YW50LlxuICpcbiAqIERvIG5vdCBtb2RpZnkgb3IgZXZlbiB1c2UgdGhpcyBjbGFzcyB1bmxlc3MgeW91IGtub3cgZXhhY3RseSB3aGF0IHlvdSdyZSBkb2luZy5cbiAqIEl0IGhhcyB0aGUgcG90ZW50aWFsIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBsb29wcyBvciBraWxsIGFwcCBwZXJmb3JtYW5jZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWxseVdvbmthIGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gIHByaXZhdGUgX2Nob2NvbGF0ZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIGdldCBjaG9jb2xhdGUoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Nob2NvbGF0ZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICB0aGlzLl9jaG9jb2xhdGUubmV4dCgpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbGx5V29ua2EgfSBmcm9tICcuLi8uLi8uLi91dGlscy9jaG9jb2xhdGUvd2lsbHktd29ua2EnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdjbHItZGF0YWdyaWQnIH0pXG5leHBvcnQgY2xhc3MgRGF0YWdyaWRXaWxseVdvbmthIGV4dGVuZHMgV2lsbHlXb25rYSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9vbXBhTG9vbXBhIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY2hvY29sYXRlL29vbXBhLWxvb21wYSc7XG5pbXBvcnQgeyBSb3dBY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vcHJvdmlkZXJzL3Jvdy1hY3Rpb24tc2VydmljZSc7XG5pbXBvcnQgeyBEYXRhZ3JpZFdpbGx5V29ua2EgfSBmcm9tICcuL2RhdGFncmlkLXdpbGx5LXdvbmthJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnY2xyLWRhdGFncmlkLCBjbHItZGctcm93JyB9KVxuZXhwb3J0IGNsYXNzIEFjdGlvbmFibGVPb21wYUxvb21wYSBleHRlbmRzIE9vbXBhTG9vbXBhIHtcbiAgcHJpdmF0ZSByb3dBY3Rpb25zOiBSb3dBY3Rpb25TZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIEBPcHRpb25hbCgpIHdpbGx5V29ua2E6IERhdGFncmlkV2lsbHlXb25rYSwgcm93QWN0aW9uczogUm93QWN0aW9uU2VydmljZSkge1xuICAgIGlmICghd2lsbHlXb25rYSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbHItZGctcm93IHNob3VsZCBvbmx5IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xyLWRhdGFncmlkJyk7XG4gICAgfVxuICAgIHN1cGVyKGNkciwgd2lsbHlXb25rYSk7XG4gICAgdGhpcy5yb3dBY3Rpb25zID0gcm93QWN0aW9ucztcbiAgfVxuXG4gIGdldCBmbGF2b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93QWN0aW9ucy5oYXNBY3Rpb25hYmxlUm93O1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFeHBhbmRhYmxlUm93c0NvdW50IHtcbiAgcHJpdmF0ZSBleHBhbmRhYmxlQ291bnQgPSAwO1xuXG4gIHB1YmxpYyByZWdpc3RlcigpIHtcbiAgICB0aGlzLmV4cGFuZGFibGVDb3VudCsrO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXIoKSB7XG4gICAgdGhpcy5leHBhbmRhYmxlQ291bnQtLTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmYWxzZSBtZWFucyBubyByb3dzIHdpdGggYWN0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0V4cGFuZGFibGVSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kYWJsZUNvdW50ID4gMDtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9vbXBhTG9vbXBhIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY2hvY29sYXRlL29vbXBhLWxvb21wYSc7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93c0NvdW50IH0gZnJvbSAnLi4vcHJvdmlkZXJzL2dsb2JhbC1leHBhbmRhYmxlLXJvd3MnO1xuaW1wb3J0IHsgRGF0YWdyaWRXaWxseVdvbmthIH0gZnJvbSAnLi9kYXRhZ3JpZC13aWxseS13b25rYSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ2Nsci1kYXRhZ3JpZCwgY2xyLWRnLXJvdycgfSlcbmV4cG9ydCBjbGFzcyBFeHBhbmRhYmxlT29tcGFMb29tcGEgZXh0ZW5kcyBPb21wYUxvb21wYSB7XG4gIHByaXZhdGUgZXhwYW5kYWJsZUNvdW50OiBFeHBhbmRhYmxlUm93c0NvdW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgd2lsbHlXb25rYTogRGF0YWdyaWRXaWxseVdvbmthLFxuICAgIGV4cGFuZGFibGVDb3VudDogRXhwYW5kYWJsZVJvd3NDb3VudFxuICApIHtcbiAgICBpZiAoIXdpbGx5V29ua2EpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xyLWRnLXJvdyBzaG91bGQgb25seSBiZSB1c2VkIGluc2lkZSBvZiBhIGNsci1kYXRhZ3JpZCcpO1xuICAgIH1cbiAgICBzdXBlcihjZHIsIHdpbGx5V29ua2EpO1xuICAgIHRoaXMuZXhwYW5kYWJsZUNvdW50ID0gZXhwYW5kYWJsZUNvdW50O1xuICB9XG5cbiAgZ2V0IGZsYXZvcigpIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlQ291bnQuaGFzRXhwYW5kYWJsZVJvdztcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuLyoqXG4gKiBHZW5lcmljIGFjY2Vzc29yIGZvciBkZWVwIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgYXMgc2ltcGxlIGRvdC1zZXBhcmF0ZWQgc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RlZFByb3BlcnR5PFQgPSBhbnk+IHtcbiAgcHJpdmF0ZSBzcGxpdFByb3A6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcHJvcDogc3RyaW5nKSB7XG4gICAgaWYgKHByb3AuaW5kZXhPZignLicpID49IDApIHtcbiAgICAgIHRoaXMuc3BsaXRQcm9wID0gcHJvcC5zcGxpdCgnLicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNhZmUgZ2V0dGVyIGZvciBhIGRlZXAgb2JqZWN0IHByb3BlcnR5LCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciBidXQgcmV0dXJuXG4gIC8vIHVuZGVmaW5lZCBpZiBvbmUgb2YgdGhlIGludGVybWVkaWF0ZSBwcm9wZXJ0aWVzIGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICBwdWJsaWMgZ2V0UHJvcFZhbHVlKGl0ZW06IFQpOiBhbnkge1xuICAgIGlmICh0aGlzLnNwbGl0UHJvcCkge1xuICAgICAgbGV0IHZhbHVlID0gaXRlbTtcbiAgICAgIGZvciAoY29uc3QgbmVzdGVkUHJvcCBvZiB0aGlzLnNwbGl0UHJvcCkge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB2YWx1ZVtuZXN0ZWRQcm9wXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWVbbmVzdGVkUHJvcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpdGVtW3RoaXMucHJvcF07XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENvbXBhcmF0b3JJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NvbXBhcmF0b3IuaW50ZXJmYWNlJztcbmltcG9ydCB7IE5lc3RlZFByb3BlcnR5IH0gZnJvbSAnLi4vbmVzdGVkLXByb3BlcnR5JztcblxuZXhwb3J0IGNsYXNzIERhdGFncmlkUHJvcGVydHlDb21wYXJhdG9yPFQgPSBhbnk+IGltcGxlbWVudHMgQ2xyRGF0YWdyaWRDb21wYXJhdG9ySW50ZXJmYWNlPFQ+IHtcbiAgcHJpdmF0ZSBuZXN0ZWRQcm9wOiBOZXN0ZWRQcm9wZXJ0eTxUPjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcDogc3RyaW5nKSB7XG4gICAgdGhpcy5uZXN0ZWRQcm9wID0gbmV3IE5lc3RlZFByb3BlcnR5KHByb3ApO1xuICB9XG5cbiAgcHVibGljIGNvbXBhcmUoYTogVCwgYjogVCk6IG51bWJlciB7XG4gICAgbGV0IHByb3BBID0gdGhpcy5uZXN0ZWRQcm9wLmdldFByb3BWYWx1ZShhKTtcbiAgICBsZXQgcHJvcEIgPSB0aGlzLm5lc3RlZFByb3AuZ2V0UHJvcFZhbHVlKGIpO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wQSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb3BBID0gcHJvcEEudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BCID09PSAnc3RyaW5nJykge1xuICAgICAgcHJvcEIgPSBwcm9wQi50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcEEgPT09ICd1bmRlZmluZWQnIHx8IHByb3BBID09PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BCID09PSAndW5kZWZpbmVkJyB8fCBwcm9wQiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BCID09PSAndW5kZWZpbmVkJyB8fCBwcm9wQiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2UgaWYgKHByb3BBIDwgcHJvcEIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIGlmIChwcm9wQSA+IHByb3BCKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDbHJEYXRhZ3JpZFN0cmluZ0ZpbHRlckludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc3RyaW5nLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTmVzdGVkUHJvcGVydHkgfSBmcm9tICcuLi9uZXN0ZWQtcHJvcGVydHknO1xuXG5leHBvcnQgY2xhc3MgRGF0YWdyaWRQcm9wZXJ0eVN0cmluZ0ZpbHRlcjxUID0gYW55PiBpbXBsZW1lbnRzIENsckRhdGFncmlkU3RyaW5nRmlsdGVySW50ZXJmYWNlPFQ+IHtcbiAgcHJpdmF0ZSBuZXN0ZWRQcm9wOiBOZXN0ZWRQcm9wZXJ0eTxUPjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcDogc3RyaW5nLCBwdWJsaWMgZXhhY3QgPSBmYWxzZSkge1xuICAgIHRoaXMubmVzdGVkUHJvcCA9IG5ldyBOZXN0ZWRQcm9wZXJ0eShwcm9wKTtcbiAgfVxuXG4gIGFjY2VwdHMoaXRlbTogVCwgc2VhcmNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSB0aGlzLm5lc3RlZFByb3AuZ2V0UHJvcFZhbHVlKGl0ZW0pO1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5leGFjdCkge1xuICAgICAgcmV0dXJuICgnJyArIHByb3BWYWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKCcnICsgcHJvcFZhbHVlKS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoKSA+PSAwO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgc29ydGluZyBvcmRlciBvZiBhIGRhdGFncmlkIGNvbHVtbi4gSXQgaXMgYSBjb25zdGFudCBFbnVtLFxuICogaS5lLiBlYWNoIHZhbHVlIG5lZWRzIHRvIGJlIHRyZWF0ZWQgYXMgYSBgbnVtYmVyYCwgc3RhcnRpbmcgYXQgaW5kZXggMC5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgZW51bSBDbHJEYXRhZ3JpZFNvcnRPcmRlciB7XG4gIFVOU09SVEVEID0gMCxcbiAgQVNDID0gMSxcbiAgREVTQyA9IC0xLFxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBOZ1pvbmUsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHJhZ0Rpc3BhdGNoZXIge1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IEZ1bmN0aW9uW107XG5cbiAgLy8gV2lsbCBiZSBsaXN0ZW5pbmcgdG8gRHJhZyBldmVudHMgb24gdGhlIGZvbGxvd2luZyBlbGVtZW50XG4gIGhhbmRsZVJlZjogRWxlbWVudFJlZjtcblxuICAvLyBFeHRyYSBlbGVtZW50IHRvIGJlIHVzZWQgZm9yIHRyYWNraW5nIGRyYWcgbW92ZW1lbnRzLlxuICBoYW5kbGVUcmFja2VyUmVmOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgX29uRHJhZ1N0YXJ0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHByaXZhdGUgX29uRHJhZ01vdmU6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBfb25EcmFnRW5kOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgZ2V0IG9uRHJhZ1N0YXJ0KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX29uRHJhZ1N0YXJ0O1xuICB9XG5cbiAgZ2V0IG9uRHJhZ01vdmUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fb25EcmFnTW92ZTtcbiAgfVxuXG4gIGdldCBvbkRyYWdFbmQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fb25EcmFnRW5kO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgYWRkRHJhZ0xpc3RlbmVyKCkge1xuICAgIGNvbnN0IGhhbmRsZUVsID0gdGhpcy5oYW5kbGVSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXG4gICAgICB0aGlzLmN1c3RvbURyYWdFdmVudChoYW5kbGVFbCwgJ21vdXNlZG93bicsICdtb3VzZW1vdmUnLCAnbW91c2V1cCcpLFxuICAgICAgdGhpcy5jdXN0b21EcmFnRXZlbnQoaGFuZGxlRWwsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcpLFxuICAgIF07XG4gIH1cblxuICBjdXN0b21EcmFnRXZlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHN0YXJ0T25FdmVudDogc3RyaW5nLCBtb3ZlT25FdmVudDogc3RyaW5nLCBlbmRPbkV2ZW50OiBzdHJpbmcpOiBGdW5jdGlvbiB7XG4gICAgbGV0IGRyYWdNb3ZlTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gICAgbGV0IGRyYWdFbmRMaXN0ZW5lcjogKCkgPT4gdm9pZDtcblxuICAgIHJldHVybiB0aGlzLl9yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgc3RhcnRPbkV2ZW50LCAoc3RhcnRFdmVudDogYW55KSA9PiB7XG4gICAgICB0aGlzLm5vdGlmeURyYWdTdGFydChzdGFydEV2ZW50KTtcblxuICAgICAgZHJhZ01vdmVMaXN0ZW5lciA9IHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgbW92ZU9uRXZlbnQsIChtb3ZlRXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZ5RHJhZ01vdmUobW92ZUV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZHJhZ0VuZExpc3RlbmVyID0gdGhpcy5fcmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsIGVuZE9uRXZlbnQsIChlbmRFdmVudDogYW55KSA9PiB7XG4gICAgICAgIC8vIFVuc3Vic2NyaWJpbmcgZnJvbSBtb3VzZU1vdmVMaXN0ZW5lclxuICAgICAgICBkcmFnTW92ZUxpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMubm90aWZ5RHJhZ0VuZChlbmRFdmVudCk7XG4gICAgICAgIC8vIFVuc3Vic2NyaWJpbmcgZnJvbSBpdHNlbGZcbiAgICAgICAgZHJhZ0VuZExpc3RlbmVyKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5vdGlmeURyYWdTdGFydChldmVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uRHJhZ1N0YXJ0Lm5leHQoZXZlbnQpO1xuICB9XG5cbiAgbm90aWZ5RHJhZ01vdmUoZXZlbnQ6IGFueSkge1xuICAgIHJldHVybiB0aGlzLl9vbkRyYWdNb3ZlLm5leHQoZXZlbnQpO1xuICB9XG5cbiAgbm90aWZ5RHJhZ0VuZChldmVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX29uRHJhZ0VuZC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLm1hcChldmVudCA9PiBldmVudCgpKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2xyRGF0YWdyaWRDb21wYXJhdG9ySW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb21wYXJhdG9yLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTdGF0ZURlYm91bmNlciB9IGZyb20gJy4vc3RhdGUtZGVib3VuY2VyLnByb3ZpZGVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNvcnQ8VCA9IGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0YXRlRGVib3VuY2VyOiBTdGF0ZURlYm91bmNlcikge31cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBjb21wYXJhdG9yXG4gICAqL1xuICBwcml2YXRlIF9jb21wYXJhdG9yOiBDbHJEYXRhZ3JpZENvbXBhcmF0b3JJbnRlcmZhY2U8VD47XG4gIHB1YmxpYyBnZXQgY29tcGFyYXRvcigpOiBDbHJEYXRhZ3JpZENvbXBhcmF0b3JJbnRlcmZhY2U8VD4ge1xuICAgIHJldHVybiB0aGlzLl9jb21wYXJhdG9yO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGFyYXRvcih2YWx1ZTogQ2xyRGF0YWdyaWRDb21wYXJhdG9ySW50ZXJmYWNlPFQ+KSB7XG4gICAgdGhpcy5zdGF0ZURlYm91bmNlci5jaGFuZ2VTdGFydCgpO1xuICAgIHRoaXMuX2NvbXBhcmF0b3IgPSB2YWx1ZTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB0aGlzLnN0YXRlRGVib3VuY2VyLmNoYW5nZURvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2NlbmRpbmcgb3JkZXIgaWYgZmFsc2UsIGRlc2NlbmRpbmcgaWYgdHJ1ZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmV2ZXJzZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IHJldmVyc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JldmVyc2U7XG4gIH1cbiAgcHVibGljIHNldCByZXZlcnNlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zdGF0ZURlYm91bmNlci5jaGFuZ2VTdGFydCgpO1xuICAgIHRoaXMuX3JldmVyc2UgPSB2YWx1ZTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB0aGlzLnN0YXRlRGVib3VuY2VyLmNoYW5nZURvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgT2JzZXJ2YWJsZSB0aGF0IGxldHMgb3RoZXIgY2xhc3NlcyBzdWJzY3JpYmUgdG8gc29ydCBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIF9jaGFuZ2UgPSBuZXcgU3ViamVjdDxTb3J0PFQ+PigpO1xuICBwcml2YXRlIGVtaXRDaGFuZ2UoKSB7XG4gICAgdGhpcy5fY2hhbmdlLm5leHQodGhpcyk7XG4gIH1cbiAgLy8gV2UgZG8gbm90IHdhbnQgdG8gZXhwb3NlIHRoZSBTdWJqZWN0IGl0c2VsZiwgYnV0IHRoZSBPYnNlcnZhYmxlIHdoaWNoIGlzIHJlYWQtb25seVxuICBwdWJsaWMgZ2V0IGNoYW5nZSgpOiBPYnNlcnZhYmxlPFNvcnQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBjb21wYXJhdG9yIGFzIHRoZSBjdXJyZW50IG9uZSwgb3IgdG9nZ2xlcyByZXZlcnNlIGlmIHRoZSBjb21wYXJhdG9yIGlzIGFscmVhZHkgdXNlZC4gVGhlXG4gICAqIG9wdGlvbmFsIGZvcmNlUmV2ZXJzZSBpbnB1dCBwYXJhbWV0ZXIgYWxsb3dzIHRvIG92ZXJyaWRlIHRoYXQgdG9nZ2xpbmcgYmVoYXZpb3IgYnkgc29ydGluZyBpblxuICAgKiByZXZlcnNlIG9yZGVyIGlmIGB0cnVlYC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFNvcnRcbiAgICovXG4gIHB1YmxpYyB0b2dnbGUoc29ydEJ5OiBDbHJEYXRhZ3JpZENvbXBhcmF0b3JJbnRlcmZhY2U8VD4sIGZvcmNlUmV2ZXJzZT86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnN0YXRlRGVib3VuY2VyLmNoYW5nZVN0YXJ0KCk7XG4gICAgLy8gV2UgbW9kaWZ5IHByaXZhdGUgcHJvcGVydGllcyBkaXJlY3RseSwgdG8gYmF0Y2ggdGhlIGNoYW5nZSBldmVudFxuICAgIGlmICh0aGlzLmNvbXBhcmF0b3IgPT09IHNvcnRCeSkge1xuICAgICAgdGhpcy5fcmV2ZXJzZSA9IHR5cGVvZiBmb3JjZVJldmVyc2UgIT09ICd1bmRlZmluZWQnID8gZm9yY2VSZXZlcnNlIHx8ICF0aGlzLl9yZXZlcnNlIDogIXRoaXMuX3JldmVyc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbXBhcmF0b3IgPSBzb3J0Qnk7XG4gICAgICB0aGlzLl9yZXZlcnNlID0gdHlwZW9mIGZvcmNlUmV2ZXJzZSAhPT0gJ3VuZGVmaW5lZCcgPyBmb3JjZVJldmVyc2UgOiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgdGhpcy5zdGF0ZURlYm91bmNlci5jaGFuZ2VEb25lKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjdXJyZW50IHNvcnRpbmcgb3JkZXJcbiAgICovXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmNvbXBhcmF0b3IgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIHR3byBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb21wYXJhdG9yXG4gICAqL1xuICBwdWJsaWMgY29tcGFyZShhOiBULCBiOiBUKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMucmV2ZXJzZSA/IC0xIDogMSkgKiB0aGlzLmNvbXBhcmF0b3IuY29tcGFyZShhLCBiKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbWJlZGRlZFZpZXdSZWYsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRHluYW1pY1dyYXBwZXIgfSBmcm9tICcuLi8uLi91dGlscy9ob3N0LXdyYXBwaW5nL2R5bmFtaWMtd3JhcHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RnLXdyYXBwZWQtY29sdW1uJyxcbiAgdGVtcGxhdGU6IGAgICAgICAgIFxuICAgICAgICA8bmctdGVtcGxhdGUgI2NvbHVtblBvcnRhbD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgLFxufSlcbmV4cG9ydCBjbGFzcyBXcmFwcGVkQ29sdW1uIGltcGxlbWVudHMgRHluYW1pY1dyYXBwZXIsIEFmdGVyVmlld0luaXQge1xuICBfZHluYW1pYyA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbHVtblBvcnRhbCcpIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgY29sdW1uVmlldzogRW1iZWRkZWRWaWV3UmVmPHZvaWQ+OyAvLyB0aGUgY29sdW1ucyBwcm9qZWN0ZWQgdmlldyAoaW4gbWVtb3J5KVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBDcmVhdGUgdGhlIGNlbGxzIHZpZXcgaW4gbWVtb3J5LCBub3QgdGhlIERPTS5cbiAgICB0aGlzLmNvbHVtblZpZXcgPSB0aGlzLnRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBIb3N0V3JhcHBlciB9IGZyb20gJy4uLy4uL3V0aWxzL2hvc3Qtd3JhcHBpbmcvaG9zdC13cmFwcGVyJztcblxuaW1wb3J0IHsgRGF0YWdyaWRQcm9wZXJ0eUNvbXBhcmF0b3IgfSBmcm9tICcuL2J1aWx0LWluL2NvbXBhcmF0b3JzL2RhdGFncmlkLXByb3BlcnR5LWNvbXBhcmF0b3InO1xuaW1wb3J0IHsgRGF0YWdyaWRQcm9wZXJ0eVN0cmluZ0ZpbHRlciB9IGZyb20gJy4vYnVpbHQtaW4vZmlsdGVycy9kYXRhZ3JpZC1wcm9wZXJ0eS1zdHJpbmctZmlsdGVyJztcbmltcG9ydCB7IERhdGFncmlkU3RyaW5nRmlsdGVySW1wbCB9IGZyb20gJy4vYnVpbHQtaW4vZmlsdGVycy9kYXRhZ3JpZC1zdHJpbmctZmlsdGVyLWltcGwnO1xuaW1wb3J0IHsgRGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsIH0gZnJvbSAnLi9kYXRhZ3JpZC1oaWRlYWJsZS1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRTb3J0T3JkZXIgfSBmcm9tICcuL2VudW1zL3NvcnQtb3JkZXIuZW51bSc7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENvbXBhcmF0b3JJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvY29tcGFyYXRvci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3VzdG9tRmlsdGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvY3VzdG9tLWZpbHRlcic7XG5pbXBvcnQgeyBEcmFnRGlzcGF0Y2hlciB9IGZyb20gJy4vcHJvdmlkZXJzL2RyYWctZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBGaWx0ZXJzUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9maWx0ZXJzJztcbmltcG9ydCB7IFNvcnQgfSBmcm9tICcuL3Byb3ZpZGVycy9zb3J0JztcbmltcG9ydCB7IERhdGFncmlkRmlsdGVyUmVnaXN0cmFyIH0gZnJvbSAnLi91dGlscy9kYXRhZ3JpZC1maWx0ZXItcmVnaXN0cmFyJztcbmltcG9ydCB7IFdyYXBwZWRDb2x1bW4gfSBmcm9tICcuL3dyYXBwZWQtY29sdW1uJztcblxubGV0IG5iQ291bnQ6IG51bWJlciA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1jb2x1bW4nLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YWdyaWQtY29sdW1uLWZsZXhcIj5cbiAgICAgICAgICAgIDwhLS0gSSdtIHJlYWxseSBub3QgaGFwcHkgd2l0aCB0aGF0IHNlbGVjdCBzaW5jZSBpdCdzIG5vdCB2ZXJ5IHNjYWxhYmxlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWRnLWZpbHRlciwgY2xyLWRnLXN0cmluZy1maWx0ZXJcIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgICAgIDxjbHItZGctc3RyaW5nLWZpbHRlclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkICYmICFjdXN0b21GaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xyRGdTdHJpbmdGaWx0ZXJdPVwicmVnaXN0ZXJlZFwiXG4gICAgICAgICAgICAgICAgICAgIFsoY2xyRmlsdGVyVmFsdWUpXT1cImZpbHRlclZhbHVlXCI+PC9jbHItZGctc3RyaW5nLWZpbHRlcj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb2x1bW5UaXRsZT5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGF0YWdyaWQtY29sdW1uLXRpdGxlXCIgKm5nSWY9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0KClcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtblRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRhZ3JpZC1jb2x1bW4tdGl0bGVcIiAqbmdJZj1cIiFzb3J0YWJsZVwiPlxuICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtblRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhZ3JpZC1jb2x1bW4tc2VwYXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAjY29sdW1uSGFuZGxlIGNsYXNzPVwiZGF0YWdyaWQtY29sdW1uLWhhbmRsZVwiIHRhYmluZGV4PVwiLTFcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiAjY29sdW1uSGFuZGxlVHJhY2tlciBjbGFzcz1cImRhdGFncmlkLWNvbHVtbi1oYW5kbGUtdHJhY2tlclwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmRhdGFncmlkLWNvbHVtbl0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5kYXRhZ3JpZC1jb2x1bW4tLWhpZGRlbl0nOiAnaGlkZGVuJyxcbiAgICAnW2F0dHIuYXJpYS1zb3J0XSc6ICdhcmlhU29ydCcsXG4gICAgcm9sZTogJ2NvbHVtbmhlYWRlcicsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGFncmlkQ29sdW1uPFQgPSBhbnk+IGV4dGVuZHMgRGF0YWdyaWRGaWx0ZXJSZWdpc3RyYXI8VCwgRGF0YWdyaWRTdHJpbmdGaWx0ZXJJbXBsPFQ+PlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfc29ydDogU29ydDxUPixcbiAgICBmaWx0ZXJzOiBGaWx0ZXJzUHJvdmlkZXI8VD4sXG4gICAgcHJpdmF0ZSBfZHJhZ0Rpc3BhdGNoZXI6IERyYWdEaXNwYXRjaGVyLFxuICAgIHByaXZhdGUgdmNyOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIHN1cGVyKGZpbHRlcnMpO1xuICAgIHRoaXMuX3NvcnRTdWJzY3JpcHRpb24gPSBfc29ydC5jaGFuZ2Uuc3Vic2NyaWJlKHNvcnQgPT4ge1xuICAgICAgLy8gV2UncmUgb25seSBsaXN0ZW5pbmcgdG8gbWFrZSBzdXJlIHdlIGVtaXQgYW4gZXZlbnQgd2hlbiB0aGUgY29sdW1uIGdvZXMgZnJvbSBzb3J0ZWQgdG8gdW5zb3J0ZWRcbiAgICAgIGlmICh0aGlzLnNvcnRPcmRlciAhPT0gQ2xyRGF0YWdyaWRTb3J0T3JkZXIuVU5TT1JURUQgJiYgc29ydC5jb21wYXJhdG9yICE9PSB0aGlzLl9zb3J0QnkpIHtcbiAgICAgICAgdGhpcy5fc29ydE9yZGVyID0gQ2xyRGF0YWdyaWRTb3J0T3JkZXIuVU5TT1JURUQ7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyQ2hhbmdlLmVtaXQodGhpcy5fc29ydE9yZGVyKTtcbiAgICAgIH1cbiAgICAgIC8vIGRlcHJlY2F0ZWQ6IHRvIGJlIHJlbW92ZWQgLSBTVEFSVFxuICAgICAgaWYgKHRoaXMuc29ydGVkICYmIHNvcnQuY29tcGFyYXRvciAhPT0gdGhpcy5fc29ydEJ5KSB7XG4gICAgICAgIHRoaXMuX3NvcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvcnRlZENoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIGRlcHJlY2F0ZWQ6IHRvIGJlIHJlbW92ZWQgLSBFTkRcbiAgICB9KTtcblxuICAgIHRoaXMuY29sdW1uSWQgPSAnZGctY29sLScgKyBuYkNvdW50LnRvU3RyaW5nKCk7IC8vIEFwcHJveGltYXRlIGEgR1VJRFxuICAgIG5iQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY29sdW1uSWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgQ2xyRGF0YWdyaWRDb2x1bW4gY2xhc3MgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgbnVtYmVyIG9mIENsckRhdGFncmlkQ29sdW1uIGluc3RhbmNlcyBmb3IgYSBEYXRhZ3JpZC5cbiAgICogSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBpZCBmb3IgdGhlIENsckRhdGFncmlkQ29sdW1uIGluc3RhbmNlLlxuICAgKlxuICAgKi9cbiAgcHVibGljIGNvbHVtbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBoaWRkZW5cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcHJvcGVydHkgdGhhdCBhbGxvd3MgdGhlIGNvbHVtbiB0byBiZSBoaWRkZW4gLyBzaG93biB3aXRoIGNzc1xuICAgKiBOb3RlIHRoZSBkZWZhdWx0IGFsbG93cyB0aGUgQ2xyRGF0YWdyaWRDb2x1bW4gdG8gaGF2ZSBhbiAqbmdJZiBvbiBpdC4gKEVIQ0FJV0MgLSB3aWxsIG9jY3VyIGlmIGl0cyBub3RcbiAgICogaW5pdGlhbGl6ZWQpXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmhpZGVhYmxlICYmIHRoaXMuaGlkZWFibGUuaGlkZGVuO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnY29sdW1uSGFuZGxlJylcbiAgc2V0IGhhbmRsZUVsUmVmKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5fZHJhZ0Rpc3BhdGNoZXIuaGFuZGxlUmVmID0gdmFsdWU7XG4gIH1cblxuICBAVmlld0NoaWxkKCdjb2x1bW5IYW5kbGVUcmFja2VyJylcbiAgc2V0IGhhbmRsZVRyYWNrZXJFbFJlZih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgIHRoaXMuX2RyYWdEaXNwYXRjaGVyLmhhbmRsZVRyYWNrZXJSZWYgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIHNvcnQgc2VydmljZSBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIF9zb3J0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc29ydFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLypcbiAgICAgKiBTaW1wbGUgb2JqZWN0IHByb3BlcnR5IHNob3J0Y3V0LCBhY3RpdmF0ZXMgYm90aCBzb3J0aW5nIGFuZCBmaWx0ZXJpbmdcbiAgICAgKiBiYXNlZCBvbiBuYXRpdmUgY29tcGFyaXNvbiBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9uIHRoZSBpdGVtcy5cbiAgICAgKi9cbiAgcHJpdmF0ZSBfZmllbGQ6IHN0cmluZztcbiAgcHVibGljIGdldCBmaWVsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQ7XG4gIH1cblxuICBASW5wdXQoJ2NsckRnRmllbGQnKVxuICBwdWJsaWMgc2V0IGZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fZmllbGQgPSBmaWVsZDtcbiAgICAgIGlmICghdGhpcy5jdXN0b21GaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5zZXRGaWx0ZXIobmV3IERhdGFncmlkU3RyaW5nRmlsdGVySW1wbChuZXcgRGF0YWdyaWRQcm9wZXJ0eVN0cmluZ0ZpbHRlcihmaWVsZCkpKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fc29ydEJ5KSB7XG4gICAgICAgIHRoaXMuX3NvcnRCeSA9IG5ldyBEYXRhZ3JpZFByb3BlcnR5Q29tcGFyYXRvcihmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsckRhdGFncmlkQ29tcGFyYXRvckludGVyZmFjZSB0byB1c2Ugd2hlbiBzb3J0aW5nIHRoZSBjb2x1bW5cbiAgICovXG5cbiAgcHJpdmF0ZSBfc29ydEJ5OiBDbHJEYXRhZ3JpZENvbXBhcmF0b3JJbnRlcmZhY2U8VD47XG5cbiAgcHVibGljIGdldCBzb3J0QnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeTtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRGdTb3J0QnknKVxuICBwdWJsaWMgc2V0IHNvcnRCeShjb21wYXJhdG9yOiBDbHJEYXRhZ3JpZENvbXBhcmF0b3JJbnRlcmZhY2U8VD4gfCBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGNvbXBhcmF0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9zb3J0QnkgPSBuZXcgRGF0YWdyaWRQcm9wZXJ0eUNvbXBhcmF0b3IoY29tcGFyYXRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIHRoaXMuX3NvcnRCeSA9IGNvbXBhcmF0b3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZmllbGQpIHtcbiAgICAgICAgICB0aGlzLl9zb3J0QnkgPSBuZXcgRGF0YWdyaWRQcm9wZXJ0eUNvbXBhcmF0b3IodGhpcy5fZmllbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zb3J0Qnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBjb2x1bW4gaXMgc29ydGFibGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc29ydGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc29ydEJ5O1xuICB9XG5cbiAgLy8gZGVwcmVjYXRlZDogdG8gYmUgcmVtb3ZlZCAtIFNUQVJUXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGNvbHVtbiBpcyBjdXJyZW50bHkgc29ydGVkXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgd2lsbCBiZSByZW1vdmVkIHNvb24sIGluIGZhdm9yIG9mIHRoZSBzb3J0T3JkZXIgbWVjaGFuaXNtXG4gICAqL1xuICBwcml2YXRlIF9zb3J0ZWQgPSBmYWxzZTtcbiAgcHVibGljIGdldCBzb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBzb29uLCBpbiBmYXZvciBvZiB0aGUgc29ydE9yZGVyIG1lY2hhbmlzbVxuICAgKi9cbiAgQElucHV0KCdjbHJEZ1NvcnRlZCcpXG4gIHB1YmxpYyBzZXQgc29ydGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKCF2YWx1ZSAmJiB0aGlzLnNvcnRlZCkge1xuICAgICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zb3J0LmNsZWFyKCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAhdGhpcy5zb3J0ZWQpIHtcbiAgICAgIHRoaXMuc29ydCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBzb29uLCBpbiBmYXZvciBvZiB0aGUgc29ydE9yZGVyIG1lY2hhbmlzbVxuICAgKi9cbiAgQE91dHB1dCgnY2xyRGdTb3J0ZWRDaGFuZ2UnKSBwdWJsaWMgc29ydGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8vIGRlcHJlY2F0ZWQ6IHRvIGJlIHJlbW92ZWQgLSBFTkRcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyB0aGUgY29sdW1uIGlzIGN1cnJlbnRseSBzb3J0ZWRcbiAgICovXG4gIHByaXZhdGUgX3NvcnRPcmRlcjogQ2xyRGF0YWdyaWRTb3J0T3JkZXIgPSBDbHJEYXRhZ3JpZFNvcnRPcmRlci5VTlNPUlRFRDtcbiAgcHVibGljIGdldCBzb3J0T3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRPcmRlcjtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRGdTb3J0T3JkZXInKVxuICBwdWJsaWMgc2V0IHNvcnRPcmRlcih2YWx1ZTogQ2xyRGF0YWdyaWRTb3J0T3JkZXIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9ubHkgaWYgdGhlIGluY29taW5nIG9yZGVyIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZVxuICAgIGlmICh0aGlzLl9zb3J0T3JkZXIgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgLy8gdGhlIFVuc29ydGVkIGNhc2UgaGFwcGVucyB3aGVuIHRoZSBjdXJyZW50IHN0YXRlIGlzIGVpdGhlciBBc2Mgb3IgRGVzY1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNhc2UgQ2xyRGF0YWdyaWRTb3J0T3JkZXIuVU5TT1JURUQ6XG4gICAgICAgIHRoaXMuX3NvcnQuY2xlYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENsckRhdGFncmlkU29ydE9yZGVyLkFTQzpcbiAgICAgICAgdGhpcy5zb3J0KGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENsckRhdGFncmlkU29ydE9yZGVyLkRFU0M6XG4gICAgICAgIHRoaXMuc29ydCh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhcmlhU29ydCgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3NvcnRPcmRlcikge1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNhc2UgQ2xyRGF0YWdyaWRTb3J0T3JkZXIuVU5TT1JURUQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgICBjYXNlIENsckRhdGFncmlkU29ydE9yZGVyLkFTQzpcbiAgICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgICAgY2FzZSBDbHJEYXRhZ3JpZFNvcnRPcmRlci5ERVNDOlxuICAgICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckRnU29ydE9yZGVyQ2hhbmdlJykgcHVibGljIHNvcnRPcmRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xyRGF0YWdyaWRTb3J0T3JkZXI+KCk7XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSBkYXRhZ3JpZCBiYXNlZCBvbiB0aGlzIGNvbHVtblxuICAgKi9cbiAgcHVibGljIHNvcnQocmV2ZXJzZT86IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuc29ydGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zb3J0LnRvZ2dsZSh0aGlzLl9zb3J0QnksIHJldmVyc2UpO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgcHJpdmF0ZSB2YXJpYWJsZSB0byBub3QgcmV0cmlnZ2VyIHRoZSBzZXR0ZXIgbG9naWNcbiAgICB0aGlzLl9zb3J0T3JkZXIgPSB0aGlzLl9zb3J0LnJldmVyc2UgPyBDbHJEYXRhZ3JpZFNvcnRPcmRlci5ERVNDIDogQ2xyRGF0YWdyaWRTb3J0T3JkZXIuQVNDO1xuICAgIHRoaXMuc29ydE9yZGVyQ2hhbmdlLmVtaXQodGhpcy5fc29ydE9yZGVyKTtcblxuICAgIC8vIGRlcHJlY2F0ZWQ6IHRvIGJlIHJlbW92ZWQgLSBTVEFSVFxuICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gICAgdGhpcy5zb3J0ZWRDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAvLyBkZXByZWNhdGVkOiB0byBiZSByZW1vdmVkIC0gRU5EXG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBjb2x1bW4gaXMgY3VycmVudGx5IHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYXNjJylcbiAgcHVibGljIGdldCBhc2MoKSB7XG4gICAgLy8gZGVwcmVjYXRlZDogaWYgY29uZGl0aW9uIHRvIGJlIHJlbW92ZWQgLSBTVEFSVFxuICAgIGlmICh0eXBlb2YgdGhpcy5zb3J0T3JkZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWQgJiYgIXRoaXMuX3NvcnQucmV2ZXJzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydE9yZGVyID09PSBDbHJEYXRhZ3JpZFNvcnRPcmRlci5BU0M7XG4gICAgfVxuICAgIC8vIGRlcHJlY2F0ZWQ6IGlmIGNvbmRpdGlvbiB0byBiZSByZW1vdmVkIC0gRU5EXG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBjb2x1bW4gaXMgY3VycmVudGx5IHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRlc2MnKVxuICBwdWJsaWMgZ2V0IGRlc2MoKSB7XG4gICAgLy8gZGVwcmVjYXRlZDogaWYgY29uZGl0aW9uIHRvIGJlIHJlbW92ZWQgLSBTVEFSVFxuICAgIGlmICh0eXBlb2YgdGhpcy5zb3J0T3JkZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWQgJiYgdGhpcy5fc29ydC5yZXZlcnNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0T3JkZXIgPT09IENsckRhdGFncmlkU29ydE9yZGVyLkRFU0M7XG4gICAgfVxuICAgIC8vIGRlcHJlY2F0ZWQ6IGlmIGNvbmRpdGlvbiB0byBiZSByZW1vdmVkIC0gRU5EXG4gIH1cblxuICAvKipcbiAgICogQSBjdXN0b20gZmlsdGVyIGZvciB0aGlzIGNvbHVtbiB0aGF0IGNhbiBiZSBwcm92aWRlZCBpbiB0aGUgcHJvamVjdGVkIGNvbnRlbnRcbiAgICovXG4gIHB1YmxpYyBjdXN0b21GaWx0ZXIgPSBmYWxzZTtcblxuICBAQ29udGVudENoaWxkKEN1c3RvbUZpbHRlcilcbiAgcHVibGljIHNldCBwcm9qZWN0ZWRGaWx0ZXIoY3VzdG9tOiBhbnkpIHtcbiAgICBpZiAoY3VzdG9tKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZpbHRlcigpO1xuICAgICAgdGhpcy5jdXN0b21GaWx0ZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyLnZhbHVlO1xuICB9XG5cbiAgQElucHV0KCdjbHJGaWx0ZXJWYWx1ZScpXG4gIHB1YmxpYyBzZXQgdXBkYXRlRmlsdGVyVmFsdWUobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5maWx0ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgbmV3VmFsdWUgPSAnJztcbiAgICB9XG4gICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLmZpbHRlci52YWx1ZSkge1xuICAgICAgdGhpcy5maWx0ZXIudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0IGZpbHRlclZhbHVlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5maWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyLnZhbHVlKTtcbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckZpbHRlclZhbHVlQ2hhbmdlJykgZmlsdGVyVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqKioqKioqKioqXG4gICAqXG4gICAqIEBwcm9wZXJ0eSBoaWRlYWJsZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2hlbiBhIGNvbHVtbiBpcyBoaWRlYWJsZSB0aGlzIGlzIGRlZmluZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWwuXG4gICAqIFdoZW4gaXRzIG5vdCBoaWRlYWJsZSBzaG91bGQgYmUgdW5kZWZpbmVkLlxuICAgKlxuICAgKi9cbiAgcHVibGljIGhpZGVhYmxlOiBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWw7XG5cbiAgcHJpdmF0ZSB3cmFwcGVkSW5qZWN0b3I6IEluamVjdG9yO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud3JhcHBlZEluamVjdG9yID0gbmV3IEhvc3RXcmFwcGVyKFdyYXBwZWRDb2x1bW4sIHRoaXMudmNyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgX3ZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZEluamVjdG9yLmdldChXcmFwcGVkQ29sdW1uLCB0aGlzLnZjcikuY29sdW1uVmlldztcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHJhY2tCeUZ1bmN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRmlsdGVyc1Byb3ZpZGVyIH0gZnJvbSAnLi9maWx0ZXJzJztcbmltcG9ydCB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gJy4vc29ydCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJdGVtczxUID0gYW55PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpbHRlcnM6IEZpbHRlcnNQcm92aWRlcjxUPiwgcHJpdmF0ZSBfc29ydDogU29ydDxUPiwgcHJpdmF0ZSBfcGFnZTogUGFnZSkge31cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBkYXRhIGlzIGN1cnJlbnRseSBsb2FkaW5nXG4gICAqL1xuICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuXG4gIC8vIFRPRE86IFZlcmlmeSB0aGF0IHRyYWNrQnkgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlICpuZ0ZvciBjYXNlIHRvb1xuICAvKipcbiAgICogVHJhY2tpbmcgZnVuY3Rpb24gdG8gaWRlbnRpZnkgb2JqZWN0cy4gRGVmYXVsdCBpcyByZWZlcmVuY2UgZXF1YWxpdHkuXG4gICAqL1xuICBwdWJsaWMgdHJhY2tCeTogVHJhY2tCeUZ1bmN0aW9uPFQ+ID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpID0+IGl0ZW07XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbnMgdG8gdGhlIG90aGVyIHByb3ZpZGVycyBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlsdGVyc1N1YjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9zb3J0U3ViOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX3BhZ2VTdWI6IFN1YnNjcmlwdGlvbjtcbiAgLyoqXG4gICAqIENsZWFucyB1cCBvdXIgc3Vic2NyaXB0aW9ucyB0byBvdGhlciBwcm92aWRlcnNcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9maWx0ZXJzU3ViKSB7XG4gICAgICB0aGlzLl9maWx0ZXJzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3J0U3ViKSB7XG4gICAgICB0aGlzLl9zb3J0U3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wYWdlU3ViKSB7XG4gICAgICB0aGlzLl9wYWdlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBzbWFydCBpdGVtcyBmb3IgdGhpcyBkYXRhZ3JpZCBvciBsZXQgdGhlIHVzZXIgaGFuZGxlXG4gICAqIGV2ZXJ5dGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9zbWFydCA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IHNtYXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zbWFydDtcbiAgfVxuICBwdWJsaWMgc21hcnRlblVwKCkge1xuICAgIHRoaXMuX3NtYXJ0ID0gdHJ1ZTtcbiAgICAvKlxuICAgICAgICAgKiBUaGVzZSBvYnNlcnZlcnMgdHJpZ2dlciBhIGNoYWluIG9mIGZ1bmN0aW9uOiBmaWx0ZXIgLT4gc29ydCAtPiBwYWdpbmF0ZVxuICAgICAgICAgKiBBbiBvYnNlcnZlciB1cCB0aGUgY2hhaW4gcmUtdHJpZ2dlcnMgYWxsIHRoZSBvcGVyYXRpb25zIHRoYXQgZm9sbG93IGl0LlxuICAgICAgICAgKi9cbiAgICB0aGlzLl9maWx0ZXJzU3ViID0gdGhpcy5fZmlsdGVycy5jaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2ZpbHRlckl0ZW1zKCkpO1xuICAgIHRoaXMuX3NvcnRTdWIgPSB0aGlzLl9zb3J0LmNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlLCBpZiB0aGUgZGF0YWdyaWQgd2VudCBmcm9tIHNvcnRlZCB0byB1bnNvcnRlZCwgd2UgaGF2ZSB0byByZS1maWx0ZXJcbiAgICAgIC8vIHRvIGdldCB0aGUgb3JpZ2luYWwgb3JkZXIgYmFja1xuICAgICAgaWYgKCF0aGlzLl9zb3J0LmNvbXBhcmF0b3IpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVySXRlbXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NvcnRJdGVtcygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX3BhZ2VTdWIgPSB0aGlzLl9wYWdlLmNoYW5nZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fY2hhbmdlUGFnZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFsbCBpdGVtcyBpbiB0aGUgZGF0YWdyaWRcbiAgICovXG4gIHByaXZhdGUgX2FsbDogVFtdO1xuICBwdWJsaWMgZ2V0IGFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsKGl0ZW1zOiBUW10pIHtcbiAgICB0aGlzLl9hbGwgPSBpdGVtcztcbiAgICB0aGlzLmVtaXRBbGxDaGFuZ2VzKGl0ZW1zKTtcbiAgICBpZiAodGhpcy5zbWFydCkge1xuICAgICAgdGhpcy5fZmlsdGVySXRlbXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGlzcGxheWVkID0gaXRlbXM7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgcmVjb21wdXRlIHRoZSBsaXN0IG9mIGRpc3BsYXllZCBpdGVtc1xuICAgKi9cbiAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgaWYgKHRoaXMuc21hcnQpIHtcbiAgICAgIHRoaXMuX2ZpbHRlckl0ZW1zKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHRlbXBvcmFyeSBzdGVwLCB3aGljaCB3ZSBwcmVzZXJ2ZSB0byBhdm9pZCByZS1maWx0ZXJpbmcgb3IgcmUtc29ydGluZyBpZiBub3QgbmVjZXNzYXJ5XG4gICAqL1xuICBwcml2YXRlIF9maWx0ZXJlZDogVFtdO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGl0ZW1zIGN1cnJlbnRseSBkaXNwbGF5ZWRcbiAgICovXG4gIHByaXZhdGUgX2Rpc3BsYXllZDogVFtdID0gW107XG4gIHB1YmxpYyBnZXQgZGlzcGxheWVkKCk6IFRbXSB7XG4gICAgLy8gSWRlYWxseSB3ZSBjb3VsZCByZXR1cm4gYW4gaW1tdXRhYmxlIGFycmF5LCBidXQgd2UgZG9uJ3QgaGF2ZSBpdCBpbiBDbGFyaXR5IHlldC5cbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNlcnZhYmxlIHRoYXQgbGV0cyBvdGhlciBjbGFzc2VzIHN1YnNjcmliZSB0byBpdGVtcyBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIF9jaGFuZ2UgPSBuZXcgU3ViamVjdDxUW10+KCk7XG4gIHByaXZhdGUgZW1pdENoYW5nZSgpIHtcbiAgICB0aGlzLl9jaGFuZ2UubmV4dCh0aGlzLmRpc3BsYXllZCk7XG4gIH1cbiAgLy8gV2UgZG8gbm90IHdhbnQgdG8gZXhwb3NlIHRoZSBTdWJqZWN0IGl0c2VsZiwgYnV0IHRoZSBPYnNlcnZhYmxlIHdoaWNoIGlzIHJlYWQtb25seVxuICBwdWJsaWMgZ2V0IGNoYW5nZSgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIF9hbGxDaGFuZ2VzID0gbmV3IFN1YmplY3Q8VFtdPigpO1xuICBwcml2YXRlIGVtaXRBbGxDaGFuZ2VzKGl0ZW1zOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLl9hbGxDaGFuZ2VzLm5leHQoaXRlbXMpO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGxDaGFuZ2VzKCk6IE9ic2VydmFibGU8VFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbENoYW5nZXMuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgZGF0YSB0byBwcm9jZXNzIHlldCwgdG8gYWJvcnQgZWFybHkgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXQgdW5pbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gIXRoaXMuX2FsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzUHJvdmlkZXIgaXRlbXMgZnJvbSB0aGUgcmF3IGxpc3RcbiAgICovXG4gIHByaXZhdGUgX2ZpbHRlckl0ZW1zKCkge1xuICAgIGlmICh0aGlzLnVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZpbHRlcnMuaGFzQWN0aXZlRmlsdGVycygpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJlZCA9IHRoaXMuX2FsbC5maWx0ZXIoaXRlbSA9PiB0aGlzLl9maWx0ZXJzLmFjY2VwdHMoaXRlbSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXb3JrIG9uIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBhcnJheSwgdG8gbm90IG1vZGlmeSB0aGUgdXNlcidzIG1vZGVsXG4gICAgICB0aGlzLl9maWx0ZXJlZCA9IHRoaXMuX2FsbC5zbGljZSgpO1xuICAgIH1cbiAgICB0aGlzLl9wYWdlLnRvdGFsSXRlbXMgPSB0aGlzLl9maWx0ZXJlZC5sZW5ndGg7XG4gICAgdGhpcy5fc29ydEl0ZW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgaXRlbXMgaW4gdGhlIGZpbHRlcmVkIGxpc3RcbiAgICovXG4gIHByaXZhdGUgX3NvcnRJdGVtcygpIHtcbiAgICBpZiAodGhpcy51bmluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3J0LmNvbXBhcmF0b3IpIHtcbiAgICAgIHRoaXMuX2ZpbHRlcmVkLnNvcnQoKGEsIGIpID0+IHRoaXMuX3NvcnQuY29tcGFyZShhLCBiKSk7XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZVBhZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgY3VycmVudCBwYWdlIGZyb20gdGhlIHNvcnRlZCBsaXN0XG4gICAqL1xuICBwcml2YXRlIF9jaGFuZ2VQYWdlKCkge1xuICAgIGlmICh0aGlzLnVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3BhZ2Uuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXllZCA9IHRoaXMuX2ZpbHRlcmVkLnNsaWNlKHRoaXMuX3BhZ2UuZmlyc3RJdGVtLCB0aGlzLl9wYWdlLmxhc3RJdGVtICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXllZCA9IHRoaXMuX2ZpbHRlcmVkO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgTmdGb3JPZiwgTmdGb3JPZkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBEb0NoZWNrLFxuICBJbnB1dCxcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSXRlbXMgfSBmcm9tICcuL3Byb3ZpZGVycy9pdGVtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NsckRnSXRlbXNdW2NsckRnSXRlbXNPZl0nLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRhZ3JpZEl0ZW1zPFQ+IGltcGxlbWVudHMgRG9DaGVjaywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBpdGVyYWJsZVByb3h5OiBOZ0Zvck9mPFQ+O1xuICBwcml2YXRlIF9yYXdJdGVtczogVFtdO1xuICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIEBJbnB1dCgnY2xyRGdJdGVtc09mJylcbiAgcHVibGljIHNldCByYXdJdGVtcyhpdGVtczogVFtdKSB7XG4gICAgdGhpcy5fcmF3SXRlbXMgPSBpdGVtcyA/IGl0ZW1zIDogW107IC8vIGxvY2FsIGNvcHkgZm9yIG5nT25DaGFuZ2UgZGlmZmluZ1xuICB9XG5cbiAgQElucHV0KCdjbHJEZ0l0ZW1zVHJhY2tCeScpXG4gIHNldCB0cmFja0J5KHZhbHVlOiBUcmFja0J5RnVuY3Rpb248VD4pIHtcbiAgICB0aGlzLml0ZXJhYmxlUHJveHkubmdGb3JUcmFja0J5ID0gdmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPE5nRm9yT2ZDb250ZXh0PFQ+PixcbiAgICBwcml2YXRlIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICBwcml2YXRlIGl0ZW1zOiBJdGVtcyxcbiAgICBwcml2YXRlIHZjcjogVmlld0NvbnRhaW5lclJlZlxuICApIHtcbiAgICBpdGVtcy5zbWFydGVuVXAoKTtcbiAgICB0aGlzLml0ZXJhYmxlUHJveHkgPSBuZXcgTmdGb3JPZjxUPih0aGlzLnZjciwgdGhpcy50ZW1wbGF0ZSwgdGhpcy5kaWZmZXJzKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGl0ZW1zLmNoYW5nZS5zdWJzY3JpYmUobmV3SXRlbXMgPT4ge1xuICAgICAgICB0aGlzLml0ZXJhYmxlUHJveHkubmdGb3JPZiA9IG5ld0l0ZW1zO1xuICAgICAgICB0aGlzLml0ZXJhYmxlUHJveHkubmdEb0NoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKCF0aGlzLmRpZmZlcikge1xuICAgICAgdGhpcy5kaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh0aGlzLl9yYXdJdGVtcykuY3JlYXRlKHRoaXMuaXRlcmFibGVQcm94eS5uZ0ZvclRyYWNrQnkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaWZmZXIpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmRpZmZlci5kaWZmKHRoaXMuX3Jhd0l0ZW1zKTtcbiAgICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIC8vIFRPRE86IG5vdCB2ZXJ5IGVmZmljaWVudCByaWdodCBub3csXG4gICAgICAgIC8vIGJ1dCBwcmVtYXR1cmUgb3B0aW1pemF0aW9uIGlzIHRoZSByb290IG9mIGFsbCBldmlsLlxuICAgICAgICB0aGlzLml0ZW1zLmFsbCA9IHRoaXMuX3Jhd0l0ZW1zO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSXRlbXMgfSBmcm9tICcuL3Byb3ZpZGVycy9pdGVtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1wbGFjZWhvbGRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZGF0YWdyaWQtcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmRhdGFncmlkLWVtcHR5XT1cImVtcHR5RGF0YWdyaWRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YWdyaWQtcGxhY2Vob2xkZXItaW1hZ2VcIiAqbmdJZj1cImVtcHR5RGF0YWdyaWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCAqbmdJZj1cImVtcHR5RGF0YWdyaWRcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgIGAsXG4gIGhvc3Q6IHsgJ1tjbGFzcy5kYXRhZ3JpZC1wbGFjZWhvbGRlci1jb250YWluZXJdJzogJ3RydWUnIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGFncmlkUGxhY2Vob2xkZXI8VCA9IGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGl0ZW1zOiBJdGVtczxUPikge31cblxuICAvKipcbiAgICogVGVzdHMgaWYgdGhlIGRhdGFncmlkIGlzIGVtcHR5LCBtZWFuaW5nIGl0IGRvZXNuJ3QgY29udGFpbiBhbnkgaXRlbXNcbiAgICovXG4gIHB1YmxpYyBnZXQgZW1wdHlEYXRhZ3JpZCgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXRlbXMubG9hZGluZyAmJiAoIXRoaXMuaXRlbXMuZGlzcGxheWVkIHx8IHRoaXMuaXRlbXMuZGlzcGxheWVkLmxlbmd0aCA9PT0gMCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IFBPUE9WRVJfSE9TVF9BTkNIT1IgPSBuZXcgSW5qZWN0aW9uVG9rZW48RWxlbWVudFJlZj4oJ1BPUE9WRVJfSE9TVF9BTkNIT1InKTtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElmT3BlblNlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy9jb25kaXRpb25hbC9pZi1vcGVuLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY2xyU2lnbnBvc3RUcmlnZ2VyXScsIGhvc3Q6IHsgY2xhc3M6ICdzaWducG9zdC10cmlnZ2VyJyB9IH0pXG5cbi8qKioqKioqKipcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgRGlyZWN0aXZlIGFkZGVkIHRvIHRoZSBDbHJTaWducG9zdCBUcmlnZ2VyIGJ1dHRvbiB0aGF0IHdpbGwgY2FsbCB0aGUgQ2xyU2lnbnBvc3QudG9nZ2xlKCkgZnVuY3Rpb24gdG8gaGlkZS9zaG93IHRoZVxuICogQ2xyU2lnbnBvc3RDb250ZW50LlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENsclNpZ25wb3N0VHJpZ2dlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlmT3BlblNlcnZpY2U6IElmT3BlblNlcnZpY2UsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW5DaGFuZ2Uuc3Vic2NyaWJlKChpc09wZW46IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnYWN0aXZlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhY3RpdmUnKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICAvKioqKioqKioqKlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogY2xpY2sgaGFuZGxlciBmb3IgdGhlIENsclNpZ25wb3N0IHRyaWdnZXIgYnV0dG9uIHVzZWQgdG8gaGlkZS9zaG93IENsclNpZ25wb3N0Q29udGVudC5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25TaWducG9zdFRyaWdnZXJDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmlmT3BlblNlcnZpY2UudG9nZ2xlV2l0aEV2ZW50KGV2ZW50KTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSWZPcGVuU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmRpdGlvbmFsL2lmLW9wZW4uc2VydmljZSc7XG5pbXBvcnQgeyBQT1BPVkVSX0hPU1RfQU5DSE9SIH0gZnJvbSAnLi4vY29tbW9uL3BvcG92ZXItaG9zdC1hbmNob3IudG9rZW4nO1xuXG5pbXBvcnQgeyBDbHJTaWducG9zdFRyaWdnZXIgfSBmcm9tICcuL3NpZ25wb3N0LXRyaWdnZXInO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXNpZ25wb3N0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF1c2VDdXN0b21UcmlnZ2VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzaWducG9zdC1hY3Rpb24gYnRuIGJ0bi1zbWFsbCBidG4tbGlua1wiXG4gICAgICAgICAgICAgICAgY2xyU2lnbnBvc3RUcmlnZ2VyPlxuICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImluZm9cIiBbYXR0ci50aXRsZV09XCJjb21tb25TdHJpbmdzLmluZm9cIj48L2Nsci1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICBcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIGhvc3Q6IHsgJ1tjbGFzcy5zaWducG9zdF0nOiAndHJ1ZScgfSxcbiAgcHJvdmlkZXJzOiBbSWZPcGVuU2VydmljZSwgeyBwcm92aWRlOiBQT1BPVkVSX0hPU1RfQU5DSE9SLCB1c2VFeGlzdGluZzogRWxlbWVudFJlZiB9XSxcbn0pXG5cbi8qKioqKioqKipcbiAqXG4gKiBAY2xhc3MgQ2xyU2lnbnBvc3RcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENsYXNzIHVzZWQgdG8gY29uZmlndXJlIGFuZCBjb250cm9sIHRoZSBzdGF0ZSBvZiBhIENsclNpZ25wb3N0IGFuZCBpdHMgYXNzb2NpYXRlZCBDbHJTaWducG9zdENvbnRlbnQuXG4gKiBJdCBzdXBwb3J0cyB0aGUgY2xyUG9zaXRpb24gd2l0aCBhICdyaWdodC1taWRkbGUnIGRlZmF1bHQuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ2xyU2lnbnBvc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5ncykge31cblxuICAvKioqKioqKioqKlxuICAgKiBAcHJvcGVydHkgdXNlQ3VzdG9tVHJpZ2dlclxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRmxhZyB1c2VkIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHVzZSB0aGUgZGVmYXVsdCB0cmlnZ2VyIG9yIGEgdXNlciBzdXBwbGllZCB0cmlnZ2VyIGVsZW1lbnQuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgdXNlQ3VzdG9tVHJpZ2dlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKioqKioqKioqXG4gICAqIEBwcm9wZXJ0eSBzaWduUG9zdFRyaWdnZXJcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFVzZXMgQ29udGVudENoaWxkIHRvIGNoZWNrIGZvciBhIHVzZXIgc3VwcGxpZWQgZWxlbWVudCB3aXRoIHRoZSBDbHJTaWducG9zdFRyaWdnZXIgb24gaXQuXG4gICAqXG4gICAqL1xuICBAQ29udGVudENoaWxkKENsclNpZ25wb3N0VHJpZ2dlcilcbiAgc2V0IGN1c3RvbVRyaWdnZXIodHJpZ2dlcjogQ2xyU2lnbnBvc3RUcmlnZ2VyKSB7XG4gICAgdGhpcy51c2VDdXN0b21UcmlnZ2VyID0gISF0cmlnZ2VyO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWwgfSBmcm9tICcuLi9kYXRhZ3JpZC1oaWRlYWJsZS1jb2x1bW4ubW9kZWwnO1xuXG4vKipcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFuIEBJbmplY3RhYmxlIHByb3ZpZGVyIGNsYXNzIHRoYXQgZW5hYmxlc1xuICpcbiAqIDEuIE1hbmFnaW5nLCB0cmFjayBoaWRlYWJpbGl0eSBvZiBEYXRhZ3JpZENvbHVtbnNcbiAqXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIaWRlYWJsZUNvbHVtblNlcnZpY2Uge1xuICAvKioqKioqKioqKlxuICAgKiBAcHJvcGVydHkgZGdIaWRkZW5Db2x1bW5NYXBcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGFycmF5IG9mIERhdGFncmlkSGlkZWFibGVDb2x1bW4uXG4gICAqIE5PVEU6IGJlY2F1c2Ugd2UgY2FuIGhhdmUgY29sdW1ucyB3L28gdGhlICpjbHJEZ0hpZGVhYmxlQ29sdW1uIGRpcmVjdGl2ZVxuICAgKiB0aGlzIGFycmF5IHdpbGwgaGF2ZSBlbXB0eSBzcGFjZXMgYS5rLmEgbnVsbHMuIFRoaXMgaXMgbmVlZGVkIHRvIGJlIGFibGUgdG8gbWFwXG4gICAqIERhdGFncmlkQ2VsbHMgdG8gRGF0YWdyaWRDb2x1bW5zIGluIHRoZSBSb3dSZW5kZXJlci5cbiAgICpcbiAgICovXG4gIHByaXZhdGUgX2NvbHVtbkxpc3Q6IERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbFtdID0gW107XG5cbiAgLyoqKioqKioqKipcbiAgICpcbiAgICogQHByb3BlcnR5IGRnSGlkZGVuQ29sdW1uTWFwQ2hhbmdlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGJlaGF2aW9yIHN1YmplY3QgdGhhdCBjYW4gYnJvYWRjYXN0IHVwZGF0ZXMgdG8gdGhlIGNvbHVtbiBsaXN0LlxuICAgKiBOT1RFOiBJIGFtIHVzaW5nIEJlaGF2aW9yU3ViamVjdCBiZWNhdXNlIDxjbHItZGctY29sdW1uLXRvZ2dsZT4gaXMgbm90IGdldHRpbmcgdGhlIGxhdGVzdCBfY29sdW1uTGlzdENoYW5nZVxuICAgKiBvbiBwYWdlIGxvYWQuXG4gICAqXG4gICAqL1xuICBwcml2YXRlIF9jb2x1bW5MaXN0Q2hhbmdlOiBCZWhhdmlvclN1YmplY3Q8RGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWxbXVxuICA+KHRoaXMuX2NvbHVtbkxpc3QpO1xuXG4gIC8qKioqKioqKioqXG4gICAqXG4gICAqIEBwcm9wZXJ0eSBjYW5IaWRlTmV4dENvbHVtblxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VydmljZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSBjbHItZGctY29sdW1uLXRvZ2dsZSBjb21wb25lbnQuIFVzZSB0aGlzIGlmIHlvdSBuZWVkIHRvIGFzayBpZiB5b3UgY2FuIGhpZGVcbiAgICogYSBjb2x1bW4uIEl0IGFjdHMgYXMgYSBndWFyZCBhZ2FpbnN0IGhpZGluZyBhbGwgdGhlIGNvbHVtbnMgbWFraW5nIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBkaXNwbGF5ZWQuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbkhpZGVOZXh0Q29sdW1uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSB0aGlzLl9jb2x1bW5MaXN0LmZpbHRlcihjb2x1bW4gPT4gY29sdW1uICE9PSB1bmRlZmluZWQpLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmhpZGRlbik7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbkxpc3QubGVuZ3RoIC0gaGlkZGVuQ29sdW1ucy5sZW5ndGggPiAxO1xuICB9XG5cbiAgLyoqKioqKioqKipcbiAgICpcbiAgICogQHByb3BlcnR5IGNoZWNrRm9yQWxsQ29sdW1uc1Zpc2libGVcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEZvciB3aGVuIHlvdSBuZWVkIHRvIGtub3cgaWYgdGhlIGRhdGFncmlkJ3MgY29sdW1ucyBhcmUgYWxsIHNob3dpbmcuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoZWNrRm9yQWxsQ29sdW1uc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9jb2x1bW5MaXN0LnNvbWUoY29sdW1uID0+IGNvbHVtbiAmJiBjb2x1bW4uaGlkZGVuKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKlxuICAgKiBAcHJvcGVydHkgY29sdW1uTGlzdENoYW5nZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBwdWJsaWMgcHJvcGVydHkgdGhhdCBlbmFibGVzIHN1YnNjcmliZXJzIHRvIGhlYXIgdXBkYXRlcyB0byB0aGUgY29sdW1uIG1hcC5cbiAgICogVXNlIHRoaXMgaWYgeW91IG5lZWQgdG8gZG8gc29tZXRoaW5nIHdoZW5ldmVyIHRoZSBEYXRhZ3JpZCdzIGNvbHVtbiBsaXN0IGlzIGNoYW5nZWQgKGkuZSAqbmdJZiBvbiBhIGNvbHVtbikuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbkxpc3RDaGFuZ2UoKTogT2JzZXJ2YWJsZTxEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWxbXT4ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5MaXN0Q2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFB1YmxpYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjb2x1bW5zLiBJIG5lZWRlZCBhbiBhcnJheSBvZiB0byBpdGVyYXRlIG9uIGluIHRoZSBSb3dSZW5kZXJlclxuICAgKiBidXQgc3Vic2NyaWJpbmcgdG8gdGhlIF9jb2x1bW5MaXN0Q2hhbmdlIGNoYW5nZXMgZGlkIG5vdCBzZWVtIGxpa2UgdGhlIGNvcnJlY3Qgd2F5IHRvIGdldCBpdC5cbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5zKCk6IERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uTGlzdDtcbiAgfVxuXG4gIC8qKioqKioqKioqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGN1cnJlbnQgX2NvbHVtbkxpc3Q6XG4gICAqIC0gaWYgaXQgaGFzIGEgRGF0YWdyaWRIaWRlYWJsZUNvbHVtbiBhbmQgaXMgaGlkZGVuIHRoZW4gc2hvdyBpdC5cbiAgICogLSBpZiBpdCdzIERhdGFncmlkSGlkZWFibGVDb2x1bW4gd2FzIHByZXZpb3VzbHkgdGhlIGxhc3QgY29sdW1uIHZpc2libGUsIHR1cm4gdGhhdCBmbGFnIG9mZi5cbiAgICpcbiAgICovXG4gIHB1YmxpYyBzaG93SGlkZGVuQ29sdW1ucygpIHtcbiAgICB0aGlzLl9jb2x1bW5MaXN0LmZvckVhY2goY29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmhpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICBjb2x1bW4uaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxhc3RWaXNpYmxlQ29sdW1uKSB7XG4gICAgICAgIGNvbHVtbi5sYXN0VmlzaWJsZUNvbHVtbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5zOiBEYXRhZ3JpZENvbHVtbltdXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIERhdGFncmlkSGlkZWFibGVDb2x1bW4ncyB8fCBudWxsIGJhc2VkIGNvbHVtbiBhcnJheSBwYXNzZWQgYXMgcGFyYW0uXG4gICAqIElzIGRlcGVuZGVudCBvbiB0aGUgb3JkZXIgaW4gQENvbnRlbnRDaGlsZHJlbiBpbiBEYXRhZ3JpZC5cbiAgICpcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW5MaXN0KGNvbHVtbnM6IERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbFtdKSB7XG4gICAgdGhpcy5fY29sdW1uTGlzdCA9IGNvbHVtbnM7IC8vIGNsZWFyIHRoZSBsaXN0XG4gICAgdGhpcy51cGRhdGVGb3JMYXN0VmlzaWJsZUNvbHVtbigpOyAvLyBVcGRhdGUgb3VyIHZpc2liaWxpdHkgc3RhdGUgZm9yIFVJXG4gICAgdGhpcy5fY29sdW1uTGlzdENoYW5nZS5uZXh0KHRoaXMuX2NvbHVtbkxpc3QpOyAvLyBCcm9hZGNhc3QgaXRcbiAgfVxuXG4gIC8qKioqKioqKioqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHZpc2libGUgY291bnQgZm9yIGFsbCBjb2x1bW5zLlxuICAgKiBXaGVuIGl0IGlzIGdyZWF0ZXIgdGhhbiAxIGl0IG1hcmtzIGV2ZXJ5dGhpbmcgYXMgZmFsc2UgZm9yIHRoZSBsYXN0VmlzaWJsZUNvbHVtbi5cbiAgICogV2hlbiB2aXNpYmxlIGNvdW50IGlzIG5vdCA+IDEgKGkuZSkgMS4gLCBpdCBmaW5kcyB0aGUgb25seSBjb2x1bW4gdGhhdCBpcyBub3QgaGlkZGVuIGFuZCBtYXJrcyBpdCBhcyB0aGVcbiAgICogbGFzdFZpc2libGVDb2x1bW4uXG4gICAqXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlRm9yTGFzdFZpc2libGVDb2x1bW4oKTogdm9pZCB7XG4gICAgLy8gVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb2x1bW4gc2hvd2luZywgbWFrZSBzdXJlIG5vdGhpbmcgaXMgbWFya2VkIGxhc3RWaXNpYmxlQ29sdW1uXG4gICAgaWYgKHRoaXMuY2FuSGlkZU5leHRDb2x1bW4pIHtcbiAgICAgIHRoaXMuX2NvbHVtbkxpc3QubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxhc3RWaXNpYmxlQ29sdW1uKSB7XG4gICAgICAgICAgY29sdW1uLmxhc3RWaXNpYmxlQ29sdW1uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgdmlzaWJsZUNvdW50IGlzIGRvd24gdG8gb25seSBvbmUgY29sdW1uIHNob3dpbmcuIEZpbmQgaXQgYW5kIGZsYWcgaXQgYXMgdGhlIGxhc3RWaXNpYmxlQ29sdW1uXG4gICAgICB0aGlzLl9jb2x1bW5MaXN0Lm1hcChjb2x1bW4gPT4ge1xuICAgICAgICBpZiAoY29sdW1uICYmICFjb2x1bW4uaGlkZGVuKSB7XG4gICAgICAgICAgY29sdW1uLmxhc3RWaXNpYmxlQ29sdW1uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybiBhIEhpZGVhYmxlQ29sdW1uIGluIHRoaXMuX2NvbHVtbkxpc3QgZm9yIHRoZSBnaXZlbiBpZC5cbiAgICpcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5CeUlkKGlkOiBzdHJpbmcpOiB1bmRlZmluZWQgfCBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWwge1xuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkxpc3QuZmluZChjb2x1bW4gPT4gY29sdW1uICYmIGNvbHVtbi5pZCA9PT0gaWQpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRW1iZWRkZWRWaWV3UmVmLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZy13cmFwcGVkLWNlbGwnLFxuICB0ZW1wbGF0ZTogYCAgICAgICAgXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbFBvcnRhbD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgLFxufSlcbmV4cG9ydCBjbGFzcyBXcmFwcGVkQ2VsbCBpbXBsZW1lbnRzIER5bmFtaWNXcmFwcGVyLCBBZnRlclZpZXdJbml0IHtcbiAgX2R5bmFtaWMgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnY2VsbFBvcnRhbCcpIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgY2VsbFZpZXc6IEVtYmVkZGVkVmlld1JlZjx2b2lkPjsgLy8gdGhlIGNlbGxzIHByb2plY3RlZCB2aWV3XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2VsbFZpZXcgPSB0aGlzLnRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENsclNpZ25wb3N0IH0gZnJvbSAnLi4vLi4vcG9wb3Zlci9zaWducG9zdC9zaWducG9zdCc7XG5pbXBvcnQgeyBIb3N0V3JhcHBlciB9IGZyb20gJy4uLy4uL3V0aWxzL2hvc3Qtd3JhcHBpbmcvaG9zdC13cmFwcGVyJztcblxuaW1wb3J0IHsgSGlkZWFibGVDb2x1bW5TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvaGlkZWFibGUtY29sdW1uLnNlcnZpY2UnO1xuaW1wb3J0IHsgV3JhcHBlZENlbGwgfSBmcm9tICcuL3dyYXBwZWQtY2VsbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1jZWxsJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmRhdGFncmlkLWNlbGxdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuZGF0YWdyaWQtc2lnbnBvc3QtdHJpZ2dlcl0nOiAnc2lnbnBvc3QubGVuZ3RoID4gMCcsXG4gICAgcm9sZTogJ2NlbGwnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRhZ3JpZENlbGwgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKioqKioqKipcbiAgICogQHByb3BlcnR5IHNpZ25wb3N0XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBAQ29udGVudENoaWxkIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBhIFNpZ25wb3N0IGluIHRoZSBwcm9qZWN0ZWQgY29udGVudC5cbiAgICogT24gdGhlIGhvc3QsIHdlIHNldCB0aGUgLmRhdGFncmlkLXNpZ25wb3N0LXRyaWdnZXIgY2xhc3Mgb24gdGhlIGNlbGwgd2hlbiBzaWducG9zdC5sZW5ndGggaXMgZ3JlYXRlciB0aGFuIDAuXG4gICAqXG4gICAqL1xuICBAQ29udGVudENoaWxkcmVuKENsclNpZ25wb3N0KSBzaWducG9zdDogUXVlcnlMaXN0PENsclNpZ25wb3N0PjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IGlkXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBpZGVudGlmaWVyIGZvciBhbiBpbnN0YW5jZSBvZiB0aGlzIGNlbGwgdGhhdCBtYXBzIGl0IHRvIGEgc3BlY2lmaWMgY29sdW1uXG4gICAqXG4gICAqL1xuICBwcml2YXRlIF9pZDogc3RyaW5nO1xuXG4gIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgICB0aGlzLm1hcEhpZGVhYmxlQ29sdW1uKHRoaXMuX2lkKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZGVuU3RhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaGlkZWFibGVDb2x1bW5TZXJ2aWNlOiBIaWRlYWJsZUNvbHVtblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHZjcjogVmlld0NvbnRhaW5lclJlZlxuICApIHt9XG5cbiAgcHJpdmF0ZSBtYXBIaWRlYWJsZUNvbHVtbihjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgaWYgKCFjb2x1bW5JZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGVhYmxlQ29sdW1uID0gdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uQnlJZCh0aGlzLl9pZCk7XG5cbiAgICB0aGlzLnNldEhpZGRlbkNsYXNzKGhpZGVhYmxlQ29sdW1uLmhpZGRlbik7XG4gICAgdGhpcy5oaWRkZW5TdGF0ZVN1YnNjcmlwdGlvbiA9IGhpZGVhYmxlQ29sdW1uLmhpZGRlbkNoYW5nZVN0YXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldEhpZGRlbkNsYXNzKGhpZGVhYmxlQ29sdW1uLmhpZGRlbik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEhpZGRlbkNsYXNzKGhpZGVhYmxlQ29sdW1uVmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAoaGlkZWFibGVDb2x1bW5WYWx1ZSkge1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWwubmF0aXZlRWxlbWVudCwgJ2RhdGFncmlkLWNlbGwtLWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9lbC5uYXRpdmVFbGVtZW50LCAnZGF0YWdyaWQtY2VsbC0taGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3cmFwcGVkSW5qZWN0b3I6IEluamVjdG9yO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud3JhcHBlZEluamVjdG9yID0gbmV3IEhvc3RXcmFwcGVyKFdyYXBwZWRDZWxsLCB0aGlzLnZjcik7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5oaWRkZW5TdGF0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5oaWRkZW5TdGF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgX3ZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZEluamVjdG9yLmdldChXcmFwcGVkQ2VsbCwgdGhpcy52Y3IpLmNlbGxWaWV3O1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmV4cG9ydCBlbnVtIERhdGFncmlkRGlzcGxheU1vZGUge1xuICBESVNQTEFZLFxuICBDQUxDVUxBVEUsXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmV4cG9ydCBlbnVtIERhdGFncmlkUmVuZGVyU3RlcCB7XG4gIEFMSUdOX0NPTFVNTlMsXG4gIENBTENVTEFURV9NT0RFX09OLFxuICBDQUxDVUxBVEVfTU9ERV9PRkYsXG4gIENMRUFSX1dJRFRIUywgLy8gTm90ZSB0aGlzIGlzIGxpc3RlbmVkIHRvIGJ5IGJvdGggY2VsbHMgYW5kIGNvbHVtbnNcbiAgQ09NUFVURV9DT0xVTU5fV0lEVEhTLFxuICBERVRFQ1RfU1RSSUNUX1dJRFRIUyxcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEYXRhZ3JpZFJlbmRlclN0ZXAgfSBmcm9tICcuLi9lbnVtcy9yZW5kZXItc3RlcC5lbnVtJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGFncmlkUmVuZGVyT3JnYW5pemVyIHtcbiAgcHJvdGVjdGVkIF9yZW5kZXJTdGVwOiBTdWJqZWN0PERhdGFncmlkUmVuZGVyU3RlcD4gPSBuZXcgU3ViamVjdDxEYXRhZ3JpZFJlbmRlclN0ZXA+KCk7XG4gIHB1YmxpYyBnZXQgcmVuZGVyU3RlcCgpOiBPYnNlcnZhYmxlPERhdGFncmlkUmVuZGVyU3RlcD4ge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJTdGVwLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlclJlbmRlclN0ZXBzKHN0ZXA6IERhdGFncmlkUmVuZGVyU3RlcCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlclN0ZXAucGlwZShmaWx0ZXIodGVzdFN0ZXAgPT4gc3RlcCA9PT0gdGVzdFN0ZXApKTtcbiAgfVxuXG4gIHByaXZhdGUgYWxyZWFkeVNpemVkID0gZmFsc2U7XG5cbiAgcHVibGljIHdpZHRoczogeyBweDogbnVtYmVyOyBzdHJpY3Q6IGJvb2xlYW4gfVtdID0gW107XG5cbiAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICB0aGlzLndpZHRocy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3JlbmRlclN0ZXAubmV4dChEYXRhZ3JpZFJlbmRlclN0ZXAuQ0FMQ1VMQVRFX01PREVfT04pO1xuICAgIGlmICh0aGlzLmFscmVhZHlTaXplZCkge1xuICAgICAgdGhpcy5fcmVuZGVyU3RlcC5uZXh0KERhdGFncmlkUmVuZGVyU3RlcC5DTEVBUl9XSURUSFMpO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJTdGVwLm5leHQoRGF0YWdyaWRSZW5kZXJTdGVwLkRFVEVDVF9TVFJJQ1RfV0lEVEhTKTtcbiAgICB0aGlzLl9yZW5kZXJTdGVwLm5leHQoRGF0YWdyaWRSZW5kZXJTdGVwLkNPTVBVVEVfQ09MVU1OX1dJRFRIUyk7XG4gICAgdGhpcy5fcmVuZGVyU3RlcC5uZXh0KERhdGFncmlkUmVuZGVyU3RlcC5BTElHTl9DT0xVTU5TKTtcbiAgICB0aGlzLmFscmVhZHlTaXplZCA9IHRydWU7XG4gICAgdGhpcy5fcmVuZGVyU3RlcC5uZXh0KERhdGFncmlkUmVuZGVyU3RlcC5DQUxDVUxBVEVfTU9ERV9PRkYpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRGF0YWdyaWREaXNwbGF5TW9kZSB9IGZyb20gJy4uL2VudW1zL2Rpc3BsYXktbW9kZS5lbnVtJztcbmltcG9ydCB7IERhdGFncmlkUmVuZGVyU3RlcCB9IGZyb20gJy4uL2VudW1zL3JlbmRlci1zdGVwLmVudW0nO1xuaW1wb3J0IHsgRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIgfSBmcm9tICcuLi9yZW5kZXIvcmVuZGVyLW9yZ2FuaXplcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEaXNwbGF5TW9kZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByb3RlY3RlZCBfdmlldzogQmVoYXZpb3JTdWJqZWN0PERhdGFncmlkRGlzcGxheU1vZGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhZ3JpZERpc3BsYXlNb2RlPihcbiAgICBEYXRhZ3JpZERpc3BsYXlNb2RlLkRJU1BMQVlcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihyZW5kZXJPcmdhbml6ZXI6IERhdGFncmlkUmVuZGVyT3JnYW5pemVyKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICByZW5kZXJPcmdhbml6ZXJcbiAgICAgICAgLmZpbHRlclJlbmRlclN0ZXBzKERhdGFncmlkUmVuZGVyU3RlcC5DQUxDVUxBVEVfTU9ERV9PTilcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl92aWV3Lm5leHQoRGF0YWdyaWREaXNwbGF5TW9kZS5DQUxDVUxBVEUpKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHJlbmRlck9yZ2FuaXplclxuICAgICAgICAuZmlsdGVyUmVuZGVyU3RlcHMoRGF0YWdyaWRSZW5kZXJTdGVwLkNBTENVTEFURV9NT0RFX09GRilcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl92aWV3Lm5leHQoRGF0YWdyaWREaXNwbGF5TW9kZS5ESVNQTEFZKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCB2aWV3KCk6IE9ic2VydmFibGU8RGF0YWdyaWREaXNwbGF5TW9kZT4ge1xuICAgIHJldHVybiB0aGlzLl92aWV3LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHJhY2tCeUZ1bmN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRmlsdGVyc1Byb3ZpZGVyIH0gZnJvbSAnLi9maWx0ZXJzJztcbmltcG9ydCB7IEl0ZW1zIH0gZnJvbSAnLi9pdGVtcyc7XG5cbmxldCBuYlNlbGVjdGlvbjogbnVtYmVyID0gMDtcblxuZXhwb3J0IGVudW0gU2VsZWN0aW9uVHlwZSB7XG4gIE5vbmUsXG4gIFNpbmdsZSxcbiAgTXVsdGksXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb248VCA9IGFueT4ge1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBwcmV2U2VsZWN0aW9uUmVmczogVFtdID0gW107IC8vIFJlZnMgb2Ygc2VsZWN0ZWQgaXRlbXNcbiAgcHJpdmF0ZSBwcmV2U2luZ2xlU2VsZWN0aW9uUmVmOiBUOyAvLyBSZWYgb2Ygc2luZ2xlIHNlbGVjdGVkIGl0ZW1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pdGVtczogSXRlbXM8VD4sIHByaXZhdGUgX2ZpbHRlcnM6IEZpbHRlcnNQcm92aWRlcjxUPikge1xuICAgIHRoaXMuaWQgPSAnY2xyLWRnLXNlbGVjdGlvbicgKyBuYlNlbGVjdGlvbisrO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLl9maWx0ZXJzLmNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGFibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLl9pdGVtcy5hbGxDaGFuZ2VzLnN1YnNjcmliZSh1cGRhdGVkSXRlbXMgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0aW9uVHlwZSkge1xuICAgICAgICAgIGNhc2UgU2VsZWN0aW9uVHlwZS5Ob25lOiB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlIFNlbGVjdGlvblR5cGUuU2luZ2xlOiB7XG4gICAgICAgICAgICBsZXQgbmV3U2luZ2xlOiBhbnk7XG4gICAgICAgICAgICBjb25zdCB0cmFja0J5OiBUcmFja0J5RnVuY3Rpb248VD4gPSB0aGlzLl9pdGVtcy50cmFja0J5O1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvblVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnRTaW5nbGUgaGFzIGJlZW4gc2V0IGJlZm9yZSBkYXRhIHdhcyBsb2FkZWQsIHdlIGxvb2sgdXAgYW5kIHNhdmUgdGhlIHJlZiBmcm9tIGN1cnJlbnQgZGF0YSBzZXRcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTaW5nbGUgJiYgIXRoaXMucHJldlNpbmdsZVNlbGVjdGlvblJlZikge1xuICAgICAgICAgICAgICBpZiAodGhpcy5faXRlbXMuYWxsICYmIHRoaXMuX2l0ZW1zLnRyYWNrQnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb29rdXAgPSB0aGlzLl9pdGVtcy5hbGwuZmluZEluZGV4KG1heWJlID0+IG1heWJlID09PSB0aGlzLmN1cnJlbnRTaW5nbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJldlNpbmdsZVNlbGVjdGlvblJlZiA9IHRoaXMuX2l0ZW1zLnRyYWNrQnkobG9va3VwLCB0aGlzLmN1cnJlbnRTaW5nbGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVwZGF0ZWRJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZWYgPSB0cmFja0J5KGluZGV4LCBpdGVtKTtcbiAgICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSB1cGRhdGVkIGl0ZW1zIGlzIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkU2luZ2xlLCBzZXQgaXQgYXMgdGhlIG5ldyBvbmVcbiAgICAgICAgICAgICAgaWYgKHRoaXMucHJldlNpbmdsZVNlbGVjdGlvblJlZiA9PT0gcmVmKSB7XG4gICAgICAgICAgICAgICAgbmV3U2luZ2xlID0gaXRlbTtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25VcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHVzaW5nIHNtYXJ0IGRhdGFncmlkcywgd2UgZXhwZWN0IGFsbCBpdGVtcyB0byBiZSBwcmVzZW50IGluIHRoZSB1cGRhdGVkSXRlbXMgYXJyYXkuXG4gICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIHNob3VsZCBkZWxldGUgdGhlIGN1cnJlbnRTaW5nbGUgaWYgaXQgdXNlZCB0byBiZSBkZWZpbmVkIGJ1dCBkb2Vzbid0IGV4aXN0IGFueW1vcmUuXG4gICAgICAgICAgICAvLyBObyBleHBsaWNpdCBcImRlbGV0ZVwiIGlzIHJlcXVpcmVkLCBzaW5jZSBuZXdTaW5nbGUgd291bGQgYmUgdW5kZWZpbmVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAvLyBNYXJraW5nIGl0IGFzIHNlbGVjdGlvblVwZGF0ZWQgaGVyZSB3aWxsIHNldCBjdXJyZW50U2luZ2xlIHRvIHVuZGVmaW5lZCBiZWxvdyBpbiB0aGUgc2V0VGltZW91dC5cbiAgICAgICAgICAgIGlmICh0aGlzLl9pdGVtcy5zbWFydCAmJiAhbmV3U2luZ2xlKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGlvblVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBEaXNjdXNzZWQgdGhpcyB3aXRoIEV1ZGVzIGFuZCB0aGlzIGlzIGZpbmUgZm9yIG5vdy5cbiAgICAgICAgICAgIC8vIEJ1dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgYSBkaWZmZXJlbnQgcGF0dGVybiBmb3IgdGhlXG4gICAgICAgICAgICAvLyBjaGlsZCB0cmlnZ2VyaW5nIHRoZSBwYXJlbnQgY2hhbmdlIGRldGVjdGlvbiBwcm9ibGVtLlxuICAgICAgICAgICAgLy8gVXNpbmcgc2V0VGltZW91dCBmb3Igbm93IHRvIGZpeCB0aGlzLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25VcGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2luZ2xlID0gbmV3U2luZ2xlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgU2VsZWN0aW9uVHlwZS5NdWx0aToge1xuICAgICAgICAgICAgbGV0IGxlZnRPdmVyOiBhbnlbXSA9IHRoaXMuY3VycmVudC5zbGljZSgpO1xuICAgICAgICAgICAgY29uc3QgdHJhY2tCeTogVHJhY2tCeUZ1bmN0aW9uPGFueT4gPSB0aGlzLl9pdGVtcy50cmFja0J5O1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvblVwZGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgaGFzIGJlZW4gc2V0IGJlZm9yZSBkYXRhIHdhcyBsb2FkZWQsIHdlIGxvb2sgdXAgYW5kIHNhdmUgdGhlIHJlZiBmcm9tIGN1cnJlbnQgZGF0YSBzZXRcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQubGVuZ3RoID4gMCAmJiB0aGlzLnByZXZTZWxlY3Rpb25SZWZzLmxlbmd0aCAhPT0gdGhpcy5jdXJyZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5faXRlbXMuYWxsICYmIHRoaXMuX2l0ZW1zLnRyYWNrQnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZTZWxlY3Rpb25SZWZzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb29rdXAgPSB0aGlzLl9pdGVtcy5hbGwuZmluZEluZGV4KG1heWJlID0+IG1heWJlID09PSBpdGVtKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMucHJldlNlbGVjdGlvblJlZnMucHVzaCh0aGlzLl9pdGVtcy50cmFja0J5KGxvb2t1cCwgaXRlbSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIHdvcmsgb24gaHR0cHM6Ly9naXRodWIuY29tL3Ztd2FyZS9jbGFyaXR5L2lzc3Vlcy8yMzQyXG4gICAgICAgICAgICAvLyBjdXJyZW50bHksIHRoZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCB3aGVuIGZpbHRlciBpcyBhcHBsaWVkLCBzbyB0aGUgbG9naWMgaW5zaWRlXG4gICAgICAgICAgICAvLyB0aGUgaWYgc3RhdGVtZW50IGJlbG93IHJlc3VsdHMgaW4gYnJva2VuIGJlaGF2aW9yLlxuICAgICAgICAgICAgaWYgKGxlZnRPdmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdXBkYXRlZEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmID0gdHJhY2tCeShpbmRleCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgLy8gTG9vayBpbiBjdXJyZW50IHNlbGVjdGVkIHJlZnMgYXJyYXkgaWYgaXRlbSBpcyBzZWxlY3RlZCwgYW5kIHVwZGF0ZSBhY3R1YWwgdmFsdWVcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5wcmV2U2VsZWN0aW9uUmVmcy5pbmRleE9mKHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgbGVmdE92ZXJbc2VsZWN0ZWRJbmRleF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSB1bm1hdGNoZWQgaXRlbXMgaWYgd2UncmUgdXNpbmcgc21hcnQgZGF0YWdyaWRzIHdoZXJlIHdlIGV4cGVjdCBhbGwgaXRlbXMgdG8gYmVcbiAgICAgICAgICAgICAgLy8gcHJlc2VudFxuICAgICAgICAgICAgICBpZiAodGhpcy5faXRlbXMuc21hcnQpIHtcbiAgICAgICAgICAgICAgICBsZWZ0T3ZlciA9IGxlZnRPdmVyLmZpbHRlcihzZWxlY3RlZCA9PiB1cGRhdGVkSXRlbXMuaW5kZXhPZihzZWxlY3RlZCkgPiAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudC5sZW5ndGggIT09IGxlZnRPdmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gVE9ETzogRGlzY3Vzc2VkIHRoaXMgd2l0aCBFdWRlcyBhbmQgdGhpcyBpcyBmaW5lIGZvciBub3cuXG4gICAgICAgICAgICAgIC8vIEJ1dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgYSBkaWZmZXJlbnQgcGF0dGVybiBmb3IgdGhlXG4gICAgICAgICAgICAgIC8vIGNoaWxkIHRyaWdnZXJpbmcgdGhlIHBhcmVudCBjaGFuZ2UgZGV0ZWN0aW9uIHByb2JsZW0uXG4gICAgICAgICAgICAgIC8vIFVzaW5nIHNldFRpbWVvdXQgZm9yIG5vdyB0byBmaXggdGhpcy5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IGxlZnRPdmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnQubGVuZ3RoID0gMDtcbiAgICB0aGlzLnByZXZTZWxlY3Rpb25SZWZzID0gW107XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3Rpb25UeXBlOiBTZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZS5Ob25lO1xuICBwdWJsaWMgZ2V0IHNlbGVjdGlvblR5cGUoKTogU2VsZWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvblR5cGU7XG4gIH1cbiAgcHVibGljIHNldCBzZWxlY3Rpb25UeXBlKHZhbHVlOiBTZWxlY3Rpb25UeXBlKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNlbGVjdGlvblR5cGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2VsZWN0aW9uVHlwZSA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gU2VsZWN0aW9uVHlwZS5Ob25lKSB7XG4gICAgICBkZWxldGUgdGhpcy5jdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnQoW10sIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcm93U2VsZWN0aW9uTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZ2V0IF9zZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25UeXBlID09PSBTZWxlY3Rpb25UeXBlLk11bHRpIHx8IHRoaXMuX3NlbGVjdGlvblR5cGUgPT09IFNlbGVjdGlvblR5cGUuU2luZ2xlO1xuICB9XG4gIC8qKlxuICAgKiBJZ25vcmUgaXRlbXMgY2hhbmdlcyBpbiB0aGUgc2FtZSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIHByaXZhdGUgZGVib3VuY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9ucyB0byB0aGUgb3RoZXIgcHJvdmlkZXJzIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBvdXIgc3Vic2NyaXB0aW9ucyB0byBvdGhlciBwcm92aWRlcnNcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHNpbmdsZSBzZWxlY3Rpb24gdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudFNpbmdsZTogVDtcbiAgcHVibGljIGdldCBjdXJyZW50U2luZ2xlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2luZ2xlO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VycmVudFNpbmdsZSh2YWx1ZTogVCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fY3VycmVudFNpbmdsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50U2luZ2xlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2l0ZW1zLmFsbCAmJiB0aGlzLl9pdGVtcy50cmFja0J5ICYmIHZhbHVlKSB7XG4gICAgICBjb25zdCBsb29rdXAgPSB0aGlzLl9pdGVtcy5hbGwuZmluZEluZGV4KG1heWJlID0+IG1heWJlID09PSB2YWx1ZSk7XG4gICAgICB0aGlzLnByZXZTaW5nbGVTZWxlY3Rpb25SZWYgPSB0aGlzLl9pdGVtcy50cmFja0J5KGxvb2t1cCwgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAvLyBJZ25vcmUgaXRlbXMgY2hhbmdlcyBpbiB0aGUgc2FtZSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLlxuICAgIC8vIEBUT0RPIFRoaXMgY2FuIGxpa2VseSBiZSByZW1vdmVkIVxuICAgIHRoaXMuZGVib3VuY2UgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZGVib3VuY2UgPSBmYWxzZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudDogVFtdO1xuICBwdWJsaWMgZ2V0IGN1cnJlbnQoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnQodmFsdWU6IFRbXSkge1xuICAgIHRoaXMudXBkYXRlQ3VycmVudCh2YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ3VycmVudCh2YWx1ZTogVFtdLCBlbWl0OiBib29sZWFuKSB7XG4gICAgdGhpcy5fY3VycmVudCA9IHZhbHVlO1xuICAgIGlmIChlbWl0KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgIC8vIElnbm9yZSBpdGVtcyBjaGFuZ2VzIGluIHRoZSBzYW1lIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuXG4gICAgICAvLyBAVE9ETyBUaGlzIGNhbiBsaWtlbHkgYmUgcmVtb3ZlZCFcbiAgICAgIHRoaXMuZGVib3VuY2UgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5kZWJvdW5jZSA9IGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNlcnZhYmxlIHRoYXQgbGV0cyBvdGhlciBjbGFzc2VzIHN1YnNjcmliZSB0byBzZWxlY3Rpb24gY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBfY2hhbmdlID0gbmV3IFN1YmplY3Q8VFtdIHwgVD4oKTtcbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKCkge1xuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25UeXBlID09PSBTZWxlY3Rpb25UeXBlLlNpbmdsZSkge1xuICAgICAgdGhpcy5fY2hhbmdlLm5leHQodGhpcy5jdXJyZW50U2luZ2xlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdGlvblR5cGUgPT09IFNlbGVjdGlvblR5cGUuTXVsdGkpIHtcbiAgICAgIHRoaXMuX2NoYW5nZS5uZXh0KHRoaXMuY3VycmVudCk7XG4gICAgfVxuICB9XG4gIC8vIFdlIGRvIG5vdCB3YW50IHRvIGV4cG9zZSB0aGUgU3ViamVjdCBpdHNlbGYsIGJ1dCB0aGUgT2JzZXJ2YWJsZSB3aGljaCBpcyByZWFkLW9ubHlcbiAgcHVibGljIGdldCBjaGFuZ2UoKTogT2JzZXJ2YWJsZTxUW10gfCBUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW4gaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWRcbiAgICovXG4gIHB1YmxpYyBpc1NlbGVjdGVkKGl0ZW06IFQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uVHlwZSA9PT0gU2VsZWN0aW9uVHlwZS5TaW5nbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTaW5nbGUgPT09IGl0ZW07XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3Rpb25UeXBlID09PSBTZWxlY3Rpb25UeXBlLk11bHRpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmluZGV4T2YoaXRlbSkgPj0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYW4gaXRlbVxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3RJdGVtKGl0ZW06IFQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnQucHVzaChpdGVtKTtcbiAgICBpZiAodGhpcy5faXRlbXMudHJhY2tCeSkge1xuICAgICAgLy8gUHVzaCBzZWxlY3RlZCByZWYgb250byBhcnJheVxuICAgICAgY29uc3QgbG9va3VwID0gdGhpcy5faXRlbXMuYWxsLmZpbmRJbmRleChtYXliZSA9PiBtYXliZSA9PT0gaXRlbSk7XG4gICAgICB0aGlzLnByZXZTZWxlY3Rpb25SZWZzLnB1c2godGhpcy5faXRlbXMudHJhY2tCeShsb29rdXAsIGl0ZW0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3RzIGFuIGl0ZW1cbiAgICovXG4gIHByaXZhdGUgZGVzZWxlY3RJdGVtKGluZGV4T2ZJdGVtOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnQuc3BsaWNlKGluZGV4T2ZJdGVtLCAxKTtcbiAgICBpZiAodGhpcy5faXRlbXMudHJhY2tCeSAmJiBpbmRleE9mSXRlbSA8IHRoaXMucHJldlNlbGVjdGlvblJlZnMubGVuZ3RoKSB7XG4gICAgICAvLyBLZWVwIHNlbGVjdGVkIHJlZnMgYXJyYXkgaW4gc3luY1xuICAgICAgdGhpcy5wcmV2U2VsZWN0aW9uUmVmcy5zcGxpY2UoaW5kZXhPZkl0ZW0sIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIG9yIGRlc2VsZWN0cyBhbiBpdGVtXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZWN0ZWQoaXRlbTogVCwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3NlbGVjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgU2VsZWN0aW9uVHlwZS5Ob25lOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2VsZWN0aW9uVHlwZS5TaW5nbGU6XG4gICAgICAgIC8vIGluIHNpbmdsZSBzZWxlY3Rpb24sIHNldCBjdXJyZW50U2luZ2xlIG1ldGhvZCBzaG91bGQgYmUgdXNlZFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2VsZWN0aW9uVHlwZS5NdWx0aTpcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnQuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIXNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy5kZXNlbGVjdEl0ZW0oaW5kZXgpO1xuICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4IDwgMCAmJiBzZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtKTtcbiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYWxsIGN1cnJlbnRseSBkaXNwbGF5ZWQgaXRlbXMgYXJlIHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uVHlwZSAhPT0gU2VsZWN0aW9uVHlwZS5NdWx0aSB8fCAhdGhpcy5faXRlbXMuZGlzcGxheWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRpc3BsYXllZEl0ZW1zOiBUW10gPSB0aGlzLl9pdGVtcy5kaXNwbGF5ZWQ7XG4gICAgY29uc3QgbmJEaXNwbGF5ZWQgPSB0aGlzLl9pdGVtcy5kaXNwbGF5ZWQubGVuZ3RoO1xuICAgIGlmIChuYkRpc3BsYXllZCA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdGVtcDogVFtdID0gZGlzcGxheWVkSXRlbXMuZmlsdGVyKGl0ZW0gPT4gdGhpcy5jdXJyZW50LmluZGV4T2YoaXRlbSkgPiAtMSk7XG4gICAgcmV0dXJuIHRlbXAubGVuZ3RoID09PSBkaXNwbGF5ZWRJdGVtcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBvciBkZXNlbGVjdHMgYWxsIGN1cnJlbnRseSBkaXNwbGF5ZWQgaXRlbXNcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVBbGwoKSB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvblR5cGUgPT09IFNlbGVjdGlvblR5cGUuTm9uZSB8fCB0aGlzLl9zZWxlY3Rpb25UeXBlID09PSBTZWxlY3Rpb25UeXBlLlNpbmdsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKlxuICAgICAgICAgKiBJZiBldmVyeSBjdXJyZW50bHkgZGlzcGxheWVkIGl0ZW0gaXMgYWxyZWFkeSBzZWxlY3RlZCwgd2UgY2xlYXIgdGhlbS5cbiAgICAgICAgICogSWYgYXQgbGVhc3Qgb25lIGl0ZW0gaXNuJ3Qgc2VsZWN0ZWQsIHdlIHNlbGVjdCBldmVyeSBjdXJyZW50bHkgZGlzcGxheWVkIGl0ZW0uXG4gICAgICAgICAqL1xuICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5faXRlbXMuZGlzcGxheWVkLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gLTEpIHtcbiAgICAgICAgICB0aGlzLmRlc2VsZWN0SXRlbShjdXJyZW50SW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faXRlbXMuZGlzcGxheWVkLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQuaW5kZXhPZihpdGVtKSA8IDApIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbWJlZGRlZFZpZXdSZWYsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRHluYW1pY1dyYXBwZXIgfSBmcm9tICcuLi8uLi91dGlscy9ob3N0LXdyYXBwaW5nL2R5bmFtaWMtd3JhcHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RnLXdyYXBwZWQtcm93JyxcbiAgdGVtcGxhdGU6IGAgICAgICAgIFxuICAgICAgICA8bmctdGVtcGxhdGUgI3Jvd1BvcnRhbD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgLFxufSlcbmV4cG9ydCBjbGFzcyBXcmFwcGVkUm93IGltcGxlbWVudHMgRHluYW1pY1dyYXBwZXIsIEFmdGVyVmlld0luaXQge1xuICBfZHluYW1pYyA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3Jvd1BvcnRhbCcpIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgcm93VmlldzogRW1iZWRkZWRWaWV3UmVmPHZvaWQ+OyAvLyB0aGUgcm93cyBwcm9qZWN0ZWQgdmlldyAoaW4gbWVtb3J5KVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBDcmVhdGUgdGhlIGNlbGxzIHZpZXcgaW4gbWVtb3J5LCBub3QgdGhlIERPTS5cbiAgICB0aGlzLnJvd1ZpZXcgPSB0aGlzLnRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRXhwYW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXhwYW5kL3Byb3ZpZGVycy9leHBhbmQnO1xuaW1wb3J0IHsgSG9zdFdyYXBwZXIgfSBmcm9tICcuLi8uLi91dGlscy9ob3N0LXdyYXBwaW5nL2hvc3Qtd3JhcHBlcic7XG5pbXBvcnQgeyBMb2FkaW5nTGlzdGVuZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2FkaW5nL2xvYWRpbmctbGlzdGVuZXInO1xuXG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENlbGwgfSBmcm9tICcuL2RhdGFncmlkLWNlbGwnO1xuaW1wb3J0IHsgRGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsIH0gZnJvbSAnLi9kYXRhZ3JpZC1oaWRlYWJsZS1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHsgRGF0YWdyaWREaXNwbGF5TW9kZSB9IGZyb20gJy4vZW51bXMvZGlzcGxheS1tb2RlLmVudW0nO1xuaW1wb3J0IHsgRGlzcGxheU1vZGVTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZGlzcGxheS1tb2RlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd3NDb3VudCB9IGZyb20gJy4vcHJvdmlkZXJzL2dsb2JhbC1leHBhbmRhYmxlLXJvd3MnO1xuaW1wb3J0IHsgSGlkZWFibGVDb2x1bW5TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvaGlkZWFibGUtY29sdW1uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm93QWN0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL3Jvdy1hY3Rpb24tc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb24sIFNlbGVjdGlvblR5cGUgfSBmcm9tICcuL3Byb3ZpZGVycy9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgV3JhcHBlZFJvdyB9IGZyb20gJy4vd3JhcHBlZC1yb3cnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxubGV0IG5iUm93OiBudW1iZXIgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItZGctcm93JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFncmlkLXJvdy5odG1sJyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuZGF0YWdyaWQtcm93XSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmRhdGFncmlkLXNlbGVjdGVkXSc6ICdzZWxlY3RlZCcsXG4gICAgJ1thdHRyLmFyaWEtb3duc10nOiAnaWQnLFxuICAgIHJvbGU6ICdyb3dncm91cCcsXG4gIH0sXG4gIHByb3ZpZGVyczogW0V4cGFuZCwgeyBwcm92aWRlOiBMb2FkaW5nTGlzdGVuZXIsIHVzZUV4aXN0aW5nOiBFeHBhbmQgfV0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGFncmlkUm93PFQgPSBhbnk+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgcmFkaW9JZDogc3RyaW5nO1xuICBwdWJsaWMgY2hlY2tib3hJZDogc3RyaW5nO1xuXG4gIC8qIHJlZmVyZW5jZSB0byB0aGUgZW51bSBzbyB0aGF0IHRlbXBsYXRlIGNhbiBhY2Nlc3MgKi9cbiAgcHVibGljIFNFTEVDVElPTl9UWVBFID0gU2VsZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogTW9kZWwgb2YgdGhlIHJvdywgdG8gdXNlIGZvciBzZWxlY3Rpb25cbiAgICovXG4gIEBJbnB1dCgnY2xyRGdJdGVtJykgaXRlbTogVDtcblxuICBwdWJsaWMgcmVwbGFjZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uPFQ+LFxuICAgIHB1YmxpYyByb3dBY3Rpb25TZXJ2aWNlOiBSb3dBY3Rpb25TZXJ2aWNlLFxuICAgIHB1YmxpYyBnbG9iYWxFeHBhbmRhYmxlOiBFeHBhbmRhYmxlUm93c0NvdW50LFxuICAgIHB1YmxpYyBleHBhbmQ6IEV4cGFuZCxcbiAgICBwdWJsaWMgaGlkZWFibGVDb2x1bW5TZXJ2aWNlOiBIaWRlYWJsZUNvbHVtblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaXNwbGF5TW9kZTogRGlzcGxheU1vZGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzXG4gICkge1xuICAgIG5iUm93Kys7XG4gICAgdGhpcy5pZCA9ICdjbHItZGctcm93JyArIG5iUm93O1xuICAgIHRoaXMucmFkaW9JZCA9ICdjbHItZGctcm93LXJkJyArIG5iUm93O1xuICAgIHRoaXMuY2hlY2tib3hJZCA9ICdjbHItZGctcm93LWNiJyArIG5iUm93O1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuZXhwYW5kLnJlcGxhY2UsIHRoaXMuZXhwYW5kLmV4cGFuZENoYW5nZSkuc3Vic2NyaWJlKFxuICAgICAgICAoW2V4cGFuZFJlcGxhY2VWYWx1ZSwgZXhwYW5kQ2hhbmdlVmFsdWVdKSA9PiB7XG4gICAgICAgICAgaWYgKGV4cGFuZFJlcGxhY2VWYWx1ZSAmJiBleHBhbmRDaGFuZ2VWYWx1ZSkge1xuICAgICAgICAgICAgLy8gcmVwbGFjZWQgYW5kIGV4cGFuZGluZ1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2RhdGFncmlkLXJvdy1yZXBsYWNlZCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBIYW5kbGVzIHRoZXNlIGNhc2VzOiBub3QgcmVwbGFjZWQgYW5kIGNvbGxhcHNpbmcgJiByZXBsYWNlZCBhbmRcbiAgICAgICAgICAgIC8vIGNvbGxhcHNpbmcgYW5kIG5vdCByZXBsYWNlZCBhbmQgZXhwYW5kaW5nLlxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkYXRhZ3JpZC1yb3ctcmVwbGFjZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgcm93IGlzIHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3Rpb25UeXBlID09PSBTZWxlY3Rpb25UeXBlLk5vbmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQodGhpcy5pdGVtKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoJ2NsckRnU2VsZWN0ZWQnKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGlvblR5cGUgPT09IFNlbGVjdGlvblR5cGUuTm9uZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0ZWQodGhpcy5pdGVtLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgnY2xyRGdTZWxlY3RlZENoYW5nZScpIHNlbGVjdGVkQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyB0b2dnbGUoc2VsZWN0ZWQgPSAhdGhpcy5zZWxlY3RlZCkge1xuICAgIGlmIChzZWxlY3RlZCAhPT0gdGhpcy5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZWQuZW1pdChzZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBleHBhbmRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmQuZXhwYW5kZWQ7XG4gIH1cblxuICBASW5wdXQoJ2NsckRnRXhwYW5kZWQnKVxuICBwdWJsaWMgc2V0IGV4cGFuZGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5leHBhbmQuZXhwYW5kZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckRnRXhwYW5kZWRDaGFuZ2UnKSBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyB0b2dnbGVFeHBhbmQoKSB7XG4gICAgaWYgKHRoaXMuZXhwYW5kLmV4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdCh0aGlzLmV4cGFuZGVkKTtcbiAgICB9XG4gIH1cblxuICAvKioqKipcbiAgICogcHJvcGVydHkgZGdDZWxsc1xuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBRdWVyeSBMaXN0IG9mIHRoZSBDbHJEYXRhZ3JpZCBjZWxscyBpbiB0aGlzIHJvdy5cbiAgICpcbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oQ2xyRGF0YWdyaWRDZWxsKSBkZ0NlbGxzOiBRdWVyeUxpc3Q8Q2xyRGF0YWdyaWRDZWxsPjtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoaW5ncyBnZXQgc3RhcnRlZFxuICAgIGNvbnN0IGNvbHVtbnNMaXN0ID0gdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2UuZ2V0Q29sdW1ucygpO1xuICAgIHRoaXMudXBkYXRlQ2VsbHNGb3JDb2x1bW5zKGNvbHVtbnNMaXN0KTtcblxuICAgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSBDZWxscyBsaXN0IGNoYW5nZXMgcGVyIHJvdy1yZW5kZXJlclxuICAgIHRoaXMuZGdDZWxscy5jaGFuZ2VzLnN1YnNjcmliZShjZWxsTGlzdCA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5MaXN0ID0gdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2UuZ2V0Q29sdW1ucygpO1xuICAgICAgaWYgKGNlbGxMaXN0Lmxlbmd0aCA9PT0gY29sdW1uTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDZWxsc0ZvckNvbHVtbnMoY29sdW1uTGlzdCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVc2VkIHRvIHNldCB0aGluZ3MgdXAgdGhlIGZpcnN0IHRpbWUgYnV0IG9ubHkgYWZ0ZXIgYWxsIHRoZSBjb2x1bW5zIGFyZSByZWFkeS5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuaGlkZWFibGVDb2x1bW5TZXJ2aWNlLmNvbHVtbkxpc3RDaGFuZ2Uuc3Vic2NyaWJlKGNvbHVtbkxpc3QgPT4ge1xuICAgICAgICAvLyBQcmV2ZW50cyBjZWxsIHVwZGF0ZXMgd2hlbiBjb2xzIGFuZCBjZWxscyBhcnJheSBhcmUgbm90IGFsaWduZWQgLSBvbmx5IHNlZW1zIHRvIHJ1biBvbiBpbml0IC8gZmlyc3QgdGltZS5cbiAgICAgICAgaWYgKGNvbHVtbkxpc3QubGVuZ3RoID09PSB0aGlzLmRnQ2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVDZWxsc0ZvckNvbHVtbnMoY29sdW1uTGlzdCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuZGlzcGxheU1vZGUudmlldy5zdWJzY3JpYmUodmlld0NoYW5nZSA9PiB7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgdmlldyBjaGFuZ2VzIGFuZCBtb3ZlIGNlbGxzIGFyb3VuZCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZGlzcGxheVR5cGVcbiAgICAgICAgLy8gcmVtb3ZlIGNlbGwgdmlld3MgZnJvbSBkaXNwbGF5IHZpZXdcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3Njcm9sbGFibGVDZWxscy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxhYmxlQ2VsbHMuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVtb3ZlIGNlbGwgdmlld3MgZnJvbSBjYWxjdWxhdGVkIHZpZXdcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX2NhbGN1bGF0ZWRDZWxscy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVkQ2VsbHMuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpZXdDaGFuZ2UgPT09IERhdGFncmlkRGlzcGxheU1vZGUuQ0FMQ1VMQVRFKSB7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5Q2VsbHMgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmRnQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZWRDZWxscy5pbnNlcnQoY2VsbC5fdmlldyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5Q2VsbHMgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZGdDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsYWJsZUNlbGxzLmluc2VydChjZWxsLl92aWV3KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIDEuIE1hcHMgdGhlIG5ldyBjb2x1bW5MaXN0Q2hhbmdlIHRvIHRoZSBkZ0NlbGxzIGxpc3QgYnkgaW5kZXhcbiAgICogMi4gU2V0cyB0aGUgaGlkZGVuIHN0YXRlIG9uIHRoZSBjZWxsXG4gICAqIFRha2UgYSBDb2x1bW4gbGlzdCBhbmQgdXNlIGluZGV4IHRvIGFjY2VzcyB0aGUgY29sdW1ucyBmb3IgaGlkZWFibGUgcHJvcGVydGllcy5cbiAgICpcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDZWxsc0ZvckNvbHVtbnMoY29sdW1uTGlzdDogRGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsW10pIHtcbiAgICAvLyBNYXAgY2VsbHMgdG8gY29sdW1ucyB3aXRoIEFycmF5LmluZGV4XG4gICAgdGhpcy5kZ0NlbGxzLmZvckVhY2goKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gY29sdW1uTGlzdFtpbmRleF07IC8vIEFjY291bnRzIGZvciBudWxsIHNwYWNlLlxuICAgICAgaWYgKGN1cnJlbnRDb2x1bW4pIHtcbiAgICAgICAgY2VsbC5pZCA9IGN1cnJlbnRDb2x1bW4uaWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheUNlbGxzID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnc3RpY2t5Q2VsbHMnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgX3N0aWNreUNlbGxzOiBWaWV3Q29udGFpbmVyUmVmO1xuICBAVmlld0NoaWxkKCdzY3JvbGxhYmxlQ2VsbHMnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgX3Njcm9sbGFibGVDZWxsczogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnY2FsY3VsYXRlZENlbGxzJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIF9jYWxjdWxhdGVkQ2VsbHM6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgcHJpdmF0ZSB3cmFwcGVkSW5qZWN0b3I6IEluamVjdG9yO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud3JhcHBlZEluamVjdG9yID0gbmV3IEhvc3RXcmFwcGVyKFdyYXBwZWRSb3csIHRoaXMudmNyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgX3ZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZEluamVjdG9yLmdldChXcmFwcGVkUm93LCB0aGlzLnZjcikucm93VmlldztcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbHVtblRvZ2dsZUJ1dHRvbnNTZXJ2aWNlIHtcbiAgYnV0dG9uczogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG4gIHNlbGVjdEFsbERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfc2VsZWN0QWxsQnV0dG9uQ2xpY2tlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsQnV0dG9uQ2xpY2tlZCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0QWxsQnV0dG9uQ2xpY2tlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBidXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdEFsbEJ1dHRvbkNsaWNrZWQubmV4dCgpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IERhdGFncmlkUHJvcGVydHlDb21wYXJhdG9yIH0gZnJvbSAnLi4vYnVpbHQtaW4vY29tcGFyYXRvcnMvZGF0YWdyaWQtcHJvcGVydHktY29tcGFyYXRvcic7XG5pbXBvcnQgeyBEYXRhZ3JpZFByb3BlcnR5U3RyaW5nRmlsdGVyIH0gZnJvbSAnLi4vYnVpbHQtaW4vZmlsdGVycy9kYXRhZ3JpZC1wcm9wZXJ0eS1zdHJpbmctZmlsdGVyJztcbmltcG9ydCB7IERhdGFncmlkU3RyaW5nRmlsdGVySW1wbCB9IGZyb20gJy4uL2J1aWx0LWluL2ZpbHRlcnMvZGF0YWdyaWQtc3RyaW5nLWZpbHRlci1pbXBsJztcbmltcG9ydCB7IENsckRhdGFncmlkU3RhdGVJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3N0YXRlLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IEZpbHRlcnNQcm92aWRlciB9IGZyb20gJy4vZmlsdGVycyc7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcbmltcG9ydCB7IFNvcnQgfSBmcm9tICcuL3NvcnQnO1xuaW1wb3J0IHsgU3RhdGVEZWJvdW5jZXIgfSBmcm9tICcuL3N0YXRlLWRlYm91bmNlci5wcm92aWRlcic7XG5cbi8qKlxuICogVGhpcyBwcm92aWRlciBhZ2dyZWdhdGVzIHN0YXRlIGNoYW5nZXMgZnJvbSB0aGUgdmFyaW91cyBwcm92aWRlcnMgb2YgdGhlIERhdGFncmlkXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTdGF0ZVByb3ZpZGVyPFQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmaWx0ZXJzOiBGaWx0ZXJzUHJvdmlkZXI8VD4sXG4gICAgcHJpdmF0ZSBzb3J0OiBTb3J0PFQ+LFxuICAgIHByaXZhdGUgcGFnZTogUGFnZSxcbiAgICBwcml2YXRlIGRlYm91bmNlcjogU3RhdGVEZWJvdW5jZXJcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgT2JzZXJ2YWJsZSB0aGF0IGxldHMgb3RoZXIgY2xhc3NlcyBzdWJzY3JpYmUgdG8gZ2xvYmFsIHN0YXRlIGNoYW5nZXNcbiAgICovXG4gIGNoYW5nZTogT2JzZXJ2YWJsZTxDbHJEYXRhZ3JpZFN0YXRlSW50ZXJmYWNlPFQ+PiA9IHRoaXMuZGVib3VuY2VyLmNoYW5nZS5waXBlKG1hcCgoKSA9PiB0aGlzLnN0YXRlKSk7XG5cbiAgLypcbiAgICAgKiBCeSBtYWtpbmcgdGhpcyBhIGdldHRlciwgd2Ugb3BlbiB0aGUgcG9zc2liaWxpdHkgZm9yIGEgc2V0dGVyIGluIHRoZSBmdXR1cmUuXG4gICAgICogSXQncyBiZWVuIHJlcXVlc3RlZCBhIGNvdXBsZSB0aW1lcy5cbiAgICAgKi9cbiAgZ2V0IHN0YXRlKCk6IENsckRhdGFncmlkU3RhdGVJbnRlcmZhY2U8VD4ge1xuICAgIGNvbnN0IHN0YXRlOiBDbHJEYXRhZ3JpZFN0YXRlSW50ZXJmYWNlPFQ+ID0ge307XG4gICAgaWYgKHRoaXMucGFnZS5zaXplID4gMCkge1xuICAgICAgc3RhdGUucGFnZSA9IHsgZnJvbTogdGhpcy5wYWdlLmZpcnN0SXRlbSwgdG86IHRoaXMucGFnZS5sYXN0SXRlbSwgc2l6ZTogdGhpcy5wYWdlLnNpemUgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydC5jb21wYXJhdG9yKSB7XG4gICAgICBpZiAodGhpcy5zb3J0LmNvbXBhcmF0b3IgaW5zdGFuY2VvZiBEYXRhZ3JpZFByb3BlcnR5Q29tcGFyYXRvcikge1xuICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGRlZmF1bHQgb2JqZWN0IHByb3BlcnR5IGNvbXBhcmF0b3IsXG4gICAgICAgICAgICAgICAgICogd2UgZ2l2ZSB0aGUgcHJvcGVydHkgbmFtZSBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgY29tcGFyYXRvci5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgc3RhdGUuc29ydCA9IHsgYnk6ICg8RGF0YWdyaWRQcm9wZXJ0eUNvbXBhcmF0b3I8VD4+dGhpcy5zb3J0LmNvbXBhcmF0b3IpLnByb3AsIHJldmVyc2U6IHRoaXMuc29ydC5yZXZlcnNlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5zb3J0ID0geyBieTogdGhpcy5zb3J0LmNvbXBhcmF0b3IsIHJldmVyc2U6IHRoaXMuc29ydC5yZXZlcnNlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IHRoaXMuZmlsdGVycy5nZXRBY3RpdmVGaWx0ZXJzKCk7XG4gICAgaWYgKGFjdGl2ZUZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGUuZmlsdGVycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgYWN0aXZlRmlsdGVycykge1xuICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRGF0YWdyaWRTdHJpbmdGaWx0ZXJJbXBsKSB7XG4gICAgICAgICAgY29uc3Qgc3RyaW5nRmlsdGVyID0gZmlsdGVyLmZpbHRlckZuO1xuICAgICAgICAgIGlmIChzdHJpbmdGaWx0ZXIgaW5zdGFuY2VvZiBEYXRhZ3JpZFByb3BlcnR5U3RyaW5nRmlsdGVyKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogU3BlY2lhbCBjYXNlIGFnYWluIGZvciB0aGUgZGVmYXVsdCBvYmplY3QgcHJvcGVydHkgZmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgZ2l2ZSB0aGUgcHJvcGVydHkgbmFtZSBpbnN0ZWFkIG9mIHRoZSBmdWxsIGZpbHRlciBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHN0YXRlLmZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzdHJpbmdGaWx0ZXIucHJvcCxcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEludGVybmFsIGRhdGFncmlkIHNlcnZpY2UgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgY2xyLWRnLXRhYmxlIGVsZW1lbnQgYW5kIGV4cG9zZXMgYSBtZXRob2QgdG8gZ2V0IGhlaWdodC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhYmxlU2l6ZVNlcnZpY2Uge1xuICBwcml2YXRlIF90YWJsZVJlZjogSFRNTEVsZW1lbnQ7XG5cbiAgcHVibGljIGdldCB0YWJsZVJlZigpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlUmVmO1xuICB9XG5cbiAgcHVibGljIHNldCB0YWJsZVJlZihlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX3RhYmxlUmVmID0gZWxlbWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0KSB7fVxuICBwdWJsaWMgc2V0IHRhYmxlKHRhYmxlOiBFbGVtZW50UmVmKSB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgdGFibGUubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy50YWJsZVJlZiA9IHRhYmxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLXRhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlZCB3aGVuIHJlc2l6aW5nIGNvbHVtbnMgdG8gc2hvdyB0aGUgY29sdW1uIGJvcmRlciBiZWluZyBkcmFnZ2VkLlxuICBnZXRDb2x1bW5EcmFnSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnRhYmxlUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnRhYmxlUmVmLmNsaWVudEhlaWdodH1weGA7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENvbHVtbiB9IGZyb20gJy4vZGF0YWdyaWQtY29sdW1uJztcbmltcG9ydCB7IENsckRhdGFncmlkSXRlbXMgfSBmcm9tICcuL2RhdGFncmlkLWl0ZW1zJztcbmltcG9ydCB7IENsckRhdGFncmlkUGxhY2Vob2xkZXIgfSBmcm9tICcuL2RhdGFncmlkLXBsYWNlaG9sZGVyJztcbmltcG9ydCB7IENsckRhdGFncmlkUm93IH0gZnJvbSAnLi9kYXRhZ3JpZC1yb3cnO1xuaW1wb3J0IHsgRGF0YWdyaWREaXNwbGF5TW9kZSB9IGZyb20gJy4vZW51bXMvZGlzcGxheS1tb2RlLmVudW0nO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRTdGF0ZUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uVG9nZ2xlQnV0dG9uc1NlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9jb2x1bW4tdG9nZ2xlLWJ1dHRvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBEaXNwbGF5TW9kZVNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kaXNwbGF5LW1vZGUuc2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJzUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9maWx0ZXJzJztcbmltcG9ydCB7IEV4cGFuZGFibGVSb3dzQ291bnQgfSBmcm9tICcuL3Byb3ZpZGVycy9nbG9iYWwtZXhwYW5kYWJsZS1yb3dzJztcbmltcG9ydCB7IEhpZGVhYmxlQ29sdW1uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2hpZGVhYmxlLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCB7IEl0ZW1zIH0gZnJvbSAnLi9wcm92aWRlcnMvaXRlbXMnO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gJy4vcHJvdmlkZXJzL3BhZ2UnO1xuaW1wb3J0IHsgUm93QWN0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL3Jvdy1hY3Rpb24tc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb24sIFNlbGVjdGlvblR5cGUgfSBmcm9tICcuL3Byb3ZpZGVycy9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gJy4vcHJvdmlkZXJzL3NvcnQnO1xuaW1wb3J0IHsgU3RhdGVEZWJvdW5jZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9zdGF0ZS1kZWJvdW5jZXIucHJvdmlkZXInO1xuaW1wb3J0IHsgU3RhdGVQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL3N0YXRlLnByb3ZpZGVyJztcbmltcG9ydCB7IFRhYmxlU2l6ZVNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy90YWJsZS1zaXplLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIgfSBmcm9tICcuL3JlbmRlci9yZW5kZXItb3JnYW5pemVyJztcbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kYXRhZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhZ3JpZC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgU2VsZWN0aW9uLFxuICAgIFNvcnQsXG4gICAgRmlsdGVyc1Byb3ZpZGVyLFxuICAgIFBhZ2UsXG4gICAgSXRlbXMsXG4gICAgRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIsXG4gICAgUm93QWN0aW9uU2VydmljZSxcbiAgICBFeHBhbmRhYmxlUm93c0NvdW50LFxuICAgIEhpZGVhYmxlQ29sdW1uU2VydmljZSxcbiAgICBTdGF0ZURlYm91bmNlcixcbiAgICBTdGF0ZVByb3ZpZGVyLFxuICAgIENvbHVtblRvZ2dsZUJ1dHRvbnNTZXJ2aWNlLFxuICAgIFRhYmxlU2l6ZVNlcnZpY2UsXG4gICAgRGlzcGxheU1vZGVTZXJ2aWNlLFxuICBdLFxuICBob3N0OiB7ICdbY2xhc3MuZGF0YWdyaWQtaG9zdF0nOiAndHJ1ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRGF0YWdyaWQ8VCA9IGFueT4gaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbHVtblNlcnZpY2U6IEhpZGVhYmxlQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIG9yZ2FuaXplcjogRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIsXG4gICAgcHVibGljIGl0ZW1zOiBJdGVtczxUPixcbiAgICBwdWJsaWMgZXhwYW5kYWJsZVJvd3M6IEV4cGFuZGFibGVSb3dzQ291bnQsXG4gICAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uPFQ+LFxuICAgIHB1YmxpYyByb3dBY3Rpb25TZXJ2aWNlOiBSb3dBY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RhdGVQcm92aWRlcjogU3RhdGVQcm92aWRlcjxUPixcbiAgICBwcml2YXRlIGRpc3BsYXlNb2RlOiBEaXNwbGF5TW9kZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIGNvbW1vblN0cmluZ3M6IENsckNvbW1vblN0cmluZ3NcbiAgKSB7fVxuXG4gIC8qIHJlZmVyZW5jZSB0byB0aGUgZW51bSBzbyB0aGF0IHRlbXBsYXRlIGNhbiBhY2Nlc3MgKi9cbiAgcHVibGljIFNFTEVDVElPTl9UWVBFID0gU2VsZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogRnJlZXplcyB0aGUgZGF0YWdyaWQgd2hpbGUgZGF0YSBpcyBsb2FkaW5nXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubG9hZGluZztcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRGdMb2FkaW5nJylcbiAgcHVibGljIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5pdGVtcy5sb2FkaW5nID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGRhdGEgbmVlZHMgdG8gYmUgcmVmcmVzaGVkLCBiYXNlZCBvbiB1c2VyIGFjdGlvbiBvciBleHRlcm5hbCBvbmVzXG4gICAqL1xuICBAT3V0cHV0KCdjbHJEZ1JlZnJlc2gnKSBwdWJsaWMgcmVmcmVzaCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xyRGF0YWdyaWRTdGF0ZUludGVyZmFjZTxUPj4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlLXRyaWdnZXIgdGhlIGNvbXB1dGF0aW9uIG9mIGRpc3BsYXllZCBpdGVtcyBtYW51YWxseVxuICAgKi9cbiAgcHVibGljIGRhdGFDaGFuZ2VkKCkge1xuICAgIHRoaXMuaXRlbXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdlIGdyYWIgdGhlIHNtYXJ0IGl0ZXJhdG9yIGZyb20gcHJvamVjdGVkIGNvbnRlbnRcbiAgICovXG4gIEBDb250ZW50Q2hpbGQoQ2xyRGF0YWdyaWRJdGVtcykgcHVibGljIGl0ZXJhdG9yOiBDbHJEYXRhZ3JpZEl0ZW1zPFQ+O1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBhbGwgc2VsZWN0ZWQgaXRlbXNcbiAgICovXG4gIEBJbnB1dCgnY2xyRGdTZWxlY3RlZCcpXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogVFtdKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZS5NdWx0aTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0aW9uVHlwZSA9IFNlbGVjdGlvblR5cGUuTm9uZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlQ3VycmVudCh2YWx1ZSwgZmFsc2UpO1xuICB9XG5cbiAgQE91dHB1dCgnY2xyRGdTZWxlY3RlZENoYW5nZScpIHNlbGVjdGVkQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIFNlbGVjdGVkIGl0ZW0gaW4gc2luZ2xlLXNlbGVjdCBtb2RlXG4gICAqL1xuICBASW5wdXQoJ2NsckRnU2luZ2xlU2VsZWN0ZWQnKVxuICBzZXQgc2luZ2xlU2VsZWN0ZWQodmFsdWU6IFQpIHtcbiAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZS5TaW5nbGU7XG4gICAgLy8gdGhlIGNsckRnU2luZ2xlU2VsZWN0ZWQgaXMgdXBkYXRlZCBpbiBvbmUgb2YgdHdvIGNhc2VzOlxuICAgIC8vIDEuIGFuIGV4cGxpY2l0IHZhbHVlIGlzIHBhc3NlZFxuICAgIC8vIDIuIGlzIGJlaW5nIHNldCB0byBudWxsIG9yIHVuZGVmaW5lZCwgd2hlcmUgcHJldmlvdXNseSBpdCBoYWQgYSB2YWx1ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudFNpbmdsZSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb24uY3VycmVudFNpbmdsZSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb24uY3VycmVudFNpbmdsZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgnY2xyRGdTaW5nbGVTZWxlY3RlZENoYW5nZScpIHNpbmdsZVNlbGVjdGVkQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24vRGVzZWxlY3Rpb24gb24gcm93IGNsaWNrIG1vZGVcbiAgICovXG4gIEBJbnB1dCgnY2xyRGdSb3dTZWxlY3Rpb24nKVxuICBzZXQgcm93U2VsZWN0aW9uTW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0aW9uLnJvd1NlbGVjdGlvbk1vZGUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYWxsIGN1cnJlbnRseSBkaXNwbGF5ZWQgaXRlbXMgYXJlIHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbFNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5pc0FsbFNlbGVjdGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cy9kZXNlbGVjdHMgYWxsIGN1cnJlbnRseSBkaXNwbGF5ZWQgaXRlbXNcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0IGFsbFNlbGVjdGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgLypcbiAgICAgICAgICogVGhpcyBpcyBhIHNldHRlciBidXQgd2UgaWdub3JlIHRoZSB2YWx1ZS5cbiAgICAgICAgICogSXQncyBzdHJhbmdlLCBidXQgaXQgbGV0cyB1cyBoYXZlIGFuIGluZGV0ZXJtaW5hdGUgc3RhdGUgd2hlcmUgb25seVxuICAgICAgICAgKiBzb21lIG9mIHRoZSBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gICAgICAgICAqL1xuICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZUFsbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwbGFjZWhvbGRlciBkZXRlY3Rpb25cbiAgICovXG4gIEBDb250ZW50Q2hpbGQoQ2xyRGF0YWdyaWRQbGFjZWhvbGRlcikgcHVibGljIHBsYWNlaG9sZGVyOiBDbHJEYXRhZ3JpZFBsYWNlaG9sZGVyPFQ+O1xuXG4gIC8qKlxuICAgKiBIaWRlYWJsZSBDb2x1bW4gZGF0YSBzb3VyY2UgLyBkZXRlY3Rpb24uXG4gICAqL1xuICBAQ29udGVudENoaWxkcmVuKENsckRhdGFncmlkQ29sdW1uKSBwdWJsaWMgY29sdW1uczogUXVlcnlMaXN0PENsckRhdGFncmlkQ29sdW1uPFQ+PjtcblxuICAvKipcbiAgICogV2hlbiB0aGUgZGF0YWdyaWQgaXMgdXNlci1tYW5hZ2VkIHdpdGhvdXQgdGhlIHNtYXJ0IGl0ZXJhdG9yLCB3ZSBnZXQgdGhlIGl0ZW1zIGRpc3BsYXllZFxuICAgKiBieSBxdWVyeWluZyB0aGUgcHJvamVjdGVkIGNvbnRlbnQuIFRoaXMgaXMgbmVlZGVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG1vZGVscyBjdXJyZW50bHlcbiAgICogZGlzcGxheWVkLCB0eXBpY2FsbHkgZm9yIHNlbGVjdGlvbi5cbiAgICovXG5cbiAgQENvbnRlbnRDaGlsZHJlbihDbHJEYXRhZ3JpZFJvdykgcm93czogUXVlcnlMaXN0PENsckRhdGFncmlkUm93PFQ+PjtcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsYWJsZUNvbHVtbnMnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgc2Nyb2xsYWJsZUNvbHVtbnM6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICghdGhpcy5pdGVtcy5zbWFydCkge1xuICAgICAgdGhpcy5pdGVtcy5hbGwgPSB0aGlzLnJvd3MubWFwKChyb3c6IENsckRhdGFncmlkUm93PFQ+KSA9PiByb3cuaXRlbSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5yb3dzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1zLnNtYXJ0KSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5hbGwgPSB0aGlzLnJvd3MubWFwKChyb3c6IENsckRhdGFncmlkUm93PFQ+KSA9PiByb3cuaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICB0aGlzLl9kaXNwbGF5ZWRSb3dzLmluc2VydChyb3cuX3ZpZXcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY29sdW1ucy5jaGFuZ2VzLnN1YnNjcmliZSgoY29sdW1uczogQ2xyRGF0YWdyaWRDb2x1bW48VD5bXSkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtblNlcnZpY2UudXBkYXRlQ29sdW1uTGlzdCh0aGlzLmNvbHVtbnMubWFwKGNvbCA9PiBjb2wuaGlkZWFibGUpKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEdldCBDb2x1bW5TZXJ2aWNlIHJlYWR5IGZvciBIaWRlYWJsZUNvbHVtbnMuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnVwZGF0ZUNvbHVtbkxpc3QodGhpcy5jb2x1bW5zLm1hcChjb2wgPT4gY29sLmhpZGVhYmxlKSk7XG4gIH1cblxuICAvKipcbiAgICogT3VyIHNldHVwIGhhcHBlbnMgaW4gdGhlIHZpZXcgb2Ygc29tZSBvZiBvdXIgY29tcG9uZW50cywgc28gd2Ugd2FpdCBmb3IgaXQgdG8gYmUgZG9uZSBiZWZvcmUgc3RhcnRpbmdcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgY2FuIGdldCByaWQgb2YgcHJvdmlkZXIgd2lyaW5nIGluIHZpZXcgaW5pdCBzbyB0aGF0IHN1YnNjcmlwdGlvbnMgY2FuIGJlIGRvbmUgZWFybGllclxuICAgIHRoaXMucmVmcmVzaC5lbWl0KHRoaXMuc3RhdGVQcm92aWRlci5zdGF0ZSk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMuc3RhdGVQcm92aWRlci5jaGFuZ2Uuc3Vic2NyaWJlKHN0YXRlID0+IHRoaXMucmVmcmVzaC5lbWl0KHN0YXRlKSkpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNoYW5nZS5zdWJzY3JpYmUocyA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3Rpb25UeXBlID09PSBTZWxlY3Rpb25UeXBlLlNpbmdsZSkge1xuICAgICAgICAgIHRoaXMuc2luZ2xlU2VsZWN0ZWRDaGFuZ2VkLmVtaXQoPFQ+cyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb24uc2VsZWN0aW9uVHlwZSA9PT0gU2VsZWN0aW9uVHlwZS5NdWx0aSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2VkLmVtaXQoPFRbXT5zKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIC8vIEEgc3Vic2NyaXB0aW9uIHRoYXQgbGlzdGVucyBmb3IgZGlzcGxheU1vZGUgY2hhbmdlcyBvbiB0aGUgZGF0YWdyaWRcbiAgICB0aGlzLmRpc3BsYXlNb2RlLnZpZXcuc3Vic2NyaWJlKHZpZXdDaGFuZ2UgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGFueSBwcm9qZWN0ZWQgY29sdW1ucyBmcm9tIHRoZSBwcm9qZWN0ZWREaXNwbGF5Q29sdW1ucyBjb250YWluZXJcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9wcm9qZWN0ZWREaXNwbGF5Q29sdW1ucy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy5fcHJvamVjdGVkRGlzcGxheUNvbHVtbnMuZGV0YWNoKCk7XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgYW55IHByb2plY3RlZCBjb2x1bW5zIGZyb20gdGhlIHByb2plY3RlZENhbGN1bGF0aW9uQ29sdW1ucyBjb250YWluZXJcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9wcm9qZWN0ZWRDYWxjdWxhdGlvbkNvbHVtbnMubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMuX3Byb2plY3RlZENhbGN1bGF0aW9uQ29sdW1ucy5kZXRhY2goKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSBhbnkgcHJvamVjdGVkIHJvd3MgZnJvbSB0aGUgY2FsY3VsYXRpb25Sb3dzIGNvbnRhaW5lclxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX2NhbGN1bGF0aW9uUm93cy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRpb25Sb3dzLmRldGFjaCgpO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIGFueSBwcm9qZWN0ZWQgcm93cyBmcm9tIHRoZSBkaXNwbGF5ZWRSb3dzIGNvbnRhaW5lclxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX2Rpc3BsYXllZFJvd3MubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXllZFJvd3MuZGV0YWNoKCk7XG4gICAgICB9XG4gICAgICBpZiAodmlld0NoYW5nZSA9PT0gRGF0YWdyaWREaXNwbGF5TW9kZS5ESVNQTEFZKSB7XG4gICAgICAgIC8vIFNldCBzdGF0ZSwgc3R5bGUgZm9yIHRoZSBkYXRhZ3JpZCB0byBESVNQTEFZIGFuZCBpbnNlcnQgcm93ICYgY29sdW1ucyBpbnRvIGNvbnRhaW5lcnNcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkYXRhZ3JpZC1jYWxjdWxhdGUtbW9kZScpO1xuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgIHRoaXMuX3Byb2plY3RlZERpc3BsYXlDb2x1bW5zLmluc2VydChjb2x1bW4uX3ZpZXcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICB0aGlzLl9kaXNwbGF5ZWRSb3dzLmluc2VydChyb3cuX3ZpZXcpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNldCBzdGF0ZSwgc3R5bGUgZm9yIHRoZSBkYXRhZ3JpZCB0byBDQUxDVUxBVEUgYW5kIGluc2VydCByb3cgJiBjb2x1bW5zIGludG8gY29udGFpbmVyc1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2RhdGFncmlkLWNhbGN1bGF0ZS1tb2RlJyk7XG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgdGhpcy5fcHJvamVjdGVkQ2FsY3VsYXRpb25Db2x1bW5zLmluc2VydChjb2x1bW4uX3ZpZXcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICB0aGlzLl9jYWxjdWxhdGlvblJvd3MuaW5zZXJ0KHJvdy5fdmlldyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbnMgdG8gYWxsIHRoZSBzZXJ2aWNlcyBhbmQgcXVlcmllcyBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViOiBTdWJzY3JpcHRpb24pID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIHJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9yZ2FuaXplci5yZXNpemUoKTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3Byb2plY3RlZERpc3BsYXlDb2x1bW5zJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIF9wcm9qZWN0ZWREaXNwbGF5Q29sdW1uczogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgncHJvamVjdGVkQ2FsY3VsYXRpb25Db2x1bW5zJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIF9wcm9qZWN0ZWRDYWxjdWxhdGlvbkNvbHVtbnM6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Rpc3BsYXllZFJvd3MnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgX2Rpc3BsYXllZFJvd3M6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NhbGN1bGF0aW9uUm93cycsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBfY2FsY3VsYXRpb25Sb3dzOiBWaWV3Q29udGFpbmVyUmVmO1xufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1hY3Rpb24tYmFyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIGhvc3Q6IHsgJ1tjbGFzcy5kYXRhZ3JpZC1hY3Rpb24tYmFyXSc6ICd0cnVlJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRhZ3JpZEFjdGlvbkJhciB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uLy4uL3BvcG92ZXIvY29tbW9uL3BvcG92ZXInO1xuXG5pbXBvcnQgeyBSb3dBY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvcm93LWFjdGlvbi1zZXJ2aWNlJztcbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1hY3Rpb24tb3ZlcmZsb3cnLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGUoJGV2ZW50KVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRhdGFncmlkLWFjdGlvbi10b2dnbGVcIiAjYW5jaG9yPlxuICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiZWxsaXBzaXMtdmVydGljYWxcIiBbYXR0ci50aXRsZV09XCJjb21tb25TdHJpbmdzLnJvd0FjdGlvbnNcIj48L2Nsci1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFsoY2xyUG9wb3Zlck9sZCldPVwib3BlblwiIFtjbHJQb3BvdmVyT2xkQW5jaG9yXT1cImFuY2hvclwiIFtjbHJQb3BvdmVyT2xkQW5jaG9yUG9pbnRdPVwiYW5jaG9yUG9pbnRcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsclBvcG92ZXJPbGRQb3BvdmVyUG9pbnRdPVwicG9wb3ZlclBvaW50XCI+XG4gICAgICAgICAgICA8ZGl2ICNtZW51IGNsYXNzPVwiZGF0YWdyaWQtYWN0aW9uLW92ZXJmbG93XCIgKGNsck91dHNpZGVDbGljayk9XCJjbG9zZSgkZXZlbnQpXCIgW2NsclN0cmljdF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRGF0YWdyaWRBY3Rpb25PdmVyZmxvdyBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBhbmNob3JQb2ludDogUG9pbnQgPSBQb2ludC5SSUdIVF9DRU5URVI7XG4gIHB1YmxpYyBwb3BvdmVyUG9pbnQ6IFBvaW50ID0gUG9pbnQuTEVGVF9DRU5URVI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3dBY3Rpb25TZXJ2aWNlOiBSb3dBY3Rpb25TZXJ2aWNlLCBwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5ncykge1xuICAgIHRoaXMucm93QWN0aW9uU2VydmljZS5yZWdpc3RlcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yb3dBY3Rpb25TZXJ2aWNlLnVucmVnaXN0ZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3Mgd2hldGhlciB0aGUgYWN0aW9uIG92ZXJmbG93IG1lbnUgaXMgb3BlbiBvciBub3RcbiAgICovXG4gIHByaXZhdGUgX29wZW4gPSBmYWxzZTtcbiAgcHVibGljIGdldCBvcGVuKCkge1xuICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICB9XG5cbiAgQElucHV0KCdjbHJEZ0FjdGlvbk92ZXJmbG93T3BlbicpXG4gIHB1YmxpYyBzZXQgb3BlbihvcGVuOiBib29sZWFuKSB7XG4gICAgY29uc3QgYm9vbE9wZW4gPSAhIW9wZW47XG4gICAgaWYgKGJvb2xPcGVuICE9PSB0aGlzLl9vcGVuKSB7XG4gICAgICB0aGlzLl9vcGVuID0gYm9vbE9wZW47XG4gICAgICB0aGlzLm9wZW5DaGFuZ2VkLmVtaXQoYm9vbE9wZW4pO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckRnQWN0aW9uT3ZlcmZsb3dPcGVuQ2hhbmdlJykgcHVibGljIG9wZW5DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG5cbiAgLypcbiAgICAgKiBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBjbGljayB0aGF0IG9wZW5zIHRoZSBtZW51LCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBjbG9zZSB0aGUgbWVudSBpbnN0YW50bHlcbiAgICAgKiB3aGVuIHRoZSBldmVudCBidWJibGVzIHVwIHRoZSBET00gYWxsIHRoZSB3YXkgdG8gdGhlIGRvY3VtZW50LCB3aGljaCB3ZSBhbHNvIGxpc3RlbiB0by5cbiAgICAgKi9cbiAgcHJpdmF0ZSBvcGVuaW5nRXZlbnQ6IGFueTtcblxuICAvKipcbiAgICogU2hvd3MvaGlkZXMgdGhlIGFjdGlvbiBvdmVyZmxvdyBtZW51XG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9wZW5pbmdFdmVudCA9IGV2ZW50O1xuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvKlxuICAgICAgICAgKiBCZWNhdXNlIHRoaXMgbGlzdGVuZXIgaXMgYWRkZWQgc3luY2hvbm91c2x5LCBiZWZvcmUgdGhlIGV2ZW50IGZpbmlzaGVzIGJ1YmJsaW5nIHVwIHRoZSBET00sXG4gICAgICAgICAqIHdlIGVuZCB1cCBmaXJpbmcgb24gdGhlIHZlcnkgY2xpY2sgdGhhdCBqdXN0IG9wZW5lZCB0aGUgbWVudSwgcFxuICAgICAgICAgKiBvdGVudGlhbGx5IGNsb3NpbmcgaXQgaW1tZWRpYXRlbHkgZXZlcnkgdGltZS4gU28gd2UganVzdCBpZ25vcmUgaXQuXG4gICAgICAgICAqL1xuICAgIGlmIChldmVudCA9PT0gdGhpcy5vcGVuaW5nRXZlbnQpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wZW5pbmdFdmVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb2x1bW5Ub2dnbGVCdXR0b25zU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2NvbHVtbi10b2dnbGUtYnV0dG9ucy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWRnLWNvbHVtbi10b2dnbGUtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpbmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUJ1dHRvbnMuYnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0b2dnbGVCdXR0b25zLnNlbGVjdEFsbERpc2FibGVkXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9idXR0b24+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRGF0YWdyaWRDb2x1bW5Ub2dnbGVCdXR0b24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdG9nZ2xlQnV0dG9uczogQ29sdW1uVG9nZ2xlQnV0dG9uc1NlcnZpY2UpIHt9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWRnLWNvbHVtbi10b2dnbGUtdGl0bGUnLFxuICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRhZ3JpZENvbHVtblRvZ2dsZVRpdGxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi8uLi9wb3BvdmVyL2NvbW1vbi9wb3BvdmVyJztcblxuaW1wb3J0IHsgQ2xyRGF0YWdyaWRDb2x1bW5Ub2dnbGVCdXR0b24gfSBmcm9tICcuL2RhdGFncmlkLWNvbHVtbi10b2dnbGUtYnV0dG9uJztcbmltcG9ydCB7IENsckRhdGFncmlkQ29sdW1uVG9nZ2xlVGl0bGUgfSBmcm9tICcuL2RhdGFncmlkLWNvbHVtbi10b2dnbGUtdGl0bGUnO1xuaW1wb3J0IHsgRGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsIH0gZnJvbSAnLi9kYXRhZ3JpZC1oaWRlYWJsZS1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHsgQ29sdW1uVG9nZ2xlQnV0dG9uc1NlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9jb2x1bW4tdG9nZ2xlLWJ1dHRvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBIaWRlYWJsZUNvbHVtblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9oaWRlYWJsZS1jb2x1bW4uc2VydmljZSc7XG5pbXBvcnQgeyBDbHJDb21tb25TdHJpbmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItZGctY29sdW1uLXRvZ2dsZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAjYW5jaG9yXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVVJKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGluayBjb2x1bW4tdG9nZ2xlLS1hY3Rpb25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cInZpZXctY29sdW1uc1wiIFthdHRyLnRpdGxlXT1cImNvbW1vblN0cmluZ3MucGlja0NvbHVtbnNcIj48L2Nsci1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1zd2l0Y2hcIlxuICAgICAgICAgICAgICpjbHJQb3BvdmVyT2xkPVwib3BlbjsgYW5jaG9yOiBhbmNob3I7IGFuY2hvclBvaW50OiBhbmNob3JQb2ludDsgcG9wb3ZlclBvaW50OiBwb3BvdmVyUG9pbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2l0Y2gtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0aXRsZVwiPlNob3cgQ29sdW1uczwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1kZy1jb2x1bW4tdG9nZ2xlLXRpdGxlXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVVJKClcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImNsb3NlXCIgW2F0dHIudGl0bGVdPVwiY29tbW9uU3RyaW5ncy5jbG9zZVwiPjwvY2xyLWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInN3aXRjaC1jb250ZW50IGxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjbHItY2hlY2tib3gtd3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbHJDaGVja2JveCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmxhc3RWaXNpYmxlQ29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiIWNvbHVtbi5oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVDb2x1bW4oJGV2ZW50LCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi50ZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9jbHItY2hlY2tib3gtd3JhcHBlcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2l0Y2gtZm9vdGVyXCIgKm5nSWY9XCJidXR0b25zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItZGctY29sdW1uLXRvZ2dsZS1idXR0b25cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2l0Y2gtZm9vdGVyXCIgKm5nSWY9XCJidXR0b25zLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpbmsgcDYgdGV4dC11cHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhbGxDb2x1bW5zVmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCI+U2VsZWN0IEFsbFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICBob3N0OiB7ICdbY2xhc3MuY29sdW1uLXN3aXRjaC13cmFwcGVyXSc6ICd0cnVlJywgJ1tjbGFzcy5hY3RpdmVdJzogJ29wZW4nIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGFncmlkQ29sdW1uVG9nZ2xlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgX2FsbENvbHVtbnNWaXNpYmxlOiBib29sZWFuO1xuXG4gIC8qKipcbiAgICogUG9wb3ZlciBpbml0XG4gICAqL1xuICBwdWJsaWMgYW5jaG9yUG9pbnQ6IFBvaW50ID0gUG9pbnQuVE9QX0xFRlQ7XG4gIHB1YmxpYyBwb3BvdmVyUG9pbnQ6IFBvaW50ID0gUG9pbnQuTEVGVF9CT1RUT007XG4gIHB1YmxpYyBvcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqKipcbiAgICogRGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsIGluaXRcbiAgICovXG4gIHB1YmxpYyBjb2x1bW5zOiBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWxbXSA9IFtdO1xuXG4gIHB1YmxpYyBnZXQgYWxsQ29sdW1uc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbENvbHVtbnNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIHNldCBhbGxDb2x1bW5zVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FsbENvbHVtbnNWaXNpYmxlID0gdmFsdWU7XG4gIH1cblxuICBAQ29udGVudENoaWxkKENsckRhdGFncmlkQ29sdW1uVG9nZ2xlVGl0bGUpIHRpdGxlOiBDbHJEYXRhZ3JpZENvbHVtblRvZ2dsZVRpdGxlO1xuICBAQ29udGVudENoaWxkcmVuKENsckRhdGFncmlkQ29sdW1uVG9nZ2xlQnV0dG9uKSBidXR0b25zOiBRdWVyeUxpc3Q8Q2xyRGF0YWdyaWRDb2x1bW5Ub2dnbGVCdXR0b24+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBoaWRlYWJsZUNvbHVtblNlcnZpY2U6IEhpZGVhYmxlQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIGNvbHVtblRvZ2dsZUJ1dHRvbnM6IENvbHVtblRvZ2dsZUJ1dHRvbnNTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuaGlkZWFibGVDb2x1bW5TZXJ2aWNlLmNvbHVtbkxpc3RDaGFuZ2Uuc3Vic2NyaWJlKGNvbHVtbkxpc3QgPT4ge1xuICAgICAgICAvLyBSZXNldCB0aGUgbGlzdCBvZiBjb2x1bW5zXG4gICAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmhpZGVhYmxlQ29sdW1uU2VydmljZS51cGRhdGVGb3JMYXN0VmlzaWJsZUNvbHVtbigpO1xuICAgICAgICB0aGlzLmFsbENvbHVtbnNWaXNpYmxlID0gdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2UuY2hlY2tGb3JBbGxDb2x1bW5zVmlzaWJsZTtcbiAgICAgICAgdGhpcy5jb2x1bW5Ub2dnbGVCdXR0b25zLnNlbGVjdEFsbERpc2FibGVkID0gdGhpcy5hbGxDb2x1bW5zVmlzaWJsZTtcblxuICAgICAgICAvLyBBZGQgb25seSB0aGUgaGlkZGVuIGNvbHVtbnMgdG8gdGhlIHRvZ2dsZXIuXG4gICAgICAgIGNvbHVtbkxpc3QuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jb2x1bW5Ub2dnbGVCdXR0b25zLnNlbGVjdEFsbEJ1dHRvbkNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBzZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2Uuc2hvd0hpZGRlbkNvbHVtbnMoKTtcbiAgICB0aGlzLmFsbENvbHVtbnNWaXNpYmxlID0gdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2UuY2hlY2tGb3JBbGxDb2x1bW5zVmlzaWJsZTtcbiAgICB0aGlzLmNvbHVtblRvZ2dsZUJ1dHRvbnMuc2VsZWN0QWxsRGlzYWJsZWQgPSB0aGlzLmFsbENvbHVtbnNWaXNpYmxlO1xuICB9XG5cbiAgdG9nZ2xlQ29sdW1uKGV2ZW50OiBib29sZWFuLCBjb2x1bW46IERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbCkge1xuICAgIGNvbHVtbi5oaWRkZW4gPSAhZXZlbnQ7XG4gICAgdGhpcy5hbGxDb2x1bW5zVmlzaWJsZSA9IHRoaXMuaGlkZWFibGVDb2x1bW5TZXJ2aWNlLmNoZWNrRm9yQWxsQ29sdW1uc1Zpc2libGU7XG4gICAgdGhpcy5jb2x1bW5Ub2dnbGVCdXR0b25zLnNlbGVjdEFsbERpc2FibGVkID0gdGhpcy5hbGxDb2x1bW5zVmlzaWJsZTtcbiAgICB0aGlzLmhpZGVhYmxlQ29sdW1uU2VydmljZS51cGRhdGVGb3JMYXN0VmlzaWJsZUNvbHVtbigpO1xuICB9XG5cbiAgdG9nZ2xlVUkoKSB7XG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd3NDb3VudCB9IGZyb20gJy4vcHJvdmlkZXJzL2dsb2JhbC1leHBhbmRhYmxlLXJvd3MnO1xuXG4vKlxuICogSSBkb24ndCB0aGluayB0aGlzIGRlc2VydmVzIHRvIGJlIGluIElmRXhwYW5kZWQgaXRzZWxmLFxuICogc28gSSdtIGFkZGluZyBhIHNlY29uZCBkaXJlY3RpdmUgb24gdGhlIHNhbWUgc2VsZWN0b3IgZm9yIG5vdyBqdXN0IGZvciB0aGUgZGF0YWdyaWRcbiAqL1xuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NscklmRXhwYW5kZWRdJyB9KVxuZXhwb3J0IGNsYXNzIERhdGFncmlkRGV0YWlsUmVnaXN0ZXJlciB7XG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgZXhwYW5kYWJsZVJvd3NDb3VudDogRXhwYW5kYWJsZVJvd3NDb3VudCkge1xuICAgIGlmICh0aGlzLmV4cGFuZGFibGVSb3dzQ291bnQpIHtcbiAgICAgIHRoaXMuZXhwYW5kYWJsZVJvd3NDb3VudC5yZWdpc3RlcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmV4cGFuZGFibGVSb3dzQ291bnQpIHtcbiAgICAgIHRoaXMuZXhwYW5kYWJsZVJvd3NDb3VudC51bnJlZ2lzdGVyKCk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENsckRhdGFncmlkQ29sdW1uVG9nZ2xlIH0gZnJvbSAnLi9kYXRhZ3JpZC1jb2x1bW4tdG9nZ2xlJztcbmltcG9ydCB7IEhpZGVhYmxlQ29sdW1uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2hpZGVhYmxlLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvbiwgU2VsZWN0aW9uVHlwZSB9IGZyb20gJy4vcHJvdmlkZXJzL3NlbGVjdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1mb290ZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIihzZWxlY3Rpb24uc2VsZWN0aW9uVHlwZSA9PT0gU0VMRUNUSU9OX1RZUEUuTXVsdGkpICYmIChzZWxlY3Rpb24uY3VycmVudC5sZW5ndGggPiAwKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbHItZm9ybS1jb250cm9sLWRpc2FibGVkXCI+XG4gICAgICAgICAgICAgIDxjbHItY2hlY2tib3gtd3JhcHBlciBjbGFzcz1cImRhdGFncmlkLWZvb3Rlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xyQ2hlY2tib3ggdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZD1cImNoZWNrZWRcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICA8bGFiZWw+e3tzZWxlY3Rpb24uY3VycmVudC5sZW5ndGh9fTwvbGFiZWw+XG4gICAgICAgICAgICA8L2Nsci1jaGVja2JveC13cmFwcGVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWRnLWNvbHVtbi10b2dnbGVcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxjbHItZGctY29sdW1uLXRvZ2dsZSAqbmdJZj1cIiF0b2dnbGUgJiYgYWN0aXZlVG9nZ2xlclwiPjwvY2xyLWRnLWNvbHVtbi10b2dnbGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhZ3JpZC1mb290ZXItZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImNsci1kZy1wYWdpbmF0aW9uXCI+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmRhdGFncmlkLWZvb3Rlcl0nOiAndHJ1ZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGFncmlkRm9vdGVyPFQgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uPFQ+LFxuICAgIHB1YmxpYyBoaWRlYWJsZUNvbHVtblNlcnZpY2U6IEhpZGVhYmxlQ29sdW1uU2VydmljZSxcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgcHVibGljIGFjdGl2ZVRvZ2dsZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvKiByZWZlcmVuY2UgdG8gdGhlIGVudW0gc28gdGhhdCB0ZW1wbGF0ZSBjYW4gYWNjZXNzICovXG4gIHB1YmxpYyBTRUxFQ1RJT05fVFlQRSA9IFNlbGVjdGlvblR5cGU7XG5cbiAgQENvbnRlbnRDaGlsZChDbHJEYXRhZ3JpZENvbHVtblRvZ2dsZSkgdG9nZ2xlOiBDbHJEYXRhZ3JpZENvbHVtblRvZ2dsZTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuaGlkZWFibGVDb2x1bW5TZXJ2aWNlLmNvbHVtbkxpc3RDaGFuZ2Uuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICAgIGNvbnN0IGhpZGRlbkNvbHVtbnNJblN1YiA9IGNoYW5nZS5maWx0ZXIoY29sID0+IGNvbCk7XG4gICAgICAgIGlmIChoaWRkZW5Db2x1bW5zSW5TdWIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlVG9nZ2xlciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSB0aGlzLmhpZGVhYmxlQ29sdW1uU2VydmljZS5nZXRDb2x1bW5zKCkuZmlsdGVyKGNvbCA9PiBjb2wpO1xuXG4gICAgaWYgKGhpZGRlbkNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hY3RpdmVUb2dnbGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSB1dGlsaXR5IGNsYXNzIGZvciB0aGF0IGFkZHMgaGlkZS9zaG93IGZ1bmN0aW9uYWxpdHkgdG8gYSBjb2x1bW4sIGl0cyBjZWxscyBhbmQgZW5hYmxlcyBhIHRvZ2dsZXIgaW4gdGhlXG4gKiBEYXRhZ3JpZENvbHVtblRvZ2dsZSBDb21wb25lbnQuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgRGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsIHtcbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBoaWRkZW5DaGFuZ2VzXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHN0cmVhbSBvZiBzdGF0ZSBjaGFuZ2VzIGFuIGluc3RhbmNlIG9mIERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbCB3aWxsIGJyb2FkY2FzdCB0byBzdWJzY3JpYmVycy5cbiAgICpcbiAgICovXG4gIHByaXZhdGUgaGlkZGVuQ2hhbmdlc1N0YXRlOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBpbml0IGZ1bmN0aW9uIGZvciBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWwgaW5zdGFuY2VzIHRoYXQgZG9lcyB0aGUgZm9sbG93aW5nOlxuICAgKlxuICAgKiAxLiBTZXQgdmFsdWVzIGZvciB0aGUgcHJpdmF0ZSB2YXJpYWJsZXMgdGhhdCBlbmFibGUgYSBoaWRlYWJsZSBjb2x1bW5cbiAgICogMi4gQnJvYWRjYXN0IHRoZSBuZXh0IGhpZGRlbiBjaGFuZ2UgZm9yIGFueW9uZSAoYWxyZWFkeSkgc3Vic2NyaWJlZCB0byB0aGlzIERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbFxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4sIHByaXZhdGUgX2lkOiBzdHJpbmcsIHByaXZhdGUgX2hpZGRlbjogYm9vbGVhbiA9IGZhbHNlKSB7fVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBnZXR0ZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIFRlbXBsYXRlUmVmIG9mIHRoZSBEYXRhZ3JpZENvbHVtbiB0aGF0IGlzIGhpZGVhYmxlLiBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIHRvXG4gICAqIHBvcHVsYXRlIHRoZSBEYXRhZ3JpZENvbHVtblRvZ2dsZSBVSSB3aXRoIHRoZSBjb3JyZWN0IENvbHVtbiBuYW1lLlxuICAgKlxuICAgKi9cbiAgZ2V0IHRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogcHVibGljIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgaWQgb2YgYSBIaWRlYWJsZUNPbHVtbiBpbnN0YW5jZS4gVXNlZCBieSB0aGUgSGlkZWFibGVDT2x1bW5TZXJ2aWNlIGZvciBwYXNzaW5nXG4gICAqIHN0YXRlIGFuZCBhY3Rpb25zIGJldHdlZW4gRGF0ZUdyaWRDb2x1bW5zLCBEYXRhR3JpZENlbGxzICYgdGhlIERhdGFncmlkQ29sdW1uVG9nZ2xlIENvbXBvbmVudHMuXG4gICAqXG4gICAqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyB0aGUgaGlkZGVuIHZhbHVlIG9mIGEgRGF0YWdyaWRIaWRlYWJsZUNvbHVtbk1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKi9cbiAgZ2V0IGhpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZGVuO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgc2V0dGVyIGZvciBzZXR0aW5nIHRoZSBoaWRkZW4gc3RhdGUgb2YgYSBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWwgaW5zdGFuY2UuXG4gICAqIEl0IGFsc28gYnJvYWRjYXN0cyB0aGUgY2hhbmdlIGFmdGVyIGl0cyBzZXQuXG4gICAqXG4gICAqL1xuICBzZXQgaGlkZGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX2hpZGRlbiA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faGlkZGVuID0gdmFsdWU7XG4gICAgdGhpcy5oaWRkZW5DaGFuZ2VzU3RhdGUubmV4dCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIE9ic2VydmFibGUgZm9yIHRoZSBIaWRlYWJsZUNvbHVtbnMgaGlkZGVuIGNoYW5nZXMuXG4gICAqXG4gICAqL1xuICBnZXQgaGlkZGVuQ2hhbmdlU3RhdGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuQ2hhbmdlc1N0YXRlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gRmxhZyB0aGlzIHRydWUgd2hlbiB0aGUgc2VydmljZSBvbmx5IGhhcyBvbmUgdmlzaWJsZSBjb2x1bW4gb3Blbi5cblxuICBwdWJsaWMgbGFzdFZpc2libGVDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENvbHVtbiB9IGZyb20gJy4vZGF0YWdyaWQtY29sdW1uJztcbmltcG9ydCB7IERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbCB9IGZyb20gJy4vZGF0YWdyaWQtaGlkZWFibGUtY29sdW1uLm1vZGVsJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NsckRnSGlkZWFibGVDb2x1bW5dJyB9KVxuXG4vKipcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc3RydWN0dXJhbCBkaXJlY3RpdmUgbWVhbnQgdG8gYmUgdXNlZCBpbnNpZGUgYSBjbHItZGctY29sdW1uIGNvbXBvbmVudC5cbiAqXG4gKiA8Y2xyLWRnLWNvbHVtbj5cbiAqICAgICAgIDxuZy1jb250YWluZXIgKmNsckRnSGlkZWFibGVDb2x1bW49XCJ7IGhpZGRlbjogdHJ1ZSB9XCI+XG4gKiAgICAgICAgICAgVXNlciBJRFxuICogICAgICAgPC9uZy1jb250YWluZXI+XG4gKiAgIDwvY2xyLWRnLWNvbHVtbj5cbiAqXG4gKiBJdCBzZXRzIHVwIHN0YXRlIGFuZCBwcm9wZXJ0aWVzIHNvIHRoYXQgY29sdW1ucyBjYW4gYmUgbWFuZ2VzIGZvciBoaWRlL3Nob3cgYnkgYSBzZXJ2aWNlIGFuZCBhbiBpbnRlcm5hbFxuICogZGF0YWdyaWQgdG9nZ2xlIGNvbXBvbmVudC5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBDbHJEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uIHtcbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBVc2VkIHRvIGluaXRpYWxpemUgdGhlIGNvbHVtbiB3aXRoIGVpdGhlciBoaWRkZW4gb3IgdmlzaWJsZSBzdGF0ZS5cbiAgICpcbiAgICovXG4gIHByaXZhdGUgX2hpZGRlbjogYm9vbGVhbjtcblxuICAvKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHRlciBmbiBmb3IgdGhlIEBJbnB1dCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhpcyBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZS5cbiAgICogSXQgYWxsb3dzIHRoZSB1c2VyIHRvIHByZS1jb25maWd1cmUgdGhlIGNvbHVtbidzIGhpZGUvc2hvdyBzdGF0ZS4geyBoaWRkZW46IHRydWUgfVxuICAgKiBJdCdzIG1vcmUgdmVyYm9zZSBidXQgaGFzIG1vcmUgQ2xhcml0eS5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogKmNsckRnSGlkZWFibGVDb2x1bW5cbiAgICogKmNsckRnSGlkZWFibGVDb2x1bW49e2hpZGRlbjogZmFsc2V9XG4gICAqICpjbHJEZ0hpZGVhYmxlQ29sdW1uPXtoaWRkZW46IHRydWV9XG4gICAqXG4gICAqL1xuICBASW5wdXQoJ2NsckRnSGlkZWFibGVDb2x1bW4nKVxuICBzZXQgY2xyRGdIaWRlYWJsZUNvbHVtbih2YWx1ZTogeyBoaWRkZW46IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuY2xyRGdIaWRkZW4gPSB2YWx1ZSAmJiB2YWx1ZS5oaWRkZW4gPyB2YWx1ZS5oaWRkZW4gOiBmYWxzZTtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRGdIaWRkZW4nKVxuICBzZXQgY2xyRGdIaWRkZW4oaGlkZGVuOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGlkZGVuID0gaGlkZGVuID8gaGlkZGVuIDogZmFsc2U7XG4gICAgaWYgKHRoaXMuZGdDb2x1bW4uaGlkZWFibGUpIHtcbiAgICAgIHRoaXMuZGdDb2x1bW4uaGlkZWFibGUuaGlkZGVuID0gdGhpcy5faGlkZGVuO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckRnSGlkZGVuQ2hhbmdlJykgcHVibGljIGhpZGRlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcGFzc2VkIGludG8gdGhlIGRpcmVjdGl2ZSBmcm9tIHRoZSBwYXJlbnQgKEEgRGF0YWdyaWRDb2x1bW4pLlxuICAgKlxuICAgKi9cbiAgcHVibGljIGNvbHVtbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgRGF0YWdyaWRIaWRlYWJsZUNvbHVtbiBVdGlsaXR5IGNsYXNzIHRoYXQgaXMgdXNlZCB0bzpcbiAgICogMS4gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEhpZGVhYmxlQ29sdW1uIHRoYXQgd2lsbCBtYW5hZ2UgdGhlIFRlbXBsYXRlUmVmLCBzdGF0ZSBhbmQgY29tbXVuaWNhdGlvblxuICAgKiAyLiBNYW5hZ2UgdGhlIGhpZGRlbi9zaG93biBzdGF0ZSBmb3IgdGhlIGNvbHVtbiB0byB3aGljaCB0aGlzIGRpcmVjdGl2ZSBpcyBhcHBsaWVkXG4gICAqIDMuIHRyYWNrIHRoZSBpZCBvZiB0aGUgaGlkZGVuIGNvbHVtbiBzbyBpdCBjYW4gYmUgdXNlZCBpbiBjZWxscyBhcyB3ZWxsIGFzIG9uIHRoZSBjb2x1bW5cbiAgICovXG4gIHB1YmxpYyBjb2x1bW46IERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFVzZWQgdGhlIERhdGFncmlkQ29sdW1uIHRvIGdldCBhbmQgc2V0IGFuIGlkIGZvciB0aGlzIEhpZGRlbkNvbHVtblxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBkZ0NvbHVtbjogQ2xyRGF0YWdyaWRDb2x1bW48YW55PlxuICApIHtcbiAgICB0aGlzLmNvbHVtbklkID0gZGdDb2x1bW4uY29sdW1uSWQ7XG5cbiAgICAvLyBVc2UgdGhlIHRlbXBsYXRlUmVmIHRvIGNyZWF0ZSB0aGlzIHZpZXdcbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYpO1xuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlIG9mIHRoZSB1dGlsaXR5IGNsYXNzIERhdGFncmlkSGlkZWFibGVDb2x1bW4uXG4gICAgLy8gTm90ZSB0aGlzIGlzIG9uIHRoZSBwYXJlbnQgaW5zdGFuY2Ugb2YgRGF0YWdyaWRDb2x1bW4uXG4gICAgdGhpcy5kZ0NvbHVtbi5oaWRlYWJsZSA9IG5ldyBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWwodGhpcy50ZW1wbGF0ZVJlZiwgdGhpcy5jb2x1bW5JZCwgdGhpcy5faGlkZGVuKTtcbiAgICB0aGlzLmRnQ29sdW1uLmhpZGVhYmxlLmhpZGRlbkNoYW5nZVN0YXRlLnN1YnNjcmliZShzdGF0ZSA9PiB0aGlzLmhpZGRlbkNoYW5nZS5lbWl0KHN0YXRlKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9wdGlvbmFsLCBUcmFja0J5RnVuY3Rpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSXRlbXMgfSBmcm9tICcuL3Byb3ZpZGVycy9pdGVtcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ0ZvclRyYWNrQnldJyxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRGF0YWdyaWRJdGVtc1RyYWNrQnk8VCA9IGFueT4ge1xuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBwcml2YXRlIF9pdGVtczogSXRlbXM8VD4pIHt9XG5cbiAgQElucHV0KCduZ0ZvclRyYWNrQnknKVxuICBzZXQgdHJhY2tCeSh2YWx1ZTogVHJhY2tCeUZ1bmN0aW9uPFQ+KSB7XG4gICAgaWYgKHRoaXMuX2l0ZW1zKSB7XG4gICAgICB0aGlzLl9pdGVtcy50cmFja0J5ID0gdmFsdWU7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSAnLi9wcm92aWRlcnMvcGFnZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1wYWdlLXNpemUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiY2xyLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICA8c2VsZWN0IFtjbGFzcy5jbHItcGFnZS1zaXplLXNlbGVjdF09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJwYWdlLnNpemVcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHBhZ2VTaXplT3B0aW9uc1wiIFtuZ1ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9ufX08L29wdGlvbj5cbiAgICAgIDwvc2VsZWN0PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEYXRhZ3JpZFBhZ2VTaXplIHtcbiAgQElucHV0KCdjbHJQYWdlU2l6ZU9wdGlvbnMnKSBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYWdlOiBQYWdlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5wYWdlU2l6ZU9wdGlvbnMgfHwgdGhpcy5wYWdlU2l6ZU9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IFt0aGlzLnBhZ2Uuc2l6ZV07XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gJy4vcHJvdmlkZXJzL3BhZ2UnO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRQYWdlU2l6ZSB9IGZyb20gJy4vZGF0YWdyaWQtcGFnZS1zaXplJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWRnLXBhZ2luYXRpb24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uLXNpemVcIiAqbmdJZj1cIl9wYWdlU2l6ZUNvbXBvbmVudFwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiY2xyLWRnLXBhZ2Utc2l6ZVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdGlvbi1kZXNjcmlwdGlvblwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uLWxpc3RcIiAqbmdJZj1cInBhZ2UubGFzdCA+IDFcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdpbmF0aW9uLWZpcnN0XCIgW2Rpc2FibGVkXT1cInBhZ2UuY3VycmVudCA8PSAxXCIgKGNsaWNrKT1cInBhZ2UuY3VycmVudCA9IDFcIj5cbiAgICAgICAgPGNsci1pY29uIHNoYXBlPVwic3RlcC1mb3J3YXJkLTIgZG93blwiPjwvY2xyLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdpbmF0aW9uLXByZXZpb3VzXCIgW2Rpc2FibGVkXT1cInBhZ2UuY3VycmVudCA8PSAxXCIgKGNsaWNrKT1cInBhZ2UuY3VycmVudCA9IHBhZ2UuY3VycmVudCAtIDFcIj5cbiAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiYW5nbGUgbGVmdFwiPjwvY2xyLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxpbnB1dCAjY3VycmVudFBhZ2VJbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwicGFnaW5hdGlvbi1jdXJyZW50XCIgW3NpemVdPVwicGFnZS5sYXN0LnRvU3RyaW5nKCkubGVuZ3RoXCIgW3ZhbHVlXT1cInBhZ2UuY3VycmVudFwiXG4gICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidXBkYXRlQ3VycmVudFBhZ2UoJGV2ZW50KVwiIChibHVyKT1cInVwZGF0ZUN1cnJlbnRQYWdlKCRldmVudClcIi8+Jm5ic3A7LyZuYnNwOzxzcGFuPnt7cGFnZS5sYXN0fX08L3NwYW4+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwicGFnaW5hdGlvbi1uZXh0XCIgW2Rpc2FibGVkXT1cInBhZ2UuY3VycmVudCA+PSBwYWdlLmxhc3RcIiAoY2xpY2spPVwicGFnZS5jdXJyZW50ID0gcGFnZS5jdXJyZW50ICsgMVwiPlxuICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJhbmdsZSByaWdodFwiPjwvY2xyLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJwYWdpbmF0aW9uLWxhc3RcIiBbZGlzYWJsZWRdPVwicGFnZS5jdXJyZW50ID49IHBhZ2UubGFzdFwiIChjbGljayk9XCJwYWdlLmN1cnJlbnQgPSBwYWdlLmxhc3RcIj5cbiAgICAgICAgPGNsci1pY29uIHNoYXBlPVwic3RlcC1mb3J3YXJkLTIgdXBcIj48L2Nsci1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgYCxcbiAgaG9zdDogeyAnW2NsYXNzLnBhZ2luYXRpb25dJzogJ3RydWUnIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGFncmlkUGFnaW5hdGlvbiBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgQENvbnRlbnRDaGlsZChDbHJEYXRhZ3JpZFBhZ2VTaXplKSBfcGFnZVNpemVDb21wb25lbnQ6IENsckRhdGFncmlkUGFnZVNpemU7XG4gIEBWaWV3Q2hpbGQoJ2N1cnJlbnRQYWdlSW5wdXQnKSBjdXJyZW50UGFnZUlucHV0UmVmOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgZGVmYXVsdFNpemUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYWdlOiBQYWdlKSB7fVxuXG4gIC8qKioqKioqKioqXG4gICAqIFN1YnNjcmlwdGlvbiB0byB0aGUgUGFnZSBzZXJ2aWNlIGZvciBwYWdlIGNoYW5nZXMuXG4gICAqIE5vdGU6IHRoaXMgb25seSBlbWl0cyBhZnRlciB0aGUgZGF0YWdyaWQgaXMgaW5pdGlhbGl6ZWQvc3RhYmFsaXplZCBhbmQgdGhlIHBhZ2UgY2hhbmdlcy5cbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIC8qXG4gICAgICogRGVmYXVsdCBwYWdlIHNpemUgaXMgMTAuXG4gICAgICogVGhlIHJlYXNvbiB3ZSBzZXQgaXQgaW4gdGhpcyBjb25zdHJ1Y3RvciBhbmQgbm90IGluIHRoZSBwcm92aWRlciBpdHNlbGYgaXMgYmVjYXVzZVxuICAgICAqIHdlIGRvbid0IHdhbnQgcGFnaW5hdGlvbiAocGFnZSBzaXplIDApIGlmIHRoaXMgY29tcG9uZW50IGlzbid0IHByZXNlbnQgaW4gdGhlIGRhdGFncmlkLlxuICAgICAqL1xuICAgIGlmICh0aGlzLmRlZmF1bHRTaXplKSB7XG4gICAgICB0aGlzLnBhZ2Uuc2l6ZSA9IDEwO1xuICAgIH1cbiAgICB0aGlzLl9wYWdlU3Vic2NyaXB0aW9uID0gdGhpcy5wYWdlLmNoYW5nZS5zdWJzY3JpYmUoY3VycmVudCA9PiB0aGlzLmN1cnJlbnRDaGFuZ2VkLmVtaXQoY3VycmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byB0aGUgcGFnZSBzZXJ2aWNlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgX3BhZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnBhZ2UucmVzZXRQYWdlU2l6ZSgpO1xuICAgIGlmICh0aGlzLl9wYWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9wYWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhZ2Ugc2l6ZVxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2Uuc2l6ZTtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRGdQYWdlU2l6ZScpXG4gIHB1YmxpYyBzZXQgcGFnZVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5kZWZhdWx0U2l6ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5wYWdlLnNpemUgPSBzaXplO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBpdGVtcyAobmVlZGVkIHRvIGd1ZXNzIHRoZSBsYXN0IHBhZ2UpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsSXRlbXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlLnRvdGFsSXRlbXM7XG4gIH1cblxuICBASW5wdXQoJ2NsckRnVG90YWxJdGVtcycpXG4gIHB1YmxpYyBzZXQgdG90YWxJdGVtcyh0b3RhbDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiB0b3RhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMucGFnZS50b3RhbEl0ZW1zID0gdG90YWw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhc3QgcGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBsYXN0UGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2UubGFzdDtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRGdMYXN0UGFnZScpXG4gIHB1YmxpYyBzZXQgbGFzdFBhZ2UobGFzdDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsYXN0ID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5wYWdlLmxhc3QgPSBsYXN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlLmN1cnJlbnQ7XG4gIH1cblxuICBASW5wdXQoJ2NsckRnUGFnZScpXG4gIHB1YmxpYyBzZXQgY3VycmVudFBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBwYWdlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5wYWdlLmN1cnJlbnQgPSBwYWdlO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckRnUGFnZUNoYW5nZScpIGN1cnJlbnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KGZhbHNlKTtcblxuICAvKipcbiAgICogTW92ZXMgdG8gdGhlIHByZXZpb3VzIHBhZ2UgaWYgaXQgZXhpc3RzXG4gICAqL1xuICBwdWJsaWMgcHJldmlvdXMoKSB7XG4gICAgdGhpcy5wYWdlLnByZXZpb3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdG8gdGhlIG5leHQgcGFnZSBpZiBpdCBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBuZXh0KCkge1xuICAgIHRoaXMucGFnZS5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0gZGlzcGxheWVkIG9uIHRoZSBjdXJyZW50IHBhZ2UsIHN0YXJ0aW5nIGF0IDBcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RJdGVtKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnZS5maXJzdEl0ZW07XG4gIH1cblxuICAvKipcbiAgICogSW5kZXggb2YgdGhlIGxhc3QgaXRlbSBkaXNwbGF5ZWQgb24gdGhlIGN1cnJlbnQgcGFnZSwgc3RhcnRpbmcgYXQgMFxuICAgKi9cbiAgcHVibGljIGdldCBsYXN0SXRlbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2UubGFzdEl0ZW07XG4gIH1cblxuICAvKipcbiAgICogQ29uZGl0aW9uYWxseSBhZGRzIHBhZ2UgbnVtYmVycyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgbWlkZGxlUGFnZXMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG1pZGRsZVBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGlmICh0aGlzLnBhZ2UuY3VycmVudCA+IDEpIHtcbiAgICAgIG1pZGRsZVBhZ2VzLnB1c2godGhpcy5wYWdlLmN1cnJlbnQgLSAxKTtcbiAgICB9XG4gICAgbWlkZGxlUGFnZXMucHVzaCh0aGlzLnBhZ2UuY3VycmVudCk7XG4gICAgaWYgKHRoaXMucGFnZS5jdXJyZW50IDwgdGhpcy5wYWdlLmxhc3QpIHtcbiAgICAgIG1pZGRsZVBhZ2VzLnB1c2godGhpcy5wYWdlLmN1cnJlbnQgKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIG1pZGRsZVBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdlIG9ubHkgdXBkYXRlIHRoZSBwYWdpbmF0aW9uJ3MgY3VycmVudCBwYWdlIG9uIGJsdXIgb2YgdGhlIGlucHV0IGZpZWxkLCBvclxuICAgKiB3aGVuIHRoZXkgcHJlc3MgZW50ZXIuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ3VycmVudFBhZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSwgMTApO1xuXG4gICAgLy8gaWYgdGhlIGlucHV0IHZhbHVlLCBpcyBub3QgYSBudW1iZXIsIHdlIGRvbid0IHVwZGF0ZSB0aGUgcGFnZVxuICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgaWYgKHBhcnNlZCA8IDEpIHtcbiAgICAgICAgdGhpcy5wYWdlLmN1cnJlbnQgPSAxO1xuICAgICAgfSBlbHNlIGlmIChwYXJzZWQgPiB0aGlzLnBhZ2UubGFzdCkge1xuICAgICAgICB0aGlzLnBhZ2UuY3VycmVudCA9IHRoaXMucGFnZS5sYXN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlLmN1cnJlbnQgPSBwYXJzZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBpbnB1dCdzIHZhbHVlIHRvIHRoZSBuZXcgY3VycmVudCBwYWdlLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBjb2RlXG4gICAgICogYWJvdmUgbWF5IGhhdmUgY2hhbmdlZCB0aGUgdmFsdWUgZnJvbSB3aGF0IHRoZSB1c2VyIGVudGVyZWQgaW4uXG4gICAgICovXG4gICAgdGhpcy5jdXJyZW50UGFnZUlucHV0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLnBhZ2UuY3VycmVudDtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIElucHV0LCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEV4cGFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL2V4cGFuZC9wcm92aWRlcnMvZXhwYW5kJztcblxuaW1wb3J0IHsgQ2xyRGF0YWdyaWRDZWxsIH0gZnJvbSAnLi9kYXRhZ3JpZC1jZWxsJztcbmltcG9ydCB7IERhdGFncmlkSGlkZWFibGVDb2x1bW5Nb2RlbCB9IGZyb20gJy4vZGF0YWdyaWQtaGlkZWFibGUtY29sdW1uLm1vZGVsJztcbmltcG9ydCB7IEV4cGFuZGFibGVSb3dzQ291bnQgfSBmcm9tICcuL3Byb3ZpZGVycy9nbG9iYWwtZXhwYW5kYWJsZS1yb3dzJztcbmltcG9ydCB7IEhpZGVhYmxlQ29sdW1uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2hpZGVhYmxlLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCB7IFJvd0FjdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9yb3ctYWN0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uLCBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnLi9wcm92aWRlcnMvc2VsZWN0aW9uJztcblxuLyoqXG4gKiBHZW5lcmljIGJsYW5kIGNvbnRhaW5lciBzZXJ2aW5nIHZhcmlvdXMgcHVycG9zZXMgZm9yIERhdGFncmlkLlxuICogRm9yIGluc3RhbmNlLCBpdCBjYW4gaGVscCBzcGFuIGEgdGV4dCBvdmVyIG11bHRpcGxlIHJvd3MgaW4gZGV0YWlsIHZpZXcuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kZy1yb3ctZGV0YWlsJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyZXBsYWNlZFJvd1wiPlxuICAgICAgICAgICAgPCEtLSBzcGFjZSBmb3IgbXVsdGlzZWxlY3Rpb24gc3RhdGUgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YWdyaWQtY2VsbCBkYXRhZ3JpZC1zZWxlY3QgZGF0YWdyaWQtZml4ZWQtY29sdW1uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGlvbi5zZWxlY3Rpb25UeXBlID09PSBTRUxFQ1RJT05fVFlQRS5NdWx0aVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIHNwYWNlIGZvciBzaW5nbGUgc2VsZWN0aW9uIHN0YXRlIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFncmlkLWNlbGwgZGF0YWdyaWQtc2VsZWN0IGRhdGFncmlkLWZpeGVkLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3Rpb24uc2VsZWN0aW9uVHlwZSA9PT0gU0VMRUNUSU9OX1RZUEUuU2luZ2xlXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gc3BhY2UgZm9yIHNpbmdsZSByb3cgYWN0aW9uOyBvbmx5IGRpc3BsYXlUeXBlIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGFjdGlvbmFibGUgcm93IGluIGRhdGFncmlkIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFncmlkLWNlbGwgZGF0YWdyaWQtcm93LWFjdGlvbnMgZGF0YWdyaWQtZml4ZWQtY29sdW1uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJvd0FjdGlvblNlcnZpY2UuaGFzQWN0aW9uYWJsZVJvd1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIHNwYWNlIGZvciBleHBhbmRhYmxlIGNhcmV0IGFjdGlvbjsgb25seSBkaXNwbGF5VHlwZSBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBleHBhbmRhYmxlIHJvdyBpbiBkYXRhZ3JpZCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJleHBhbmRhYmxlUm93cy5oYXNFeHBhbmRhYmxlUm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0YWdyaWQtZXhwYW5kYWJsZS1jYXJldCBkYXRhZ3JpZC1maXhlZC1jb2x1bW4gZGF0YWdyaWQtY2VsbFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuZGF0YWdyaWQtcm93LWZsZXhdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuZGF0YWdyaWQtcm93LWRldGFpbF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5kYXRhZ3JpZC1jb250YWluZXJdJzogJ2NlbGxzLmxlbmd0aCA9PT0gMCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRhdGFncmlkUm93RGV0YWlsPFQgPSBhbnk+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgLyogcmVmZXJlbmNlIHRvIHRoZSBlbnVtIHNvIHRoYXQgdGVtcGxhdGUgY2FuIGFjY2VzcyBpdCAqL1xuICBwdWJsaWMgU0VMRUNUSU9OX1RZUEUgPSBTZWxlY3Rpb25UeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzZWxlY3Rpb246IFNlbGVjdGlvbixcbiAgICBwdWJsaWMgcm93QWN0aW9uU2VydmljZTogUm93QWN0aW9uU2VydmljZSxcbiAgICBwdWJsaWMgZXhwYW5kOiBFeHBhbmQsXG4gICAgcHVibGljIGhpZGVhYmxlQ29sdW1uU2VydmljZTogSGlkZWFibGVDb2x1bW5TZXJ2aWNlLFxuICAgIHB1YmxpYyBleHBhbmRhYmxlUm93czogRXhwYW5kYWJsZVJvd3NDb3VudFxuICApIHt9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihDbHJEYXRhZ3JpZENlbGwpIGNlbGxzOiBRdWVyeUxpc3Q8Q2xyRGF0YWdyaWRDZWxsPjtcblxuICBASW5wdXQoJ2NsckRnUmVwbGFjZScpXG4gIHNldCByZXBsYWNlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5leHBhbmQuc2V0UmVwbGFjZSghIXZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHVibGljIHJlcGxhY2VkUm93ID0gZmFsc2U7XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGNvbnN0IGNvbHVtbnNMaXN0ID0gdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2UuZ2V0Q29sdW1ucygpO1xuICAgIHRoaXMudXBkYXRlQ2VsbHNGb3JDb2x1bW5zKGNvbHVtbnNMaXN0KTtcblxuICAgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSBDZWxscyBsaXN0IGNoYW5nZXMgcGVyIHJvdy1yZW5kZXJlclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jZWxscy5jaGFuZ2VzLnN1YnNjcmliZShjZWxsTGlzdCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkxpc3QgPSB0aGlzLmhpZGVhYmxlQ29sdW1uU2VydmljZS5nZXRDb2x1bW5zKCk7XG4gICAgICAgIGlmIChjZWxsTGlzdC5sZW5ndGggPT09IGNvbHVtbkxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVDZWxsc0ZvckNvbHVtbnMoY29sdW1uTGlzdCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZWQgdG8gc2V0IHRoaW5ncyB1cCB0aGUgZmlyc3QgdGltZSBidXQgb25seSBhZnRlciBhbGwgdGhlIGNvbHVtbnMgYXJlIHJlYWR5LlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5oaWRlYWJsZUNvbHVtblNlcnZpY2UuY29sdW1uTGlzdENoYW5nZS5zdWJzY3JpYmUoY29sdW1uTGlzdCA9PiB7XG4gICAgICAgIC8vIFByZXZlbnRzIGNlbGwgdXBkYXRlcyB3aGVuIGNvbHMgYW5kIGNlbGxzIGFycmF5IGFyZSBub3QgYWxpZ25lZFxuICAgICAgICBpZiAoY29sdW1uTGlzdC5sZW5ndGggPT09IHRoaXMuY2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVDZWxsc0ZvckNvbHVtbnMoY29sdW1uTGlzdCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5leHBhbmQucmVwbGFjZS5zdWJzY3JpYmUocmVwbGFjZUNoYW5nZSA9PiB7XG4gICAgICAgIHRoaXMucmVwbGFjZWRSb3cgPSByZXBsYWNlQ2hhbmdlO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNlbGxzRm9yQ29sdW1ucyhjb2x1bW5MaXN0OiBEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uTW9kZWxbXSkge1xuICAgIHRoaXMuY2VsbHMuZm9yRWFjaCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSBjb2x1bW5MaXN0W2luZGV4XTsgLy8gQWNjb3VudHMgZm9yIG51bGwgc3BhY2UuXG4gICAgICBpZiAoY3VycmVudENvbHVtbikge1xuICAgICAgICBjZWxsLmlkID0gY3VycmVudENvbHVtbi5pZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuZXhwb3J0IGNvbnN0IE5PX0xBWU9VVF9DTEFTUyA9ICdkYXRhZ3JpZC1uby1sYXlvdXQnO1xuZXhwb3J0IGNvbnN0IENPTVBVVEVfV0lEVEhfQ0xBU1MgPSAnZGF0YWdyaWQtY29tcHV0aW5nLWNvbHVtbnMtd2lkdGgnO1xuZXhwb3J0IGNvbnN0IFNUUklDVF9XSURUSF9DTEFTUyA9ICdkYXRhZ3JpZC1maXhlZC13aWR0aCc7XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRGF0YWdyaWRSZW5kZXJTdGVwIH0gZnJvbSAnLi4vZW51bXMvcmVuZGVyLXN0ZXAuZW51bSc7XG5cbmltcG9ydCB7IFNUUklDVF9XSURUSF9DTEFTUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IERhdGFncmlkUmVuZGVyT3JnYW5pemVyIH0gZnJvbSAnLi9yZW5kZXItb3JnYW5pemVyJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnY2xyLWRnLWNlbGwnIH0pXG5leHBvcnQgY2xhc3MgRGF0YWdyaWRDZWxsUmVuZGVyZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIG9yZ2FuaXplcjogRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIG9yZ2FuaXplci5maWx0ZXJSZW5kZXJTdGVwcyhEYXRhZ3JpZFJlbmRlclN0ZXAuQ0xFQVJfV0lEVEhTKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbGVhcldpZHRoKCkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJXaWR0aCgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgU1RSSUNUX1dJRFRIX0NMQVNTKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgc2V0V2lkdGgoc3RyaWN0OiBib29sZWFuLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHN0cmljdCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIFNUUklDVF9XSURUSF9DTEFTUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBTVFJJQ1RfV0lEVEhfQ0xBU1MpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgdmFsdWUgKyAncHgnKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IERyYWdEaXNwYXRjaGVyIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2RyYWctZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBUYWJsZVNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvdmlkZXJzL3RhYmxlLXNpemUuc2VydmljZSc7XG5cbmltcG9ydCB7IERvbUFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9kb20tYWRhcHRlci9kb20tYWRhcHRlcic7XG5pbXBvcnQgeyBEYXRhZ3JpZFJlbmRlck9yZ2FuaXplciB9IGZyb20gJy4vcmVuZGVyLW9yZ2FuaXplcic7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ2Nsci1kZy1jb2x1bW4nLCBwcm92aWRlcnM6IFtEcmFnRGlzcGF0Y2hlcl0gfSlcbmV4cG9ydCBjbGFzcyBEYXRhZ3JpZENvbHVtblJlc2l6ZXIgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBvcmdhbml6ZXI6IERhdGFncmlkUmVuZGVyT3JnYW5pemVyLFxuICAgIHByaXZhdGUgZG9tQWRhcHRlcjogRG9tQWRhcHRlcixcbiAgICBwcml2YXRlIGRyYWdEaXNwYXRjaGVyOiBEcmFnRGlzcGF0Y2hlcixcbiAgICBwcml2YXRlIHRhYmxlOiBUYWJsZVNpemVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY29sdW1uRWwgPSBlbC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgY29sdW1uRWw6IGFueTtcbiAgY29sdW1uUmVjdFdpZHRoOiBudW1iZXI7XG4gIGNvbHVtblJlc2l6ZUJ5OiBudW1iZXIgPSAwO1xuXG4gIGhhbmRsZVRyYWNrZXJFbDogRWxlbWVudFJlZjtcblxuICBwYWdlU3RhcnRQb3NpdGlvblg6IG51bWJlcjtcbiAgZHJhZ0Rpc3RhbmNlUG9zaXRpb25YOiBudW1iZXI7IC8vIHJlbGF0aXZlIHRvIHBhZ2VTdGFydFBvc2l0aW9uXG5cbiAgZHJhZ1dpdGhpbk1pbldpZHRoOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29sdW1uTWluV2lkdGg6IG51bWJlcjtcblxuICBAT3V0cHV0KCdjbHJEZ0NvbHVtblJlc2l6ZScpIHJlc2l6ZUVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRyYWdEaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViOiBTdWJzY3JpcHRpb24pID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmhhbmRsZVRyYWNrZXJFbCA9IHRoaXMuZHJhZ0Rpc3BhdGNoZXIuaGFuZGxlVHJhY2tlclJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuZHJhZ0Rpc3BhdGNoZXIuYWRkRHJhZ0xpc3RlbmVyKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5kcmFnRGlzcGF0Y2hlci5vbkRyYWdTdGFydC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kcmFnU3RhcnRIYW5kbGVyKCkpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmRyYWdEaXNwYXRjaGVyLm9uRHJhZ01vdmUuc3Vic2NyaWJlKCRldmVudCA9PiB0aGlzLmRyYWdNb3ZlSGFuZGxlcigkZXZlbnQpKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5kcmFnRGlzcGF0Y2hlci5vbkRyYWdFbmQuc3Vic2NyaWJlKCgpID0+IHRoaXMuZHJhZ0VuZEhhbmRsZXIoKSkpO1xuICB9XG5cbiAgZHJhZ1N0YXJ0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uTWluV2lkdGgpIHtcbiAgICAgIC8vIHNldHMgdGhlIG1pbiB3aWR0aCBvbmx5IG9uIHRoZSB2ZXJ5IGZpcnN0IGRyYWcgYXR0ZW1wdFxuICAgICAgdGhpcy5jb2x1bW5NaW5XaWR0aCA9IHRoaXMuZG9tQWRhcHRlci5taW5XaWR0aCh0aGlzLmNvbHVtbkVsKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmhhbmRsZVRyYWNrZXJFbCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaGFuZGxlVHJhY2tlckVsLCAnaGVpZ2h0JywgdGhpcy50YWJsZS5nZXRDb2x1bW5EcmFnSGVpZ2h0KCkpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJ2N1cnNvcicsICdjb2wtcmVzaXplJyk7XG4gICAgdGhpcy5kcmFnRGlzdGFuY2VQb3NpdGlvblggPSAwO1xuICAgIHRoaXMuY29sdW1uUmVjdFdpZHRoID0gdGhpcy5kb21BZGFwdGVyLmNsaWVudFJlY3QodGhpcy5jb2x1bW5FbCkud2lkdGg7XG4gICAgdGhpcy5wYWdlU3RhcnRQb3NpdGlvblggPSB0aGlzLmRvbUFkYXB0ZXIuY2xpZW50UmVjdCh0aGlzLmNvbHVtbkVsKS5yaWdodDtcbiAgfVxuXG4gIGRyYWdNb3ZlSGFuZGxlcihtb3ZlRXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2VNb3ZlUG9zaXRpb24gPSBtb3ZlRXZlbnQucGFnZVggfHwgbW92ZUV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO1xuICAgIHRoaXMuZHJhZ0Rpc3RhbmNlUG9zaXRpb25YID0gdGhpcy5nZXRQb3NpdGlvbldpdGhpbk1heChwYWdlTW92ZVBvc2l0aW9uIC0gdGhpcy5wYWdlU3RhcnRQb3NpdGlvblgpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5oYW5kbGVUcmFja2VyRWwsICdyaWdodCcsIC0xICogdGhpcy5kcmFnRGlzdGFuY2VQb3NpdGlvblggKyAncHgnKTtcbiAgfVxuXG4gIGRyYWdFbmRIYW5kbGVyKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5oYW5kbGVUcmFja2VyRWwsICdyaWdodCcsICcwcHgnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaGFuZGxlVHJhY2tlckVsLCAnZGlzcGxheScsICdub25lJyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnY3Vyc29yJywgJ2F1dG8nKTtcblxuICAgIGlmICh0aGlzLmRyYWdEaXN0YW5jZVBvc2l0aW9uWCkge1xuICAgICAgdGhpcy5jb2x1bW5SZXNpemVCeSA9IHRoaXMuZHJhZ0Rpc3RhbmNlUG9zaXRpb25YO1xuXG4gICAgICB0aGlzLnJlc2l6ZUVtaXR0ZXIuZW1pdCh0aGlzLmNvbHVtblJlY3RXaWR0aCArIHRoaXMuY29sdW1uUmVzaXplQnkpO1xuICAgICAgdGhpcy5vcmdhbml6ZXIucmVzaXplKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UG9zaXRpb25XaXRoaW5NYXgoZHJhZ2dlZERpc3RhbmNlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChkcmFnZ2VkRGlzdGFuY2UgPCAwKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoZHJhZ2dlZERpc3RhbmNlKSA8IHRoaXMuY29sdW1uUmVjdFdpZHRoIC0gdGhpcy5jb2x1bW5NaW5XaWR0aCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnV2l0aGluTWluV2lkdGgpIHtcbiAgICAgICAgICB0aGlzLmRyYWdXaXRoaW5NaW5XaWR0aCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5oYW5kbGVUcmFja2VyRWwsICdleGNlZWRlZC1tYXgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhZ2dlZERpc3RhbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmRyYWdXaXRoaW5NaW5XaWR0aCkge1xuICAgICAgICAgIHRoaXMuZHJhZ1dpdGhpbk1pbldpZHRoID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaGFuZGxlVHJhY2tlckVsLCAnZXhjZWVkZWQtbWF4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTWluV2lkdGggLSB0aGlzLmNvbHVtblJlY3RXaWR0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZHJhZ1dpdGhpbk1pbldpZHRoKSB7XG4gICAgICAgIHRoaXMuZHJhZ1dpdGhpbk1pbldpZHRoID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5oYW5kbGVUcmFja2VyRWwsICdleGNlZWRlZC1tYXgnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRyYWdnZWREaXN0YW5jZTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBEYXRhZ3JpZFJlbmRlclN0ZXAgfSBmcm9tICcuLi9lbnVtcy9yZW5kZXItc3RlcC5lbnVtJztcblxuaW1wb3J0IHsgRGF0YWdyaWRDb2x1bW5SZXNpemVyIH0gZnJvbSAnLi9jb2x1bW4tcmVzaXplcic7XG5pbXBvcnQgeyBTVFJJQ1RfV0lEVEhfQ0xBU1MgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBEb21BZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZG9tLWFkYXB0ZXIvZG9tLWFkYXB0ZXInO1xuaW1wb3J0IHsgRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIgfSBmcm9tICcuL3JlbmRlci1vcmdhbml6ZXInO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdjbHItZGctY29sdW1uJyB9KVxuZXhwb3J0IGNsYXNzIERhdGFncmlkSGVhZGVyUmVuZGVyZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIG9yZ2FuaXplcjogRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIsXG4gICAgcHJpdmF0ZSBkb21BZGFwdGVyOiBEb21BZGFwdGVyLFxuICAgIHByaXZhdGUgY29sdW1uUmVzaXplcjogRGF0YWdyaWRDb2x1bW5SZXNpemVyXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5vcmdhbml6ZXIuZmlsdGVyUmVuZGVyU3RlcHMoRGF0YWdyaWRSZW5kZXJTdGVwLkNMRUFSX1dJRFRIUykuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xlYXJXaWR0aCgpKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLm9yZ2FuaXplclxuICAgICAgICAuZmlsdGVyUmVuZGVyU3RlcHMoRGF0YWdyaWRSZW5kZXJTdGVwLkRFVEVDVF9TVFJJQ1RfV0lEVEhTKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGV0ZWN0U3RyaWN0V2lkdGgoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgY29sdW1uIGhhcyBhIHN0cmljdCB3aWR0aCwgc28gaXQgZG9lc24ndCBzaHJpbmsgb3IgZXhwYW5kIGJhc2VkIG9uIHRoZSBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHN0cmljdFdpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgd2lkdGhTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyV2lkdGgoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSB3aWR0aCBvbmx5IGlmIHdlIHNldCBpdCwgYW5kIGl0IGlzIG5vdCBjaGFuZ2VkIGJ5IGRyYWdnaW5nLlxuICAgIGlmICh0aGlzLndpZHRoU2V0ICYmICF0aGlzLmNvbHVtblJlc2l6ZXIuY29sdW1uUmVzaXplQnkpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRldGVjdFN0cmljdFdpZHRoKCkge1xuICAgIGlmICh0aGlzLmNvbHVtblJlc2l6ZXIuY29sdW1uUmVzaXplQnkpIHtcbiAgICAgIHRoaXMuc3RyaWN0V2lkdGggPSB0aGlzLmNvbHVtblJlc2l6ZXIuY29sdW1uUmVjdFdpZHRoICsgdGhpcy5jb2x1bW5SZXNpemVyLmNvbHVtblJlc2l6ZUJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0cmljdFdpZHRoID0gdGhpcy5kb21BZGFwdGVyLnVzZXJEZWZpbmVkV2lkdGgodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29tcHV0ZVdpZHRoKCk6IG51bWJlciB7XG4gICAgbGV0IHdpZHRoOiBudW1iZXIgPSB0aGlzLnN0cmljdFdpZHRoO1xuICAgIGlmICghd2lkdGgpIHtcbiAgICAgIHdpZHRoID0gdGhpcy5kb21BZGFwdGVyLnNjcm9sbFdpZHRoKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiB3aWR0aDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRXaWR0aCh3aWR0aDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc3RyaWN0V2lkdGgpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtblJlc2l6ZXIuY29sdW1uUmVzaXplQnkpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd3aWR0aCcsIHdpZHRoICsgJ3B4Jyk7XG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXplci5jb2x1bW5SZXNpemVCeSA9IDA7XG4gICAgICAgIHRoaXMud2lkdGhTZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IHNldCB3aWR0aCBpZiB0aGVyZSBpcyBhIHVzZXItZGVmaW5lZCBvbmUuIEp1c3QgYWRkIHRoZSBzdHJpY3Qgd2lkdGggY2xhc3MuXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgU1RSSUNUX1dJRFRIX0NMQVNTKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIFNUUklDVF9XSURUSF9DTEFTUyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd3aWR0aCcsIHdpZHRoICsgJ3B4Jyk7XG4gICAgdGhpcy53aWR0aFNldCA9IHRydWU7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuLypcbiAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgRG9tQWRhcHRlciBpcyBmb3IgdXNlIG9uIG5vbi1icm93c2VyIHBsYXRmb3Jtcywgd2hlcmUgdGhlcmUgYXJlIG5vXG4gKiBuYXRpdmVFbGVtZW50cyB0byB1c2UgZm9yIGNhbGN1bGF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21BZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZG9tLWFkYXB0ZXIvZG9tLWFkYXB0ZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTm9vcERvbUFkYXB0ZXIgaW1wbGVtZW50cyBEb21BZGFwdGVyIHtcbiAgdXNlckRlZmluZWRXaWR0aChlbGVtZW50OiBhbnkpOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgc2Nyb2xsQmFyV2lkdGgoZWxlbWVudDogYW55KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBzY3JvbGxXaWR0aChlbGVtZW50OiBhbnkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbXB1dGVkSGVpZ2h0KGVsZW1lbnQ6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjbGllbnRSZWN0KGVsZW1lbnQ6IGFueSk6IENsaWVudFJlY3Qge1xuICAgIHJldHVybiB7XG4gICAgICB0b3A6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICB9O1xuICB9XG5cbiAgbWluV2lkdGgoZWxlbWVudDogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZvY3VzKGVsZW1lbnQ6IGFueSk6IHZvaWQge31cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2xyRGF0YWdyaWRDb2x1bW4gfSBmcm9tICcuLi9kYXRhZ3JpZC1jb2x1bW4nO1xuaW1wb3J0IHsgRGF0YWdyaWRSZW5kZXJTdGVwIH0gZnJvbSAnLi4vZW51bXMvcmVuZGVyLXN0ZXAuZW51bSc7XG5pbXBvcnQgeyBJdGVtcyB9IGZyb20gJy4uL3Byb3ZpZGVycy9pdGVtcyc7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSAnLi4vcHJvdmlkZXJzL3BhZ2UnO1xuaW1wb3J0IHsgVGFibGVTaXplU2VydmljZSB9IGZyb20gJy4uL3Byb3ZpZGVycy90YWJsZS1zaXplLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBEb21BZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZG9tLWFkYXB0ZXIvZG9tLWFkYXB0ZXInO1xuaW1wb3J0IHsgRGF0YWdyaWRIZWFkZXJSZW5kZXJlciB9IGZyb20gJy4vaGVhZGVyLXJlbmRlcmVyJztcbmltcG9ydCB7IE5vb3BEb21BZGFwdGVyIH0gZnJvbSAnLi9ub29wLWRvbS1hZGFwdGVyJztcbmltcG9ydCB7IERhdGFncmlkUmVuZGVyT3JnYW5pemVyIH0gZnJvbSAnLi9yZW5kZXItb3JnYW5pemVyJztcblxuLy8gRml4ZXMgYnVpbGQgZXJyb3Jcbi8vIEBkeW5hbWljIChodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xOTY5OCNpc3N1ZWNvbW1lbnQtMzM4MzQwMjExKVxuZXhwb3J0IGNvbnN0IGRvbUFkYXB0ZXJGYWN0b3J5ID0gKHBsYXRmb3JtSWQ6IE9iamVjdCkgPT4ge1xuICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCkpIHtcbiAgICByZXR1cm4gbmV3IERvbUFkYXB0ZXIoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IE5vb3BEb21BZGFwdGVyKCk7XG4gIH1cbn07XG5cbi8vIEZpeGVzIGJ1aWxkIGVycm9yXG4vLyBAZHluYW1pYyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTk2OTgjaXNzdWVjb21tZW50LTMzODM0MDIxMSlcbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2Nsci1kYXRhZ3JpZCcsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogRG9tQWRhcHRlciwgdXNlRmFjdG9yeTogZG9tQWRhcHRlckZhY3RvcnksIGRlcHM6IFtQTEFURk9STV9JRF0gfV0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFncmlkTWFpblJlbmRlcmVyPFQgPSBhbnk+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvcmdhbml6ZXI6IERhdGFncmlkUmVuZGVyT3JnYW5pemVyLFxuICAgIHByaXZhdGUgaXRlbXM6IEl0ZW1zLFxuICAgIHByaXZhdGUgcGFnZTogUGFnZSxcbiAgICBwcml2YXRlIGRvbUFkYXB0ZXI6IERvbUFkYXB0ZXIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSB0YWJsZVNpemVTZXJ2aWNlOiBUYWJsZVNpemVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5vcmdhbml6ZXJcbiAgICAgICAgLmZpbHRlclJlbmRlclN0ZXBzKERhdGFncmlkUmVuZGVyU3RlcC5DT01QVVRFX0NPTFVNTl9XSURUSFMpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb21wdXRlSGVhZGVyc1dpZHRoKCkpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5wYWdlLnNpemVDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2hlaWdodFNldCkge1xuICAgICAgICAgIHRoaXMucmVzZXREYXRhZ3JpZEhlaWdodCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5pdGVtcy5jaGFuZ2Uuc3Vic2NyaWJlKCgpID0+ICh0aGlzLnNob3VsZFN0YWJpbGl6ZUNvbHVtbnMgPSB0cnVlKSkpO1xuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihEYXRhZ3JpZEhlYWRlclJlbmRlcmVyKSBwdWJsaWMgaGVhZGVyczogUXVlcnlMaXN0PERhdGFncmlkSGVhZGVyUmVuZGVyZXI+O1xuICBAQ29udGVudENoaWxkcmVuKENsckRhdGFncmlkQ29sdW1uKSBwdWJsaWMgY29sdW1uczogUXVlcnlMaXN0PENsckRhdGFncmlkQ29sdW1uPjtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmhlYWRlcnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBUT0RPOiBvbmx5IHJlLXN0YWJpbGl6ZSBpZiBhIGNvbHVtbiB3YXMgYWRkZWQgb3IgcmVtb3ZlZC4gUmVvcmRlcmluZyBpcyBmaW5lLlxuICAgICAgICB0aGlzLmNvbHVtbnNTaXplc1N0YWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YWJpbGl6ZUNvbHVtbnMoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgYW5kIHNldCBUYWJsZSB3aWR0aCBmb3IgaG9yaXpvbnRhbCBzY3JvbGxpbmcgaGVyZS5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudGFibGVTaXplU2VydmljZS50YWJsZSA9IHRoaXMuZWw7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkU3RhYmlsaXplQ29sdW1ucykge1xuICAgICAgdGhpcy5zdGFiaWxpemVDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZENvbXB1dGVIZWlnaHQoKSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcHV0ZURhdGFncmlkSGVpZ2h0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oZWlnaHRTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHNob3VsZENvbXB1dGVIZWlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9oZWlnaHRTZXQgJiYgdGhpcy5wYWdlLnNpemUgPiAwKSB7XG4gICAgICBpZiAodGhpcy5pdGVtcy5kaXNwbGF5ZWQubGVuZ3RoID09PSB0aGlzLnBhZ2Uuc2l6ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBoZWlnaHQgb2YgdGhlIGRhdGFncmlkLlxuICAgKlxuICAgKiBOT1RFOiBXZSBoYWQgdG8gY2hvb3NlIHRvIHNldCB0aGUgaGVpZ2h0IGluc3RlYWQgb2YgdGhlIG1pbi1oZWlnaHQgYmVjYXVzZVxuICAgKiBJRSAxMSByZXF1aXJlcyB0aGUgaGVpZ2h0IG9uIHRoZSBwYXJlbnQgZm9yIHRoZSBjaGlsZHJlbiBmbGV4IGdyb3cvc2hyaW5rIHByb3BlcnRpZXMgdG8gd29yay5cbiAgICogV2hlbiB3ZSB1c2VkIG1pbi1oZWlnaHQsIDEgMSBhdXRvIGRvZXNuJ3QgdXNlZCB0byB3b3JrIGluIElFMTEgOi0oXG4gICAqIEJ1dCB0aGlzIGRvZXNuJ3QgYWZmZWN0IHRoZSBmaXguIEl0IHdvcmtzIGluIGJvdGggZml4ZWQgJiB2YXJpYWJsZSBoZWlnaHQgZGF0YWdyaWRzLlxuICAgKlxuICAgKiBSZWZlcjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNDM5NjIwNS9mbGV4LWdyb3ctbm90LXdvcmtpbmctaW4taW50ZXJuZXQtZXhwbG9yZXItMTEtMFxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlRGF0YWdyaWRIZWlnaHQoKSB7XG4gICAgLy8gSUUgZG9lc24ndCByZXR1cm4gY29ycmVjdCB2YWx1ZSBmb3IgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFwiaGVpZ2h0XCIpXG4gICAgY29uc3QgdmFsdWU6IG51bWJlciA9IHRoaXMuZG9tQWRhcHRlci5jbGllbnRSZWN0KHRoaXMuZWwubmF0aXZlRWxlbWVudCkuaGVpZ2h0O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnaGVpZ2h0JywgdmFsdWUgKyAncHgnKTtcbiAgICB0aGlzLl9oZWlnaHRTZXQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldERhdGFncmlkSGVpZ2h0KCkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnaGVpZ2h0JywgJycpO1xuICAgIHRoaXMuX2hlaWdodFNldCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgZWFjaCBoZWFkZXIgY29tcHV0ZSBpdHMgd2lkdGguXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVIZWFkZXJzV2lkdGgoKSB7XG4gICAgY29uc3QgbmJDb2x1bW5zOiBudW1iZXIgPSB0aGlzLmhlYWRlcnMubGVuZ3RoO1xuICAgIGxldCBhbGxTdHJpY3QgPSB0cnVlO1xuICAgIHRoaXMuaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGluZGV4KSA9PiB7XG4gICAgICAvLyBPbiB0aGUgbGFzdCBoZWFkZXIgY29sdW1uIGNoZWNrIHdoZXRoZXIgYWxsIGNvbHVtbnMgaGF2ZSBzdHJpY3Qgd2lkdGhzLlxuICAgICAgLy8gSWYgYWxsIGNvbHVtbnMgaGF2ZSBzdHJpY3Qgd2lkdGhzLCByZW1vdmUgdGhlIHN0cmljdCB3aWR0aCBmcm9tIHRoZSBsYXN0IGNvbHVtbiBhbmQgbWFrZSBpdCB0aGUgY29sdW1uJ3NcbiAgICAgIC8vIG1pbmltdW0gd2lkdGggc28gdGhhdCB3aGVuIGFsbCBwcmV2aW91cyBjb2x1bW5zIHNocmluaywgaXQgd2lsbCBnZXQgYSBmbGV4aWJsZSB3aWR0aCBhbmQgY292ZXIgdGhlIGVtcHR5XG4gICAgICAvLyBnYXAgaW4gdGhlIERhdGFncmlkLlxuXG4gICAgICBpZiAoIWhlYWRlci5zdHJpY3RXaWR0aCkge1xuICAgICAgICBhbGxTdHJpY3QgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5iQ29sdW1ucyA9PT0gaW5kZXggKyAxICYmIGFsbFN0cmljdCkge1xuICAgICAgICBkZWxldGUgaGVhZGVyLnN0cmljdFdpZHRoO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9yZ2FuaXplci53aWR0aHNbaW5kZXhdID0geyBweDogaGVhZGVyLmNvbXB1dGVXaWR0aCgpLCBzdHJpY3Q6ICEhaGVhZGVyLnN0cmljdFdpZHRoIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyLCBpbmRleCkgPT4gaGVhZGVyLnNldFdpZHRoKHRoaXMub3JnYW5pemVyLndpZHRoc1tpbmRleF0ucHgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgd2Ugd2FudCB0byByZS1jb21wdXRlIGNvbHVtbnMgd2lkdGguIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuOlxuICAgKiAxKSBXaGVuIGhlYWRlcnMgY2hhbmdlLCB3aXRoIGNvbHVtbnMgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZFxuICAgKiAyKSBXaGVuIHJvd3MgYXJlIGxhemlseSBsb2FkZWQgZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAqL1xuICBwcml2YXRlIGNvbHVtbnNTaXplc1N0YWJsZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc2hvdWxkU3RhYmlsaXplQ29sdW1ucyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgd2hvbGUgcmUtcmVuZHJpbmcgY3ljbGUgdG8gc2V0IGNvbHVtbiBzaXplcywgaWYgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFiaWxpemVDb2x1bW5zKCkge1xuICAgIHRoaXMuc2hvdWxkU3RhYmlsaXplQ29sdW1ucyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNvbHVtbnNTaXplc1N0YWJsZSkge1xuICAgICAgLy8gTm90aGluZyB0byBkby5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVzaXplIHdoZW4gdGhlIHJvd3MgYXJlIGxvYWRlZC5cbiAgICBpZiAodGhpcy5pdGVtcy5kaXNwbGF5ZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5vcmdhbml6ZXIucmVzaXplKCk7XG4gICAgICB0aGlzLmNvbHVtbnNTaXplc1N0YWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb250ZW50Q2hpbGRyZW4sIERpcmVjdGl2ZSwgT25EZXN0cm95LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBEYXRhZ3JpZFJlbmRlclN0ZXAgfSBmcm9tICcuLi9lbnVtcy9yZW5kZXItc3RlcC5lbnVtJztcblxuaW1wb3J0IHsgRGF0YWdyaWRDZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NlbGwtcmVuZGVyZXInO1xuaW1wb3J0IHsgRGF0YWdyaWRSZW5kZXJPcmdhbml6ZXIgfSBmcm9tICcuL3JlbmRlci1vcmdhbml6ZXInO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdjbHItZGctcm93LCBjbHItZGctcm93LWRldGFpbCcgfSlcbmV4cG9ydCBjbGFzcyBEYXRhZ3JpZFJvd1JlbmRlcmVyIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvcmdhbml6ZXI6IERhdGFncmlkUmVuZGVyT3JnYW5pemVyKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBvcmdhbml6ZXIuZmlsdGVyUmVuZGVyU3RlcHMoRGF0YWdyaWRSZW5kZXJTdGVwLkFMSUdOX0NPTFVNTlMpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNldFdpZHRocygpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKERhdGFncmlkQ2VsbFJlbmRlcmVyKSBjZWxsczogUXVlcnlMaXN0PERhdGFncmlkQ2VsbFJlbmRlcmVyPjtcblxuICBwcml2YXRlIHNldFdpZHRocygpIHtcbiAgICBpZiAodGhpcy5vcmdhbml6ZXIud2lkdGhzLmxlbmd0aCAhPT0gdGhpcy5jZWxscy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jZWxscy5mb3JFYWNoKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm9yZ2FuaXplci53aWR0aHNbaW5kZXhdO1xuICAgICAgY2VsbC5zZXRXaWR0aCh3aWR0aC5zdHJpY3QsIHdpZHRoLnB4KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmNlbGxzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0V2lkdGhzKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXRXaWR0aHMoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDbHJGb3Jtc01vZHVsZSB9IGZyb20gJy4uLy4uL2Zvcm1zL2Zvcm1zLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb21tb25Qb3BvdmVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vcG9wb3Zlci9jb21tb24vcG9wb3Zlci5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xySWZFeHBhbmRNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9leHBhbmQvaWYtZXhwYW5kLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJMb2FkaW5nTW9kdWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9hZGluZy9sb2FkaW5nLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJPdXRzaWRlQ2xpY2tNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9vdXRzaWRlLWNsaWNrL291dHNpZGUtY2xpY2subW9kdWxlJztcblxuaW1wb3J0IHsgRGF0YWdyaWRSb3dFeHBhbmRBbmltYXRpb24gfSBmcm9tICcuL2FuaW1hdGlvbi1oYWNrL3Jvdy1leHBhbmQtYW5pbWF0aW9uJztcbmltcG9ydCB7IERhdGFncmlkU3RyaW5nRmlsdGVyIH0gZnJvbSAnLi9idWlsdC1pbi9maWx0ZXJzL2RhdGFncmlkLXN0cmluZy1maWx0ZXInO1xuaW1wb3J0IHsgQWN0aW9uYWJsZU9vbXBhTG9vbXBhIH0gZnJvbSAnLi9jaG9jb2xhdGUvYWN0aW9uYWJsZS1vb21wYS1sb29tcGEnO1xuaW1wb3J0IHsgRGF0YWdyaWRXaWxseVdvbmthIH0gZnJvbSAnLi9jaG9jb2xhdGUvZGF0YWdyaWQtd2lsbHktd29ua2EnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZU9vbXBhTG9vbXBhIH0gZnJvbSAnLi9jaG9jb2xhdGUvZXhwYW5kYWJsZS1vb21wYS1sb29tcGEnO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWQgfSBmcm9tICcuL2RhdGFncmlkJztcbmltcG9ydCB7IENsckRhdGFncmlkQWN0aW9uQmFyIH0gZnJvbSAnLi9kYXRhZ3JpZC1hY3Rpb24tYmFyJztcbmltcG9ydCB7IENsckRhdGFncmlkQWN0aW9uT3ZlcmZsb3cgfSBmcm9tICcuL2RhdGFncmlkLWFjdGlvbi1vdmVyZmxvdyc7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENlbGwgfSBmcm9tICcuL2RhdGFncmlkLWNlbGwnO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRDb2x1bW4gfSBmcm9tICcuL2RhdGFncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENvbHVtblRvZ2dsZSB9IGZyb20gJy4vZGF0YWdyaWQtY29sdW1uLXRvZ2dsZSc7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZENvbHVtblRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vZGF0YWdyaWQtY29sdW1uLXRvZ2dsZS1idXR0b24nO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRDb2x1bW5Ub2dnbGVUaXRsZSB9IGZyb20gJy4vZGF0YWdyaWQtY29sdW1uLXRvZ2dsZS10aXRsZSc7XG5pbXBvcnQgeyBEYXRhZ3JpZERldGFpbFJlZ2lzdGVyZXIgfSBmcm9tICcuL2RhdGFncmlkLWRldGFpbC1yZWdpc3RlcmVyJztcbmltcG9ydCB7IENsckRhdGFncmlkRmlsdGVyIH0gZnJvbSAnLi9kYXRhZ3JpZC1maWx0ZXInO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRGb290ZXIgfSBmcm9tICcuL2RhdGFncmlkLWZvb3Rlcic7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uIH0gZnJvbSAnLi9kYXRhZ3JpZC1oaWRlYWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRJdGVtcyB9IGZyb20gJy4vZGF0YWdyaWQtaXRlbXMnO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRJdGVtc1RyYWNrQnkgfSBmcm9tICcuL2RhdGFncmlkLWl0ZW1zLXRyYWNrYnknO1xuaW1wb3J0IHsgQ2xyRGF0YWdyaWRQYWdpbmF0aW9uIH0gZnJvbSAnLi9kYXRhZ3JpZC1wYWdpbmF0aW9uJztcbmltcG9ydCB7IENsckRhdGFncmlkUGFnZVNpemUgfSBmcm9tICcuL2RhdGFncmlkLXBhZ2Utc2l6ZSc7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZFBsYWNlaG9sZGVyIH0gZnJvbSAnLi9kYXRhZ3JpZC1wbGFjZWhvbGRlcic7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZFJvdyB9IGZyb20gJy4vZGF0YWdyaWQtcm93JztcbmltcG9ydCB7IENsckRhdGFncmlkUm93RGV0YWlsIH0gZnJvbSAnLi9kYXRhZ3JpZC1yb3ctZGV0YWlsJztcbmltcG9ydCB7IERhdGFncmlkQ2VsbFJlbmRlcmVyIH0gZnJvbSAnLi9yZW5kZXIvY2VsbC1yZW5kZXJlcic7XG5pbXBvcnQgeyBEYXRhZ3JpZENvbHVtblJlc2l6ZXIgfSBmcm9tICcuL3JlbmRlci9jb2x1bW4tcmVzaXplcic7XG5pbXBvcnQgeyBEYXRhZ3JpZEhlYWRlclJlbmRlcmVyIH0gZnJvbSAnLi9yZW5kZXIvaGVhZGVyLXJlbmRlcmVyJztcbmltcG9ydCB7IERhdGFncmlkTWFpblJlbmRlcmVyIH0gZnJvbSAnLi9yZW5kZXIvbWFpbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBEYXRhZ3JpZFJvd1JlbmRlcmVyIH0gZnJvbSAnLi9yZW5kZXIvcm93LXJlbmRlcmVyJztcbmltcG9ydCB7IFdyYXBwZWRDZWxsIH0gZnJvbSAnLi93cmFwcGVkLWNlbGwnO1xuaW1wb3J0IHsgV3JhcHBlZENvbHVtbiB9IGZyb20gJy4vd3JhcHBlZC1jb2x1bW4nO1xuaW1wb3J0IHsgV3JhcHBlZFJvdyB9IGZyb20gJy4vd3JhcHBlZC1yb3cnO1xuXG5leHBvcnQgY29uc3QgQ0xSX0RBVEFHUklEX0RJUkVDVElWRVM6IFR5cGU8YW55PltdID0gW1xuICAvLyBDb3JlXG4gIENsckRhdGFncmlkLFxuICBDbHJEYXRhZ3JpZEFjdGlvbkJhcixcbiAgQ2xyRGF0YWdyaWRBY3Rpb25PdmVyZmxvdyxcbiAgQ2xyRGF0YWdyaWRDb2x1bW4sXG4gIENsckRhdGFncmlkQ29sdW1uVG9nZ2xlLFxuICBDbHJEYXRhZ3JpZEhpZGVhYmxlQ29sdW1uLFxuICBDbHJEYXRhZ3JpZEZpbHRlcixcbiAgQ2xyRGF0YWdyaWRJdGVtcyxcbiAgQ2xyRGF0YWdyaWRJdGVtc1RyYWNrQnksXG4gIENsckRhdGFncmlkUm93LFxuICBDbHJEYXRhZ3JpZFJvd0RldGFpbCxcbiAgRGF0YWdyaWREZXRhaWxSZWdpc3RlcmVyLFxuICBDbHJEYXRhZ3JpZENlbGwsXG4gIENsckRhdGFncmlkRm9vdGVyLFxuICBDbHJEYXRhZ3JpZFBhZ2luYXRpb24sXG4gIENsckRhdGFncmlkUGFnZVNpemUsXG4gIENsckRhdGFncmlkUGxhY2Vob2xkZXIsXG4gIENsckRhdGFncmlkQ29sdW1uVG9nZ2xlQnV0dG9uLFxuICBDbHJEYXRhZ3JpZENvbHVtblRvZ2dsZVRpdGxlLFxuICBXcmFwcGVkQ2VsbCxcbiAgV3JhcHBlZENvbHVtbixcbiAgV3JhcHBlZFJvdyxcblxuICAvLyBSZW5kZXJlcnNcbiAgRGF0YWdyaWRNYWluUmVuZGVyZXIsXG4gIERhdGFncmlkSGVhZGVyUmVuZGVyZXIsXG4gIERhdGFncmlkQ29sdW1uUmVzaXplcixcbiAgRGF0YWdyaWRSb3dSZW5kZXJlcixcbiAgRGF0YWdyaWRDZWxsUmVuZGVyZXIsXG5cbiAgLy8gQ2hvY29sYXRlXG4gIERhdGFncmlkV2lsbHlXb25rYSxcbiAgQWN0aW9uYWJsZU9vbXBhTG9vbXBhLFxuICBFeHBhbmRhYmxlT29tcGFMb29tcGEsXG5cbiAgLy8gQW5pbWF0aW9uIGhhY2tcbiAgRGF0YWdyaWRSb3dFeHBhbmRBbmltYXRpb24sXG5cbiAgLy8gQnVpbHQtaW4gc2hvcnRjdXRzXG4gIERhdGFncmlkU3RyaW5nRmlsdGVyLFxuXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDbHJJY29uTW9kdWxlLFxuICAgIENsckZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENsckNvbW1vblBvcG92ZXJNb2R1bGUsXG4gICAgQ2xyTG9hZGluZ01vZHVsZSxcbiAgICBDbHJPdXRzaWRlQ2xpY2tNb2R1bGUsXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9EQVRBR1JJRF9ESVJFQ1RJVkVTXSxcbiAgZXhwb3J0czogW0NMUl9EQVRBR1JJRF9ESVJFQ1RJVkVTLCBDbHJJZkV4cGFuZE1vZHVsZV0sXG4gIGVudHJ5Q29tcG9uZW50czogW1dyYXBwZWRDZWxsLCBXcmFwcGVkQ29sdW1uLCBXcmFwcGVkUm93XSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRGF0YWdyaWRNb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXN0YWNrLWJsb2NrJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZHQgY2xhc3M9XCJzdGFjay1ibG9jay1sYWJlbFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVFeHBhbmQoKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJ0b2dnbGVFeHBhbmQoKVwiXG4gICAgICAgIChrZXl1cC5zcGFjZSk9XCJ0b2dnbGVFeHBhbmQoKVwiXG4gICAgICAgIChmb2N1cyk9XCJmb2N1c2VkID0gdHJ1ZVwiXG4gICAgICAgIChibHVyKT1cImZvY3VzZWQgPSBmYWxzZVwiXG4gICAgICAgIFthdHRyLnJvbGVdPVwicm9sZVwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRhYkluZGV4XCJcbiAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJhcmlhRXhwYW5kZWRcIj5cbiAgICAgIDxjbHItaWNvbiBzaGFwZT1cImNhcmV0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInN0YWNrLWJsb2NrLWNhcmV0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImV4cGFuZGFibGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRpcl09XCJjYXJldERpcmVjdGlvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY2FyZXRUaXRsZVwiPjwvY2xyLWljb24+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItc3RhY2stbGFiZWxcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kdD5cbiAgICA8ZGQgY2xhc3M9XCJzdGFjay1ibG9jay1jb250ZW50XCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kZD5cbiAgICA8IS0tIEZJWE1FOiByZW1vdmUgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiB3aGVuIGJvb2xlYW4gc3RhdGVzIGFyZSBzdXBwb3J0ZWQgLS0+XG4gICAgPGRpdiBbQGNvbGxhcHNlXT1cIicnKyFleHBhbmRlZFwiIGNsYXNzPVwic3RhY2stY2hpbGRyZW5cIiA+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItc3RhY2stYmxvY2tcIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGAsXG4gIC8vIEN1c3RvbSBlbGVtZW50cyBhcmUgaW5saW5lIGJ5IGRlZmF1bHRcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgICA6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gICAgYCxcbiAgXSxcbiAgLy8gTWFrZSBzdXJlIHRoZSBob3N0IGhhcyB0aGUgcHJvcGVyIGNsYXNzIGZvciBzdHlsaW5nIHB1cnBvc2VzXG4gIGhvc3Q6IHsgJ1tjbGFzcy5zdGFjay1ibG9ja10nOiAndHJ1ZScgfSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2NvbGxhcHNlJywgW1xuICAgICAgc3RhdGUoJ3RydWUnLCBzdHlsZSh7IGhlaWdodDogMCwgZGlzcGxheTogJ25vbmUnIH0pKSxcbiAgICAgIHRyYW5zaXRpb24oJ3RydWUgPT4gZmFsc2UnLCBbYW5pbWF0ZSgnMC4ycyBlYXNlLWluLW91dCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicsIGRpc3BsYXk6ICcqJyB9KSldKSxcbiAgICAgIHRyYW5zaXRpb24oJ2ZhbHNlID0+IHRydWUnLCBbc3R5bGUoeyBoZWlnaHQ6ICcqJywgZGlzcGxheTogJyonIH0pLCBhbmltYXRlKCcwLjJzIGVhc2UtaW4tb3V0JyldKSxcbiAgICBdKSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyU3RhY2tCbG9jayBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3RhY2stYmxvY2stZXhwYW5kZWQnKVxuICBASW5wdXQoJ2NsclNiRXhwYW5kZWQnKVxuICBleHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCdjbHJTYkV4cGFuZGVkQ2hhbmdlJykgZXhwYW5kZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN0YWNrLWJsb2NrLWV4cGFuZGFibGUnKVxuICBASW5wdXQoJ2NsclNiRXhwYW5kYWJsZScpXG4gIGV4cGFuZGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2NoYW5nZWRDaGlsZHJlbjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZnVsbHlJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9jaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zdGFjay1ibG9jay1jaGFuZ2VkJylcbiAgZ2V0IGdldENoYW5nZWRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCB8fCAodGhpcy5fY2hhbmdlZENoaWxkcmVuID4gMCAmJiAhdGhpcy5leHBhbmRlZCk7XG4gIH1cblxuICBASW5wdXQoJ2NsclNiTm90aWZ5Q2hhbmdlJylcbiAgc2V0IHNldENoYW5nZWRWYWx1ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NoYW5nZWQgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLl9mdWxseUluaXRpYWxpemVkKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQuX2NoYW5nZWRDaGlsZHJlbisrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYXJlbnQuX2NoYW5nZWRDaGlsZHJlbi0tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAgICogVGhpcyB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB3aXRoIEBDb250ZW50Q2hpbGRyZW4sIHdpdGggdGhlIHBhcmVudCBDbHJTdGFja0Jsb2NrXG4gICAgICogcXVlcnlpbmcgZm9yIGNoaWxkcmVuIFN0YWNrQmxvY2tzLCBidXQgdGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgd2hlbiBkb3duZ3JhZGluZ1xuICAgICAqIHRoZSBjb21wb25lbnQgZm9yIEFuZ3VsYXIgMS5cbiAgICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgQFNraXBTZWxmKClcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByaXZhdGUgcGFyZW50OiBDbHJTdGFja0Jsb2NrLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzXG4gICkge1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5hZGRDaGlsZCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgcGFyZW50IENsclN0YWNrQmxvY2sncyBwcm9wZXJ0aWVzLFxuICAgIC8vIHRoZSBjaGlsZCBDbHJTdGFja0Jsb2NrICBoYXMgdG8gYmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXQgZmlyc3QuXG4gICAgdGhpcy5fZnVsbHlJbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBhZGRDaGlsZCgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGFibGUgPSB0cnVlO1xuICB9XG5cbiAgdG9nZ2xlRXhwYW5kKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdCh0aGlzLmV4cGFuZGVkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY2FyZXREaXJlY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZCA/ICdkb3duJyA6ICdyaWdodCc7XG4gIH1cblxuICBnZXQgY2FyZXRUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkID8gdGhpcy5jb21tb25TdHJpbmdzLmNvbGxhcHNlIDogdGhpcy5jb21tb25TdHJpbmdzLmV4cGFuZDtcbiAgfVxuXG4gIGdldCByb2xlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kYWJsZSA/ICdidXR0b24nIDogbnVsbDtcbiAgfVxuXG4gIGdldCB0YWJJbmRleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGFibGUgPyAnMCcgOiBudWxsO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5vbi1mb2N1cycpXG4gIGdldCBvblN0YWNrTGFiZWxGb2N1cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlICYmICF0aGlzLmV4cGFuZGVkICYmIHRoaXMuZm9jdXNlZDtcbiAgfVxuXG4gIGdldCBhcmlhRXhwYW5kZWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZXhwYW5kYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmV4cGFuZGVkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXN0YWNrLXZpZXcnLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjbHItc3RhY2staGVhZGVyXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8ZGwgY2xhc3M9XCJzdGFjay12aWV3XCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGw+XG4gICAgYCxcbiAgLy8gQ3VzdG9tIGVsZW1lbnRzIGFyZSBpbmxpbmUgYnkgZGVmYXVsdC5cbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgICA6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyU3RhY2tWaWV3IHtcbiAgLyoqXG4gICAqIFVuZG9jdW1lbnRlZCBleHBlcmltZW50YWwgZmVhdHVyZTogaW5saW5lIGVkaXRpbmcuXG4gICAqL1xuICBlZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ2NsclN0YWNrU2F2ZScpIHNhdmU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oZmFsc2UpO1xuXG4gIHByaXZhdGUgX2VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZWRpdGluZ0NoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG5cbiAgZ2V0IGVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgdGhpcy5fZWRpdE1vZGU7XG4gIH1cblxuICBzZXQgZWRpdGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICB0aGlzLl9lZGl0TW9kZSA9IHZhbHVlO1xuICAgICAgdGhpcy5lZGl0aW5nQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB0aGlzLnNhdmUuZW1pdChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEVuZCBvZiB1bmRvY3VtZW50ZWQgZXhwZXJpbWVudGFsIGZlYXR1cmUuXG4gICAqL1xufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbHJTdGFja1ZpZXcgfSBmcm9tICcuL3N0YWNrLXZpZXcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItc3RhY2staGVhZGVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGg0IGNsYXNzPVwic3RhY2staGVhZGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YWNrLXRpdGxlXCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50Pjwvc3Bhbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGFjay1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLnN0YWNrLWFjdGlvblwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICA8IS0tIFVuZG9jdW1lbnRlZCBleHBlcmltZW50YWwgZmVhdHVyZTogaW5saW5lIGVkaXRpbmcuIC0tPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzdGFja1ZpZXcuZWRpdGFibGVcIiBjbGFzcz1cInN0YWNrLWFjdGlvbiBidG4gYnRuLXNtIGJ0bi1saW5rXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RhY2tWaWV3LmVkaXRpbmcgPSAhc3RhY2tWaWV3LmVkaXRpbmdcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPCEtLSBFbmQgb2YgdW5kb2N1bWVudGVkIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiAtLT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9oND5cbiAgICBgLFxuICAvLyBDdXN0b20gZWxlbWVudHMgYXJlIGlubGluZSBieSBkZWZhdWx0XG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENsclN0YWNrSGVhZGVyIHtcbiAgY29uc3RydWN0b3IocHVibGljIHN0YWNrVmlldzogQ2xyU3RhY2tWaWV3KSB7fVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuLyoqXG4gKiBVbmRvY3VtZW50ZWQgZXhwZXJpbWVudGFsIGZlYXR1cmU6IGlubGluZSBlZGl0aW5nLlxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xyU3RhY2tWaWV3IH0gZnJvbSAnLi9zdGFjay12aWV3JztcblxuZXhwb3J0IGNsYXNzIFN0YWNrQ29udHJvbCB7XG4gIG1vZGVsOiBhbnk7XG4gIG1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN0YWNrVmlldzogQ2xyU3RhY2tWaWV3KSB7XG4gICAgLy8gTWFrZSB0aGUgQ2xyU3RhY2tWaWV3IGVkaXRhYmxlLCBzaW5jZSBpdCBjb250YWlucyBhIFN0YWNrQ29udHJvbFxuICAgIHRoaXMuc3RhY2tWaWV3LmVkaXRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnN0YWNrVmlldy5lZGl0aW5nQ2hhbmdlLnN1YnNjcmliZSgoZWRpdGluZzogYm9vbGVhbikgPT4ge1xuICAgICAgLy8gRWRpdCBtb2RlIHdhcyBjbG9zZWRcbiAgICAgIGlmICghZWRpdGluZykge1xuICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodGhpcy5tb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbi8qKlxuICogVW5kb2N1bWVudGVkIGV4cGVyaW1lbnRhbCBmZWF0dXJlOiBpbmxpbmUgZWRpdGluZy5cbiAqXG4gKiBUT0RPOiBzdXBwb3J0IG1vcmUgdHlwZXMgb2YgaW5wdXRzOiBjaGVja2JveCwgcmFkaW8sIC4uLlxuICogVE9ETzogTWlycm9yIGlucHV0IGF0dHJpYnV0ZXMgZnJvbSB0aGUgaG9zdCB0byB0aGUgYWN0dWFsIGlucHV0OiBzaXplLCBtaW4sIG1heCwgcGxhY2Vob2xkZXIsIC4uLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RhY2tDb250cm9sIH0gZnJvbSAnLi9zdGFjay1jb250cm9sJztcbmltcG9ydCB7IENsclN0YWNrVmlldyB9IGZyb20gJy4vc3RhY2stdmlldyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1zdGFjay1pbnB1dCcsXG4gIGlucHV0czogWydtb2RlbDogY2xyTW9kZWwnLCAndHlwZSddLFxuICBvdXRwdXRzOiBbJ21vZGVsQ2hhbmdlOiBjbHJNb2RlbENoYW5nZSddLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFzdGFja1ZpZXcuZWRpdGluZ1wiPnt7bW9kZWx9fTwvc3Bhbj5cbiAgICAgICAgPGlucHV0IFt0eXBlXT1cInR5cGVcIiAqbmdJZj1cInN0YWNrVmlldy5lZGl0aW5nXCIgWyhuZ01vZGVsKV09XCJtb2RlbFwiLz5cbiAgICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJTdGFja0lucHV0IGV4dGVuZHMgU3RhY2tDb250cm9sIHtcbiAgdHlwZTogc3RyaW5nID0gJ3RleHQnO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdGFja1ZpZXc6IENsclN0YWNrVmlldykge1xuICAgIHN1cGVyKHN0YWNrVmlldyk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbi8qKlxuICogVW5kb2N1bWVudGVkIGV4cGVyaW1lbnRhbCBmZWF0dXJlOiBpbmxpbmUgZWRpdGluZy5cbiAqXG4gKiBUT0RPOiBPZmZlciBhIGEgd2F5IHRvIGN1c3RvbWl6ZSB0aGUgdmFsdWUgZGlzcGxheWVkLCBwbGFpbiB2YWx1ZSBtYXkgYmUgdW5yZWFkYWJsZS5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0YWNrQ29udHJvbCB9IGZyb20gJy4vc3RhY2stY29udHJvbCc7XG5pbXBvcnQgeyBDbHJTdGFja1ZpZXcgfSBmcm9tICcuL3N0YWNrLXZpZXcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItc3RhY2stc2VsZWN0JyxcbiAgaW5wdXRzOiBbJ21vZGVsOiBjbHJNb2RlbCddLFxuICBvdXRwdXRzOiBbJ21vZGVsQ2hhbmdlOiBjbHJNb2RlbENoYW5nZSddLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFzdGFja1ZpZXcuZWRpdGluZ1wiPnt7bW9kZWx9fTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdFwiICpuZ0lmPVwic3RhY2tWaWV3LmVkaXRpbmdcIiA+XG4gICAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwibW9kZWxcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyU3RhY2tTZWxlY3QgZXh0ZW5kcyBTdGFja0NvbnRyb2wge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3RhY2tWaWV3OiBDbHJTdGFja1ZpZXcpIHtcbiAgICBzdXBlcihzdGFja1ZpZXcpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnY2xyLXN0YWNrLWxhYmVsLCBjbHItc3RhY2stY29udGVudCcgfSlcbmV4cG9ydCBjbGFzcyBDbHJTdGFja1ZpZXdDdXN0b21UYWdzIHtcbiAgLy8gTm8gYmVoYXZpb3JcbiAgLy8gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBcImRlY2xhcmVcIiB0aGUgdGFnIGluIEFuZ3VsYXJcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQ2xyU3RhY2tCbG9jayB9IGZyb20gJy4vc3RhY2stYmxvY2snO1xuaW1wb3J0IHsgQ2xyU3RhY2tIZWFkZXIgfSBmcm9tICcuL3N0YWNrLWhlYWRlcic7XG5pbXBvcnQgeyBDbHJTdGFja0lucHV0IH0gZnJvbSAnLi9zdGFjay1pbnB1dCc7XG5pbXBvcnQgeyBDbHJTdGFja1NlbGVjdCB9IGZyb20gJy4vc3RhY2stc2VsZWN0JztcbmltcG9ydCB7IENsclN0YWNrVmlldyB9IGZyb20gJy4vc3RhY2stdmlldyc7XG5pbXBvcnQgeyBDbHJTdGFja1ZpZXdDdXN0b21UYWdzIH0gZnJvbSAnLi9zdGFjay12aWV3LWN1c3RvbS10YWdzJztcbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9pY29uL2ljb24ubW9kdWxlJztcblxuZXhwb3J0IGNvbnN0IENMUl9TVEFDS19WSUVXX0RJUkVDVElWRVM6IFR5cGU8YW55PltdID0gW1xuICBDbHJTdGFja1ZpZXcsXG4gIENsclN0YWNrSGVhZGVyLFxuICBDbHJTdGFja0Jsb2NrLFxuICBDbHJTdGFja1ZpZXdDdXN0b21UYWdzLFxuICAvKipcbiAgICogVW5kb2N1bWVudGVkIGV4cGVyaW1lbnRhbCBmZWF0dXJlOiBpbmxpbmUgZWRpdGluZy5cbiAgICovXG4gIENsclN0YWNrSW5wdXQsXG4gIENsclN0YWNrU2VsZWN0LFxuICAvKipcbiAgICogRW5kIG9mIHVuZG9jdW1lbnRlZCBleHBlcmltZW50YWwgZmVhdHVyZS5cbiAgICovXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ2xySWNvbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9TVEFDS19WSUVXX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX1NUQUNLX1ZJRVdfRElSRUNUSVZFU10sXG59KVxuZXhwb3J0IGNsYXNzIENsclN0YWNrVmlld01vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5sZXQgTkJfSU5TVEFOQ0VTID0gMDtcblxuZXhwb3J0IGNvbnN0IFVOSVFVRV9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdVTklRVUVfSUQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUlkRmFjdG9yeSgpIHtcbiAgcmV0dXJuICdjbHItaWQtJyArIE5CX0lOU1RBTkNFUysrO1xufVxuXG5leHBvcnQgY29uc3QgVU5JUVVFX0lEX1BST1ZJREVSID0ge1xuICBwcm92aWRlOiBVTklRVUVfSUQsXG4gIHVzZUZhY3Rvcnk6IHVuaXF1ZUlkRmFjdG9yeSxcbn07XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbi8vIFRPRE86IEknZCBsaWtlIHRoaXMgdG8gYmUgYSBDaGVja2VkU3RhdGUgZW51bSBmb3IgdGhlIGNoZWNrYm94ZXMgaW4gdGhlIGZ1dHVyZS5cbmV4cG9ydCBlbnVtIENsclNlbGVjdGVkU3RhdGUge1xuICAvLyBXQVJOSU5HISBVbnNlbGVjdGVkIGhhcyB0aGUgdmFsdWUgMCxcbiAgLy8gc28gaXQncyBhY3R1YWxseSB0aGUgb25seSBvbmUgdGhhdCB3aWxsIGV2YWx1YXRlIHRvIGZhbHNlIGlmIGNhc3QgdG8gYSBib29sZWFuLlxuICAvLyBEb24ndCBtZXNzIHdpdGggdGhlIG9yZGVyIVxuICBVTlNFTEVDVEVEID0gMCxcbiAgU0VMRUNURUQsXG4gIElOREVURVJNSU5BVEUsXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENsclNlbGVjdGVkU3RhdGUgfSBmcm9tICcuL3NlbGVjdGVkLXN0YXRlLmVudW0nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmVlTm9kZU1vZGVsPFQ+IHtcbiAgc2VsZWN0ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENsclNlbGVjdGVkU3RhdGU+KENsclNlbGVjdGVkU3RhdGUuVU5TRUxFQ1RFRCk7XG4gIG1vZGVsOiBUIHwgbnVsbDtcbiAgLypcbiAgICogSWRlYWxseSwgSSB3b3VsZCBsaWtlIHRvIHVzZSBhIHBvbHltb3JwaGljIHRoaXMgdHlwZSBoZXJlIHRvIGVuc3VyZSBob21vZ2VuZWl0eSBvZiB0aGUgdHJlZSwgc29tZXRoaW5nIGxpa2U6XG4gICAqIGFic3RyYWN0IHBhcmVudDogdGhpczxUPiB8IG51bGw7XG4gICAqIGFic3RyYWN0IGNoaWxkcmVuOiB0aGlzPFQ+W107XG4gICAqIEJ1dCBJJ20gaGl0dGluZyBsaW1pdGF0aW9ucyBvbiB0eXBlc2NyaXB0IG5vdCBhbGxvd2luZyB0aGF0IHR5cGUgaW4gY29uc3RydWN0b3JzIG9yIHN0YXRpYyBtZXRob2RzLlxuICAgKiBTbyBJJ20gcmVzb3J0aW5nIHRvIGZvcmNpbmcgb3ZlcnJpZGUgd2l0aCBtb3JlIHByZWNpc2UgdHlwZXMgYnkgbWFya2luZyB0aGVzZSBhYnN0cmFjdC5cbiAgICovXG4gIGFic3RyYWN0IHBhcmVudDogVHJlZU5vZGVNb2RlbDxUPiB8IG51bGw7XG4gIGFic3RyYWN0IGNoaWxkcmVuOiBUcmVlTm9kZU1vZGVsPFQ+W107XG5cbiAgLypcbiAgICogQmVpbmcgYWJsZSB0byBwdXNoIHRoaXMgZG93biB0byB0aGUgUmVjdXJzaXZlVHJlZU5vZGVNb2RlbCB3b3VsZCByZXF1aXJlIHRvbyBtdWNoIHdvcmsgb24gdGhlIGFuZ3VsYXIgY29tcG9uZW50c1xuICAgKiByaWdodCBub3cgZm9yIHRoZW0gdG8ga25vdyB3aGljaCBraW5kIG9mIG1vZGVsIHRoZXkgYXJlIHVzaW5nLiBTbyBJJ20gbGlmdGluZyB0aGUgcHVibGljIHByb3BlcnRpZXMgdG8gdGhpc1xuICAgKiBhYnN0cmFjdCBwYXJlbnQgY2xhc3MgZm9yIG5vdyBhbmQgd2UgY2FuIHJldmlzaXQgaXQgbGF0ZXIsIHdoZW4gd2UncmUgbm90IGZhY2luZyBzdWNoIGEgY2xvc2UgZGVhZGxpbmUuXG4gICAqL1xuICBsb2FkaW5nID0gZmFsc2U7XG5cbiAgZGVzdHJveSgpIHtcbiAgICAvLyBKdXN0IHRvIGJlIHNhZmVcbiAgICB0aGlzLnNlbGVjdGVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyBQcm9wYWdhdGUgYnkgZGVmYXVsdCB3aGVuIGVhZ2VyLCBkb24ndCBwcm9wYWdhdGUgaW4gdGhlIGxhenktbG9hZGVkIHRyZWUuXG4gIHNldFNlbGVjdGVkKHN0YXRlOiBDbHJTZWxlY3RlZFN0YXRlLCBwcm9wYWdhdGVVcDogYm9vbGVhbiwgcHJvcGFnYXRlRG93bjogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSA9PT0gdGhpcy5zZWxlY3RlZC52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkLm5leHQoc3RhdGUpO1xuICAgIGlmIChwcm9wYWdhdGVEb3duICYmIHN0YXRlICE9PSBDbHJTZWxlY3RlZFN0YXRlLklOREVURVJNSU5BVEUgJiYgdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnNldFNlbGVjdGVkKHN0YXRlLCBmYWxzZSwgdHJ1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJvcGFnYXRlVXAgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50Ll91cGRhdGVTZWxlY3Rpb25Gcm9tQ2hpbGRyZW4oKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTZWxlY3Rpb24ocHJvcGFnYXRlOiBib29sZWFuKSB7XG4gICAgLy8gQm90aCB1bnNlbGVjdGVkIGFuZCBpbmRldGVybWluYXRlIHRvZ2dsZSB0byBzZWxlY3RlZFxuICAgIGNvbnN0IG5ld1N0YXRlID1cbiAgICAgIHRoaXMuc2VsZWN0ZWQudmFsdWUgPT09IENsclNlbGVjdGVkU3RhdGUuU0VMRUNURUQgPyBDbHJTZWxlY3RlZFN0YXRlLlVOU0VMRUNURUQgOiBDbHJTZWxlY3RlZFN0YXRlLlNFTEVDVEVEO1xuICAgIC8vIE5PVEU6IHdlIGFsd2F5cyBwcm9wYWdhdGUgc2VsZWN0aW9uIHVwIGluIHRoaXMgbWV0aG9kIGJlY2F1c2UgaXQgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgdXNlciB0YWtlcyBhbiBhY3Rpb24uXG4gICAgLy8gSXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tIGxpZmVjeWNsZSBob29rcyBvciBhcHAtcHJvdmlkZWQgaW5wdXRzLlxuICAgIHRoaXMuc2V0U2VsZWN0ZWQobmV3U3RhdGUsIHRydWUsIHByb3BhZ2F0ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVTZWxlY3Rpb25TdGF0ZUZyb21DaGlsZHJlbigpIHtcbiAgICBsZXQgb25lU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBsZXQgb25lVW5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIC8vIFVzaW5nIGEgZ29vZCBvbGQgZm9yIGxvb3AgdG8gZXhpdCBhcyBzb29uIGFzIHdlIGNhbiB0ZWxsLCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIGxhcmdlIHRyZWVzLlxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgc3dpdGNoIChjaGlsZC5zZWxlY3RlZC52YWx1ZSkge1xuICAgICAgICBjYXNlIENsclNlbGVjdGVkU3RhdGUuSU5ERVRFUk1JTkFURTpcbiAgICAgICAgICByZXR1cm4gQ2xyU2VsZWN0ZWRTdGF0ZS5JTkRFVEVSTUlOQVRFO1xuICAgICAgICBjYXNlIENsclNlbGVjdGVkU3RhdGUuU0VMRUNURUQ6XG4gICAgICAgICAgb25lU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChvbmVVbnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gQ2xyU2VsZWN0ZWRTdGF0ZS5JTkRFVEVSTUlOQVRFO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDbHJTZWxlY3RlZFN0YXRlLlVOU0VMRUNURUQ6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gRGVmYXVsdCBpcyB0aGUgc2FtZSBhcyB1bnNlbGVjdGVkLCBpbiBjYXNlIGFuIHVuZGVmaW5lZCBzb21laG93IG1hZGUgaXQgYWxsIHRoZSB3YXkgaGVyZS5cbiAgICAgICAgICBvbmVVbnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAob25lU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBDbHJTZWxlY3RlZFN0YXRlLklOREVURVJNSU5BVEU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW9uZVNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gQ2xyU2VsZWN0ZWRTdGF0ZS5VTlNFTEVDVEVEO1xuICAgIH0gZWxzZSBpZiAoIW9uZVVuc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiBDbHJTZWxlY3RlZFN0YXRlLlNFTEVDVEVEO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIEludGVybmFsLCBidXQgbmVlZHMgdG8gYmUgY2FsbGVkIGJ5IG90aGVyIG5vZGVzXG4gICAqL1xuICBfdXBkYXRlU2VsZWN0aW9uRnJvbUNoaWxkcmVuKCkge1xuICAgIGNvbnN0IG5ld1N0YXRlID0gdGhpcy5jb21wdXRlU2VsZWN0aW9uU3RhdGVGcm9tQ2hpbGRyZW4oKTtcbiAgICBpZiAobmV3U3RhdGUgPT09IHRoaXMuc2VsZWN0ZWQudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZC5uZXh0KG5ld1N0YXRlKTtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50Ll91cGRhdGVTZWxlY3Rpb25Gcm9tQ2hpbGRyZW4oKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgVHJlZU5vZGVNb2RlbCB9IGZyb20gJy4vdHJlZS1ub2RlLm1vZGVsJztcblxuLypcbiAqIEEgZGVjbGFyYXRpdmUgbW9kZWwgaXMgYnVpbHQgYnkgdHJhdmVyc2luZyB0aGUgQW5ndWxhciBjb21wb25lbnQgdHJlZS5cbiAqIERlY2xhcmF0aXZlID0gVHJlZSBub2RlIGNvbXBvbmVudHMgZGljdGF0ZSB0aGUgbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERlY2xhcmF0aXZlVHJlZU5vZGVNb2RlbDxUPiBleHRlbmRzIFRyZWVOb2RlTW9kZWw8VD4ge1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERlY2xhcmF0aXZlVHJlZU5vZGVNb2RlbDxUPiB8IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5fYWRkQ2hpbGQodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGZvciBhIG1vcmUgcHJlY2lzZSB0eXBlXG4gIHBhcmVudDogRGVjbGFyYXRpdmVUcmVlTm9kZU1vZGVsPFQ+IHwgbnVsbDtcbiAgY2hpbGRyZW46IERlY2xhcmF0aXZlVHJlZU5vZGVNb2RlbDxUPltdO1xuXG4gIF9hZGRDaGlsZChjaGlsZDogRGVjbGFyYXRpdmVUcmVlTm9kZU1vZGVsPFQ+KSB7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgfVxuXG4gIF9yZW1vdmVDaGlsZChjaGlsZDogRGVjbGFyYXRpdmVUcmVlTm9kZU1vZGVsPFQ+KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoY2hpbGQpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50Ll9yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICB9XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCwgU2tpcFNlbGYsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWN1cnNpdmVUcmVlTm9kZU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvcmVjdXJzaXZlLXRyZWUtbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBDbHJSZWN1cnNpdmVGb3JPZkNvbnRleHQgfSBmcm9tICcuL3JlY3Vyc2l2ZS1mb3Itb2YnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHJlZUZlYXR1cmVzU2VydmljZTxUPiB7XG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgZWFnZXIgPSB0cnVlO1xuICByZWN1cnNpb246IHtcbiAgICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8Q2xyUmVjdXJzaXZlRm9yT2ZDb250ZXh0PFQ+PjtcbiAgICByb290OiBSZWN1cnNpdmVUcmVlTm9kZU1vZGVsPFQ+W107XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlRmVhdHVyZXNGYWN0b3J5PFQ+KGV4aXN0aW5nOiBUcmVlRmVhdHVyZXNTZXJ2aWNlPFQ+KSB7XG4gIHJldHVybiBleGlzdGluZyB8fCBuZXcgVHJlZUZlYXR1cmVzU2VydmljZSgpO1xufVxuXG5leHBvcnQgY29uc3QgVFJFRV9GRUFUVVJFU19QUk9WSURFUiA9IHtcbiAgcHJvdmlkZTogVHJlZUZlYXR1cmVzU2VydmljZSxcbiAgdXNlRmFjdG9yeTogdHJlZUZlYXR1cmVzRmFjdG9yeSxcbiAgLypcbiAgICogVGhlIE9wdGlvbmFsICsgU2tpcFNlbGYgcGF0dGVybiBlbnN1cmVzIHRoYXQgaW4gY2FzZSBvZiBuZXN0ZWQgY29tcG9uZW50cywgb25seSB0aGUgcm9vdCBvbmUgd2lsbFxuICAgKiBpbnN0YW50aWF0ZSBhIG5ldyBzZXJ2aWNlIGFuZCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgcmV1c2UgdGhlIHJvb3QncyBpbnN0YW5jZS5cbiAgICogSWYgdGhlcmUgYXJlIHNldmVyYWwgcm9vdHMgKGluIHRoaXMgY2FzZSwgc2V2ZXJhbCBpbmRlcGVuZGVudCB0cmVlcyBvbiBhIHBhZ2UpLCBlYWNoIHJvb3Qgd2lsbCBpbnN0YW50aWF0ZVxuICAgKiBpdHMgb3duIHNlcnZpY2Ugc28gdGhleSB3b24ndCBpbnRlcmZlcmUgd2l0aCBvbmUgYW5vdGhlci5cbiAgICpcbiAgICogVEw7RFIgLSBPcHRpb25hbCArIFNraXBTZWxmID0gMSBpbnN0YW5jZSBvZiBUcmVlRmVhdHVyZXNTZXJ2aWNlIHBlciB0cmVlLlxuICAgKi9cbiAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIFRyZWVGZWF0dXJlc1NlcnZpY2VdXSxcbn07XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNraXBTZWxmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBFeHBhbmQgfSBmcm9tICcuLi8uLi91dGlscy9leHBhbmQvcHJvdmlkZXJzL2V4cGFuZCc7XG5pbXBvcnQgeyBDbHJDb21tb25TdHJpbmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVU5JUVVFX0lELCBVTklRVUVfSURfUFJPVklERVIgfSBmcm9tICcuLi8uLi91dGlscy9pZC1nZW5lcmF0b3IvaWQtZ2VuZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9hZGluZ0xpc3RlbmVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9hZGluZy9sb2FkaW5nLWxpc3RlbmVyJztcbmltcG9ydCB7IERlY2xhcmF0aXZlVHJlZU5vZGVNb2RlbCB9IGZyb20gJy4vbW9kZWxzL2RlY2xhcmF0aXZlLXRyZWUtbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBDbHJTZWxlY3RlZFN0YXRlIH0gZnJvbSAnLi9tb2RlbHMvc2VsZWN0ZWQtc3RhdGUuZW51bSc7XG5pbXBvcnQgeyBUcmVlTm9kZU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvdHJlZS1ub2RlLm1vZGVsJztcbmltcG9ydCB7IFRSRUVfRkVBVFVSRVNfUFJPVklERVIsIFRyZWVGZWF0dXJlc1NlcnZpY2UgfSBmcm9tICcuL3RyZWUtZmVhdHVyZXMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci10cmVlLW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS1ub2RlLmh0bWwnLFxuICBwcm92aWRlcnM6IFtVTklRVUVfSURfUFJPVklERVIsIFRSRUVfRkVBVFVSRVNfUFJPVklERVIsIEV4cGFuZCwgeyBwcm92aWRlOiBMb2FkaW5nTGlzdGVuZXIsIHVzZUV4aXN0aW5nOiBFeHBhbmQgfV0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdjaGlsZE5vZGVzU3RhdGUnLCBbXG4gICAgICBzdGF0ZSgnZXhwYW5kZWQnLCBzdHlsZSh7IGhlaWdodDogJyonLCAnb3ZlcmZsb3cteSc6ICdoaWRkZW4nIH0pKSxcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQnLCBzdHlsZSh7IGhlaWdodDogMCwgJ292ZXJmbG93LXknOiAnaGlkZGVuJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMC4ycyBlYXNlLWluLW91dCcpKSxcbiAgICBdKSxcbiAgXSxcbiAgaG9zdDogeyAnW2NsYXNzLmNsci10cmVlLW5vZGVdJzogJ3RydWUnIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsclRyZWVOb2RlPFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBTVEFURVMgPSBDbHJTZWxlY3RlZFN0YXRlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVU5JUVVFX0lEKSBwdWJsaWMgbm9kZUlkOiBzdHJpbmcsXG4gICAgQE9wdGlvbmFsKClcbiAgICBAU2tpcFNlbGYoKVxuICAgIHBhcmVudDogQ2xyVHJlZU5vZGU8VD4sXG4gICAgcHVibGljIGZlYXR1cmVzU2VydmljZTogVHJlZUZlYXR1cmVzU2VydmljZTxUPixcbiAgICBwdWJsaWMgZXhwYW5kU2VydmljZTogRXhwYW5kLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzLFxuICAgIGluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICBpZiAodGhpcy5mZWF0dXJlc1NlcnZpY2UucmVjdXJzaW9uKSB7XG4gICAgICAvLyBJJ20gY29tcGxldGVseSBzdHVjaywgd2UgaGF2ZSB0byBoYWNrIGludG8gcHJpdmF0ZSBwcm9wZXJ0aWVzIHVudGlsIGVpdGhlclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5MzUgb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTU5OThcbiAgICAgIC8vIGFyZSBmaXhlZFxuICAgICAgdGhpcy5fbW9kZWwgPSAoPGFueT5pbmplY3Rvcikudmlldy5jb250ZXh0LmNsck1vZGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3JjZSBjYXN0IGZvciBub3csIG5vdCBzdXJlIGhvdyB0byB0aWUgdGhlIGNvcnJlY3QgdHlwZSBoZXJlIHRvIGZlYXR1cmVzU2VydmljZS5yZWN1cnNpb25cbiAgICAgIHRoaXMuX21vZGVsID0gbmV3IERlY2xhcmF0aXZlVHJlZU5vZGVNb2RlbChwYXJlbnQgPyA8RGVjbGFyYXRpdmVUcmVlTm9kZU1vZGVsPFQ+PnBhcmVudC5fbW9kZWwgOiBudWxsKTtcbiAgICB9XG4gIH1cblxuICBfbW9kZWw6IFRyZWVOb2RlTW9kZWw8VD47XG5cbiAgaXNFeHBhbmRhYmxlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5leHBhbmRhYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kYWJsZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRTZXJ2aWNlLmV4cGFuZGFibGUgfHwgdGhpcy5fbW9kZWwuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyU2VsZWN0ZWQnKVxuICBnZXQgc2VsZWN0ZWQoKTogQ2xyU2VsZWN0ZWRTdGF0ZSB8IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbC5zZWxlY3RlZC52YWx1ZTtcbiAgfVxuICBzZXQgc2VsZWN0ZWQodmFsdWU6IENsclNlbGVjdGVkU3RhdGUgfCBib29sZWFuKSB7XG4gICAgdGhpcy5mZWF0dXJlc1NlcnZpY2Uuc2VsZWN0YWJsZSA9IHRydWU7XG4gICAgLy8gR3JhY2VmdWxseSBoYW5kbGUgZmFsc3kgc3RhdGVzIGxpa2UgbnVsbCBvciB1bmRlZmluZWQgYmVjYXVzZSBpdCdzIGp1c3QgZWFzaWVyIHRoYW4gYW5zd2VyaW5nIHF1ZXN0aW9ucy5cbiAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gd2l0aCBzdHJpY3QgdHlwaW5nIG9uIHRoZSBhcHAncyBzaWRlLCBidXQgaXQncyBub3QgdXAgdG8gdXMuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlID0gQ2xyU2VsZWN0ZWRTdGF0ZS5VTlNFTEVDVEVEO1xuICAgIH1cbiAgICAvLyBXZSBtYXRjaCBib29sZWFucyB0byB0aGUgY29ycmVzcG9uZGluZyBDbHJTZWxlY3RlZFN0YXRlXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlID8gQ2xyU2VsZWN0ZWRTdGF0ZS5TRUxFQ1RFRCA6IENsclNlbGVjdGVkU3RhdGUuVU5TRUxFQ1RFRDtcbiAgICB9XG4gICAgLy8gV2UgcHJvcGFnYXRlIG9ubHkgaWYgdGhlIHRyZWUgaXMgaW4gc21hcnQgbW9kZVxuICAgIHRoaXMuX21vZGVsLnNldFNlbGVjdGVkKHZhbHVlLCB0aGlzLmZlYXR1cmVzU2VydmljZS5lYWdlciwgdGhpcy5mZWF0dXJlc1NlcnZpY2UuZWFnZXIpO1xuICB9XG5cbiAgLy8gV2UgbmVlZCBhbiBhc3luYyBFdmVudEVtaXR0ZXIgb3Igd2Ugd2lsbCB0cmlnZ2VyIGNob2NvbGF0ZSBlcnJvcnMgbGlrZSBpdCdzIDIwMTYuXG4gIEBPdXRwdXQoJ2NsclNlbGVjdGVkQ2hhbmdlJykgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENsclNlbGVjdGVkU3RhdGU+KHRydWUpO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IHRyZWVOb2RlUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbC5wYXJlbnQgPyAndHJlZWl0ZW0nIDogJ3RyZWUnO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlJylcbiAgZ2V0IHJvb3RBcmlhTXVsdGlTZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9tb2RlbC5wYXJlbnQgfHwgIXRoaXMuZmVhdHVyZXNTZXJ2aWNlLnNlbGVjdGFibGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zZWxlY3RlZCcpXG4gIGdldCBhcmlhU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZXNTZXJ2aWNlLnNlbGVjdGFibGUgPyB0aGlzLl9tb2RlbC5zZWxlY3RlZC52YWx1ZSA9PT0gQ2xyU2VsZWN0ZWRTdGF0ZS5TRUxFQ1RFRCA6IG51bGw7XG4gIH1cblxuICAvLyBBbGxvd3MgdGhlIGNvbnN1bWVyIHRvIG92ZXJyaWRlIG91ciBsb2dpYyBkZWNpZGluZyBpZiBhIG5vZGUgaXMgZXhwYW5kYWJsZS5cbiAgLy8gVXNlZnVsIGZvciByZWN1cnNpdmUgdHJlZXMgdGhhdCBkb24ndCB3YW50IHRvIHByZS1sb2FkIG9uZSBsZXZlbCBhaGVhZCBqdXN0IHRvIGtub3cgd2hpY2ggbm9kZXMgYXJlIGV4cGFuZGFibGUuXG4gIEBJbnB1dCgnY2xyRXhwYW5kYWJsZScpIGV4cGFuZGFibGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLy8gSSdtIGNhdmluZyBvbiB0aGlzLCBmb3IgdHJlZSBub2RlcyBJIHRoaW5rIHdlIGNhbiB0b2xlcmF0ZSBoYXZpbmcgYSB0d28td2F5IGJpbmRpbmcgb24gdGhlIGNvbXBvbmVudFxuICAvLyByYXRoZXIgdGhhbiBlbmZvcmNlIHRoZSBjbHJJZkV4cGFuZGVkIHN0cnVjdHVyYWwgZGlyZWN0aXZlIGZvciBkeW5hbWljIGNhc2VzLiBNb3N0bHkgYmVjYXVzZSBmb3IgdGhlIHNtYXJ0XG4gIC8vIGNhc2UsIHlvdSBjYW4ndCB1c2UgYSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSwgaXQgd291bGQgbmVlZCB0byBnbyBvbiBhbiBuZy1jb250YWluZXIuXG4gIEBJbnB1dCgnY2xyRXhwYW5kZWQnKVxuICBnZXQgZXhwYW5kZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kU2VydmljZS5leHBhbmRlZDtcbiAgfVxuICBzZXQgZXhwYW5kZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmV4cGFuZFNlcnZpY2UuZXhwYW5kZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckV4cGFuZGVkQ2hhbmdlJykgZXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMuX21vZGVsLnNlbGVjdGVkLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodmFsdWUpKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5leHBhbmRTZXJ2aWNlLmV4cGFuZENoYW5nZS5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHZhbHVlKSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fbW9kZWwuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVFJFRV9GRUFUVVJFU19QUk9WSURFUiwgVHJlZUZlYXR1cmVzU2VydmljZSB9IGZyb20gJy4vdHJlZS1mZWF0dXJlcy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXRyZWUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8Y2xyLXJlY3Vyc2l2ZS1jaGlsZHJlbiAqbmdJZj1cImZlYXR1cmVzU2VydmljZS5yZWN1cnNpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGlsZHJlbl09XCJmZWF0dXJlc1NlcnZpY2UucmVjdXJzaW9uLnJvb3RcIj48L2Nsci1yZWN1cnNpdmUtY2hpbGRyZW4+XG4gIGAsXG4gIHByb3ZpZGVyczogW1RSRUVfRkVBVFVSRVNfUFJPVklERVJdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUcmVlPFQ+IHtcbiAgLy8gVGhpcyBjb21wb25lbnQgY2FuIGFsc28gYmUgdXNlZCBqdXN0IHRvIGRlY2xhcmUgcHJvdmlkZXJzIG9uY2UgZm9yIHRyZWVzIHdpdGggbXVsdGlwbGUgcm9vdCBub2Rlcy5cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZmVhdHVyZXNTZXJ2aWNlOiBUcmVlRmVhdHVyZXNTZXJ2aWNlPFQ+KSB7fVxuXG4gIEBJbnB1dCgnY2xyTGF6eScpXG4gIHNldCBsYXp5KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5mZWF0dXJlc1NlcnZpY2UuZWFnZXIgPSAhdmFsdWU7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgcGVvcGxlIGNhbiBnaXZlIHVzIG51bGwgb3IgdW5kZWZpbmVkIGNoaWxkcmVuIGV2ZW4gaWYgdGhleSBydW4gc3RyaWN0IHR5cGUgY2hlY2tpbmcuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIEFzeW5jQXJyYXk8VD4gPVxuICB8IFRbXVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBQcm9taXNlPFRbXSB8IG51bGwgfCB1bmRlZmluZWQ+XG4gIHwgT2JzZXJ2YWJsZTxUW10gfCBudWxsIHwgdW5kZWZpbmVkPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZTxUPihvOiBBc3luY0FycmF5PFQ+KTogbyBpcyBQcm9taXNlPFRbXT4ge1xuICAvLyBTaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBldmVyeSBvcGVuLXNvdXJjZSBwcm9qZWN0IG91dCB0aGVyZS5cbiAgcmV0dXJuIG8gJiYgdHlwZW9mICg8YW55Pm8pLnRoZW4gPT09ICdmdW5jdGlvbic7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFRyZWVOb2RlTW9kZWwgfSBmcm9tICcuL3RyZWUtbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBBc3luY0FycmF5LCBpc1Byb21pc2UgfSBmcm9tICcuL2FzeW5jLWFycmF5JztcblxuLypcbiAqIEEgcmVjdXJzaXZlIG1vZGVsIGlzIGJ1aWx0IHJlY2VpdmVkIGZyb20gdGhlIGFwcCBhbmQgdHJhdmVyc2VkIHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnRzLlxuICogUmVjdXJzaXZlID0gTW9kZWwgZGljdGF0ZXMgdGhlIHRyZWUgbm9kZSBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWN1cnNpdmVUcmVlTm9kZU1vZGVsPFQ+IGV4dGVuZHMgVHJlZU5vZGVNb2RlbDxUPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1vZGVsOiBULFxuICAgIHBhcmVudDogUmVjdXJzaXZlVHJlZU5vZGVNb2RlbDxUPiB8IG51bGwsXG4gICAgcHJpdmF0ZSBnZXRDaGlsZHJlbjogKG5vZGU6IFQpID0+IEFzeW5jQXJyYXk8VD4gfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIH1cblxuICBwYXJlbnQ6IFJlY3Vyc2l2ZVRyZWVOb2RlTW9kZWw8VD4gfCBudWxsO1xuXG4gIHByaXZhdGUgY2hpbGRyZW5GZXRjaGVkID0gZmFsc2U7XG5cbiAgZmV0Y2hDaGlsZHJlbigpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbkZldGNoZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhc3luY0NoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbih0aGlzLm1vZGVsKTtcbiAgICBpZiAoaXNQcm9taXNlKGFzeW5jQ2hpbGRyZW4pKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgYXN5bmNDaGlsZHJlbi50aGVuKHJhdyA9PiB7XG4gICAgICAgIHRoaXMuX2NoaWxkcmVuID0gdGhpcy53cmFwQ2hpbGRyZW4ocmF3KTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JzZXJ2YWJsZShhc3luY0NoaWxkcmVuKSkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gYXN5bmNDaGlsZHJlbi5zdWJzY3JpYmUocmF3ID0+IHtcbiAgICAgICAgdGhpcy5fY2hpbGRyZW4gPSB0aGlzLndyYXBDaGlsZHJlbihyYXcpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoYXN5bmNDaGlsZHJlbikge1xuICAgICAgLy8gU3luY2hyb25vdXMgY2FzZVxuICAgICAgdGhpcy5fY2hpbGRyZW4gPSB0aGlzLndyYXBDaGlsZHJlbihhc3luY0NoaWxkcmVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jaGlsZHJlbkZldGNoZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwQ2hpbGRyZW4ocmF3TW9kZWxzOiBUW10pIHtcbiAgICByZXR1cm4gcmF3TW9kZWxzLm1hcChtID0+IG5ldyBSZWN1cnNpdmVUcmVlTm9kZU1vZGVsKG0sIHRoaXMsIHRoaXMuZ2V0Q2hpbGRyZW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoaWxkcmVuOiBSZWN1cnNpdmVUcmVlTm9kZU1vZGVsPFQ+W10gPSBbXTtcbiAgZ2V0IGNoaWxkcmVuKCk6IFJlY3Vyc2l2ZVRyZWVOb2RlTW9kZWw8VD5bXSB7XG4gICAgdGhpcy5mZXRjaENoaWxkcmVuKCk7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICB9XG4gIHNldCBjaGlsZHJlbih2YWx1ZTogUmVjdXJzaXZlVHJlZU5vZGVNb2RlbDxUPltdKSB7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPbkNoYW5nZXMsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmVlRmVhdHVyZXNTZXJ2aWNlIH0gZnJvbSAnLi90cmVlLWZlYXR1cmVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVjdXJzaXZlVHJlZU5vZGVNb2RlbCB9IGZyb20gJy4vbW9kZWxzL3JlY3Vyc2l2ZS10cmVlLW5vZGUubW9kZWwnO1xuaW1wb3J0IHsgVHJlZU5vZGVNb2RlbCB9IGZyb20gJy4vbW9kZWxzL3RyZWUtbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBBc3luY0FycmF5IH0gZnJvbSAnLi9tb2RlbHMvYXN5bmMtYXJyYXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsclJlY3Vyc2l2ZUZvck9mQ29udGV4dDxUPiB7XG4gICRpbXBsaWNpdDogVDtcbiAgY2xyTW9kZWw6IFRyZWVOb2RlTW9kZWw8VD47XG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJSZWN1cnNpdmVGb3JdW2NsclJlY3Vyc2l2ZUZvck9mXScgfSlcbmV4cG9ydCBjbGFzcyBDbHJSZWN1cnNpdmVGb3JPZjxUPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPENsclJlY3Vyc2l2ZUZvck9mQ29udGV4dDxUPj4sXG4gICAgcHJpdmF0ZSBmZWF0dXJlc1NlcnZpY2U6IFRyZWVGZWF0dXJlc1NlcnZpY2U8VD5cbiAgKSB7fVxuXG4gIC8vIFRPRE86IGFjY2VwdCBOZ0l0ZXJhYmxlPFQ+XG4gIEBJbnB1dCgnY2xyUmVjdXJzaXZlRm9yT2YnKSBub2RlczogVCB8IFRbXTtcblxuICAvLyBUT0RPOiBhY2NlcHQgTmdJdGVyYWJsZTxUPiByZXR1cm4gdHlwZVxuICBASW5wdXQoJ2NsclJlY3Vyc2l2ZUZvckdldENoaWxkcmVuJykgZ2V0Q2hpbGRyZW46IChub2RlOiBUKSA9PiBBc3luY0FycmF5PFQ+O1xuXG4gIC8vIEknbSB1c2luZyBPbkNoYW5nZXMgaW5zdGVhZCBvZiBPbkluaXQgdG8gZWFzaWx5IGtlZXAgdXAgdG8gZGF0ZSB3aXRoIGR5bmFtaWMgdHJlZXMuIE1heWJlIG9wdGltaXphYmxlIGxhdGVyLlxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBsZXQgd3JhcHBlZDogUmVjdXJzaXZlVHJlZU5vZGVNb2RlbDxUPltdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubm9kZXMpKSB7XG4gICAgICB3cmFwcGVkID0gdGhpcy5ub2Rlcy5tYXAobm9kZSA9PiBuZXcgUmVjdXJzaXZlVHJlZU5vZGVNb2RlbChub2RlLCBudWxsLCB0aGlzLmdldENoaWxkcmVuKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdyYXBwZWQgPSBbbmV3IFJlY3Vyc2l2ZVRyZWVOb2RlTW9kZWwodGhpcy5ub2RlcywgbnVsbCwgdGhpcy5nZXRDaGlsZHJlbildO1xuICAgIH1cbiAgICB0aGlzLmZlYXR1cmVzU2VydmljZS5yZWN1cnNpb24gPSB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZSxcbiAgICAgIHJvb3Q6IHdyYXBwZWQsXG4gICAgfTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEV4cGFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL2V4cGFuZC9wcm92aWRlcnMvZXhwYW5kJztcbmltcG9ydCB7IFRyZWVGZWF0dXJlc1NlcnZpY2UgfSBmcm9tICcuL3RyZWUtZmVhdHVyZXMuc2VydmljZSc7XG5pbXBvcnQgeyBUcmVlTm9kZU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvdHJlZS1ub2RlLm1vZGVsJztcbmltcG9ydCB7IENsclJlY3Vyc2l2ZUZvck9mQ29udGV4dCB9IGZyb20gJy4vcmVjdXJzaXZlLWZvci1vZic7XG5pbXBvcnQgeyBSZWN1cnNpdmVUcmVlTm9kZU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvcmVjdXJzaXZlLXRyZWUtbm9kZS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1yZWN1cnNpdmUtY2hpbGRyZW4nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRSZW5kZXIoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgcGFyZW50Py5jaGlsZHJlbiB8fCBjaGlsZHJlblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmVhdHVyZXNTZXJ2aWNlLnJlY3Vyc2lvbi50ZW1wbGF0ZTsgY29udGV4dDogZ2V0Q29udGV4dChjaGlsZClcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICBgLFxufSlcbi8qKlxuICogSW50ZXJuYWwgY29tcG9uZW50LCBkbyBub3QgZXhwb3J0IVxuICogVGhpcyBpcyBwYXJ0IG9mIHRoZSBoYWNrIHRvIGdldCBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTU5OThcbiAqL1xuZXhwb3J0IGNsYXNzIFJlY3Vyc2l2ZUNoaWxkcmVuPFQ+IHtcbiAgY29uc3RydWN0b3IocHVibGljIGZlYXR1cmVzU2VydmljZTogVHJlZUZlYXR1cmVzU2VydmljZTxUPiwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBleHBhbmRTZXJ2aWNlOiBFeHBhbmQpIHtcbiAgICBpZiAoZXhwYW5kU2VydmljZSAmJiBmZWF0dXJlc1NlcnZpY2UucmVjdXJzaW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuZXhwYW5kU2VydmljZS5leHBhbmRDaGFuZ2Uuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgLy8gT25jZSBhZ2FpbiwgSSdtIHN1cmUgd2UgY2FuIGZpbmQgYSB3YXkgdG8gYXZvaWQgdGhpcyBjYXN0aW5nIGJ5IHR5cGluZyBldmVyeSBjb21wb25lbnQgaW4gYSB3YXkgdGhhdFxuICAgICAgICAgIC8vIGxldHMgdXMgdXNlIHRoZSBtb3JlIHNwZWNpZmljIG1vZGVsIGNsYXNzZXMgZGVwZW5kaW5nIG9uIHRoZSB1c2Ugb2YgKmNsclJlY3Vyc2l2ZUZvck9mIG9yIG5vdC5cbiAgICAgICAgICAvLyBCdXQgaXQgd291bGQgdGFrZSB0aW1lLCB3aGljaCB3ZSBkb24ndCBoYXZlIHJpZ2h0IG5vdy5cbiAgICAgICAgICAoPFJlY3Vyc2l2ZVRyZWVOb2RlTW9kZWw8VD4+dGhpcy5wYXJlbnQpLmZldGNoQ2hpbGRyZW4oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2hvdWxkUmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmZlYXR1cmVzU2VydmljZS5yZWN1cnNpb24gJiZcbiAgICAgIC8vIEluIHRoZSBzbWFydCBjYXNlLCB3ZSBlYWdlcmx5IHJlbmRlciBhbGwgdGhlIHJlY3Vyc2l2ZSBjaGlsZHJlblxuICAgICAgLy8gdG8gbWFrZSBzdXJlIHR3by13YXkgYmluZGluZ3MgZm9yIHNlbGVjdGlvbiBhcmUgYXZhaWxhYmxlLlxuICAgICAgLy8gVGhleSB3aWxsIGJlIGhpZGRlbiB3aXRoIENTUyBieSB0aGUgcGFyZW50LlxuICAgICAgKHRoaXMuZmVhdHVyZXNTZXJ2aWNlLmVhZ2VyIHx8ICF0aGlzLmV4cGFuZFNlcnZpY2UgfHwgdGhpcy5leHBhbmRTZXJ2aWNlLmV4cGFuZGVkKVxuICAgICk7XG4gIH1cblxuICAvLyBPZmZlcmluZyB0aGUgb3B0aW9uIHRvIGVpdGhlciBnaXZlIHRoZSBwYXJlbnQgbm9kZSB0byByZWN1cnNlIHBvdGVudGlhbGx5IGxhemlseSxcbiAgLy8gb3IgZGlyZWN0bHkgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gdG8gZGlzcGxheS5cbiAgQElucHV0KCdwYXJlbnQnKSBwYXJlbnQ6IFRyZWVOb2RlTW9kZWw8VD47XG4gIEBJbnB1dCgnY2hpbGRyZW4nKSBjaGlsZHJlbjogVHJlZU5vZGVNb2RlbDxUPltdO1xuXG4gIGdldENvbnRleHQobm9kZTogVHJlZU5vZGVNb2RlbDxUPik6IENsclJlY3Vyc2l2ZUZvck9mQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogbm9kZS5tb2RlbCxcbiAgICAgIGNsck1vZGVsOiBub2RlLFxuICAgIH07XG4gIH1cblxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJMb2FkaW5nTW9kdWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9hZGluZy9sb2FkaW5nLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJJZkV4cGFuZE1vZHVsZSB9IGZyb20gJy4uLy4uL3V0aWxzL2V4cGFuZC9pZi1leHBhbmQubW9kdWxlJztcbmltcG9ydCB7IENsclRyZWVOb2RlIH0gZnJvbSAnLi90cmVlLW5vZGUnO1xuaW1wb3J0IHsgQ2xyVHJlZSB9IGZyb20gJy4vdHJlZSc7XG5pbXBvcnQgeyBDbHJSZWN1cnNpdmVGb3JPZiB9IGZyb20gJy4vcmVjdXJzaXZlLWZvci1vZic7XG5pbXBvcnQgeyBSZWN1cnNpdmVDaGlsZHJlbiB9IGZyb20gJy4vcmVjdXJzaXZlLWNoaWxkcmVuJztcblxuZXhwb3J0IGNvbnN0IENMUl9UUkVFX1ZJRVdfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyVHJlZSwgQ2xyVHJlZU5vZGUsIENsclJlY3Vyc2l2ZUZvck9mXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2xySWNvbk1vZHVsZSwgQ2xyTG9hZGluZ01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9UUkVFX1ZJRVdfRElSRUNUSVZFUywgUmVjdXJzaXZlQ2hpbGRyZW5dLFxuICBleHBvcnRzOiBbQ0xSX1RSRUVfVklFV19ESVJFQ1RJVkVTLCBDbHJJZkV4cGFuZE1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIENsclRyZWVWaWV3TW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbHJEYXRhZ3JpZE1vZHVsZSB9IGZyb20gJy4vZGF0YWdyaWQvZGF0YWdyaWQubW9kdWxlJztcbmltcG9ydCB7IENsclN0YWNrVmlld01vZHVsZSB9IGZyb20gJy4vc3RhY2stdmlldy9zdGFjay12aWV3Lm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJUcmVlVmlld01vZHVsZSB9IGZyb20gJy4vdHJlZS12aWV3L3RyZWUtdmlldy5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoeyBleHBvcnRzOiBbQ2xyRGF0YWdyaWRNb2R1bGUsIENsclN0YWNrVmlld01vZHVsZSwgQ2xyVHJlZVZpZXdNb2R1bGVdIH0pXG5leHBvcnQgY2xhc3MgQ2xyRGF0YU1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRHJhZ0V2ZW50SW50ZXJmYWNlLCBEcmFnUG9pbnRQb3NpdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9kcmFnLWV2ZW50LmludGVyZmFjZSc7XG5cbi8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb252ZXJ0IGFuIGludGVybmFsIGV2ZW50XG4vLyB0byBhbiBleHRlcm5hbCBldmVudCB0byBiZSBlbWl0dGVkLlxuZXhwb3J0IGNsYXNzIENsckRyYWdFdmVudDxUPiB7XG4gIHB1YmxpYyBkcmFnUG9zaXRpb246IERyYWdQb2ludFBvc2l0aW9uO1xuICBwdWJsaWMgZ3JvdXA6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBwdWJsaWMgZHJhZ0RhdGFUcmFuc2ZlcjogVDtcbiAgcHVibGljIGRyb3BQb2ludFBvc2l0aW9uOiB7IHBhZ2VYOiBudW1iZXI7IHBhZ2VZOiBudW1iZXIgfTtcblxuICBjb25zdHJ1Y3RvcihkcmFnRXZlbnQ6IERyYWdFdmVudEludGVyZmFjZTxUPikge1xuICAgIHRoaXMuZHJhZ1Bvc2l0aW9uID0gZHJhZ0V2ZW50LmRyYWdQb3NpdGlvbjtcbiAgICB0aGlzLmdyb3VwID0gZHJhZ0V2ZW50Lmdyb3VwO1xuICAgIHRoaXMuZHJhZ0RhdGFUcmFuc2ZlciA9IGRyYWdFdmVudC5kcmFnRGF0YVRyYW5zZmVyO1xuICAgIHRoaXMuZHJvcFBvaW50UG9zaXRpb24gPSBkcmFnRXZlbnQuZHJvcFBvaW50UG9zaXRpb247XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmV4cG9ydCBlbnVtIERyYWdFdmVudFR5cGUge1xuICBEUkFHX1NUQVJULFxuICBEUkFHX01PVkUsXG4gIERSQUdfRU5ELFxuICBEUkFHX0VOVEVSLFxuICBEUkFHX0xFQVZFLFxuICBEUk9QLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERyYWdQb2ludFBvc2l0aW9uIHtcbiAgcGFnZVg6IG51bWJlcjtcbiAgcGFnZVk6IG51bWJlcjtcbiAgbW92ZVg6IG51bWJlcjtcbiAgbW92ZVk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEcmFnRXZlbnRJbnRlcmZhY2U8VD4ge1xuICB0eXBlOiBEcmFnRXZlbnRUeXBlO1xuICBncm91cD86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBnaG9zdEVsZW1lbnQ/OiBhbnk7XG4gIGRyYWdQb3NpdGlvbjogRHJhZ1BvaW50UG9zaXRpb247XG4gIGRyYWdEYXRhVHJhbnNmZXI/OiBUO1xuICAvLyBGb3IgZGVmYXVsdCBnaG9zdHMsIHRoaXMgZHJvcFBvaW50UG9zaXRpb24gZGVub3RlcyB0aGUgY2VudGVyIHBvaW50IG9mIHRoZSBnaG9zdCBlbGVtZW50LlxuICAvLyBUaGlzIGNlbnRlciBwb2ludCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaG9zdCBpcyBvdmVyIGRyb3BwYWJsZSBlbGVtZW50cyBvciBub3QuXG4gIGRyb3BQb2ludFBvc2l0aW9uPzogeyBwYWdlWDogbnVtYmVyOyBwYWdlWTogbnVtYmVyIH07XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IERyYWdFdmVudEludGVyZmFjZSwgRHJhZ0V2ZW50VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZHJhZy1ldmVudC5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIERyYWdBbmREcm9wRXZlbnRCdXNTZXJ2aWNlPFQ+IHtcbiAgcHJpdmF0ZSBkcmFnU3RhcnQ6IFN1YmplY3Q8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PiA9IG5ldyBTdWJqZWN0PERyYWdFdmVudEludGVyZmFjZTxUPj4oKTtcbiAgcHJpdmF0ZSBkcmFnTW92ZTogU3ViamVjdDxEcmFnRXZlbnRJbnRlcmZhY2U8VD4+ID0gbmV3IFN1YmplY3Q8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PigpO1xuICBwcml2YXRlIGRyYWdFbmQ6IFN1YmplY3Q8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PiA9IG5ldyBTdWJqZWN0PERyYWdFdmVudEludGVyZmFjZTxUPj4oKTtcbiAgcHJpdmF0ZSBkcm9wOiBTdWJqZWN0PERyYWdFdmVudEludGVyZmFjZTxUPj4gPSBuZXcgU3ViamVjdDxEcmFnRXZlbnRJbnRlcmZhY2U8VD4+KCk7XG5cbiAgZ2V0IGRyYWdTdGFydGVkKCk6IE9ic2VydmFibGU8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ1N0YXJ0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGRyYWdNb3ZlZCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudEludGVyZmFjZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLmRyYWdNb3ZlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGRyYWdFbmRlZCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudEludGVyZmFjZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLmRyYWdFbmQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgZHJvcHBlZCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudEludGVyZmFjZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLmRyb3AuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBicm9hZGNhc3QoZXZlbnQ6IERyYWdFdmVudEludGVyZmFjZTxUPik6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSBEcmFnRXZlbnRUeXBlLkRSQUdfU1RBUlQ6XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0Lm5leHQoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRHJhZ0V2ZW50VHlwZS5EUkFHX01PVkU6XG4gICAgICAgIHRoaXMuZHJhZ01vdmUubmV4dChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEcmFnRXZlbnRUeXBlLkRSQUdfRU5EOlxuICAgICAgICB0aGlzLmRyYWdFbmQubmV4dChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEcmFnRXZlbnRUeXBlLkRST1A6XG4gICAgICAgIHRoaXMuZHJvcC5uZXh0KGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IERyYWdFdmVudEludGVyZmFjZSwgRHJhZ0V2ZW50VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZHJhZy1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJhZ0FuZERyb3BFdmVudEJ1c1NlcnZpY2UgfSBmcm9tICcuL2RyYWctYW5kLWRyb3AtZXZlbnQtYnVzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHJhZ0V2ZW50TGlzdGVuZXJTZXJ2aWNlPFQ+IHtcbiAgcHJpdmF0ZSBkcmFnZ2FibGVFbDogYW55O1xuXG4gIC8vIGNvbnRhaW5zIHRoZSBzdGFydGluZyBldmVudHMgc3VjaCBhcyBtb3VzZWRvd24gYW5kIHRvdWNoc3RhcnRcbiAgcHJpdmF0ZSBsaXN0ZW5lcnM6ICgoKSA9PiB2b2lkKVtdO1xuICAvLyBjb250YWlucyB0aGUgbmVzdGVkIGV2ZW50cyB0aGF0IGhhcHBlbnMgYWZ0ZXIvaW5zaWRlIHRoZSBzdGFydGluZyBldmVudHNcbiAgLy8gc3VjaCBhcyBzZWxlY3RzdGFydCwgbW91c2Vtb3ZlL3RvdWNobW92ZSwgbW91c2V1cC90b3VjaGVuZFxuICBwcml2YXRlIG5lc3RlZExpc3RlbmVyczogKCgpID0+IHZvaWQpW107XG5cbiAgcHJpdmF0ZSBkcmFnU3RhcnQ6IFN1YmplY3Q8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PiA9IG5ldyBTdWJqZWN0PERyYWdFdmVudEludGVyZmFjZTxUPj4oKTtcbiAgcHJpdmF0ZSBkcmFnTW92ZTogU3ViamVjdDxEcmFnRXZlbnRJbnRlcmZhY2U8VD4+ID0gbmV3IFN1YmplY3Q8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PigpO1xuICBwcml2YXRlIGRyYWdFbmQ6IFN1YmplY3Q8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PiA9IG5ldyBTdWJqZWN0PERyYWdFdmVudEludGVyZmFjZTxUPj4oKTtcblxuICBwcml2YXRlIGhhc0RyYWdTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGRyYWdTdGFydGVkKCk6IE9ic2VydmFibGU8RHJhZ0V2ZW50SW50ZXJmYWNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ1N0YXJ0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGRyYWdNb3ZlZCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudEludGVyZmFjZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLmRyYWdNb3ZlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGRyYWdFbmRlZCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudEludGVyZmFjZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLmRyYWdFbmQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZXZlbnRCdXM6IERyYWdBbmREcm9wRXZlbnRCdXNTZXJ2aWNlPFQ+KSB7fVxuXG4gIHByaXZhdGUgaW5pdGlhbFBvc2l0aW9uOiB7IHBhZ2VYOiBudW1iZXI7IHBhZ2VZOiBudW1iZXIgfTtcblxuICAvLyBEcmFnZ2FibGUgY29tcG9uZW50IHNldHMgdGhlc2UgcHJvcGVydGllczpcbiAgcHVibGljIGRyYWdEYXRhVHJhbnNmZXI/OiBUO1xuICBwdWJsaWMgZ3JvdXA/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvLyBEcmFnZ2FibGVHaG9zdCBjb21wb25lbnQgc2V0cyB0aGVzZSBwcm9wZXJ0aWVzOlxuICBwdWJsaWMgZ2hvc3RFbGVtZW50PzogYW55O1xuICBwdWJsaWMgZHJvcFBvaW50UG9zaXRpb24/OiB7IHBhZ2VYOiBudW1iZXI7IHBhZ2VZOiBudW1iZXIgfTtcblxuICBwdWJsaWMgYXR0YWNoRHJhZ0xpc3RlbmVycyhkcmFnZ2FibGVFbDogTm9kZSkge1xuICAgIHRoaXMuZHJhZ2dhYmxlRWwgPSBkcmFnZ2FibGVFbDtcbiAgICB0aGlzLmxpc3RlbmVycyA9IFtcbiAgICAgIHRoaXMuY3VzdG9tRHJhZ0V2ZW50KHRoaXMuZHJhZ2dhYmxlRWwsICdtb3VzZWRvd24nLCAnbW91c2Vtb3ZlJywgJ21vdXNldXAnKSxcbiAgICAgIHRoaXMuY3VzdG9tRHJhZ0V2ZW50KHRoaXMuZHJhZ2dhYmxlRWwsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcpLFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgZGV0YWNoRHJhZ0xpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLm1hcChldmVudCA9PiBldmVudCgpKTtcbiAgICB9XG5cbiAgICAvLyBJbiBtb3N0IGNhc2VzLCBvbmNlIHVzZXJzIHN0YXJ0IGRyYWdnaW5nIHdpdGggbW91c2Vkb3duL3RvdWNoc3RhcnQgZXZlbnRzLFxuICAgIC8vIHRoZXkgd2lsbCBlbmQgZHJhZ2dpbmcgYXQgb25lIHBvaW50IHdpdGggbW91c2V1cC90b3VjaGVuZC5cbiAgICAvLyBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSBhIGZldyBjYXNlcyB3aGVyZSBtb3VzZWRvd24vdG91Y2hzdGFydCBldmVudHMgZ2V0IHJlZ2lzdGVyZWQsXG4gICAgLy8gYnV0IHRoZSBkcmFnZ2FibGUgZWxlbWVudCBnZXRzIHJlbW92ZWQgYmVmb3JlIHVzZXIgZW5kcyBkcmFnZ2luZy5cbiAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBhdHRhY2hlZCBsaXN0ZW5lcnMgdGhhdCBoYXBwZW5lZCBkdXJpbmcgdGhlIG1vdXNlZG93bi90b3VjaHN0YXJ0IGV2ZW50cy5cbiAgICBpZiAodGhpcy5uZXN0ZWRMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMubmVzdGVkTGlzdGVuZXJzLm1hcChldmVudCA9PiBldmVudCgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE5hdGl2ZUV2ZW50T2JqZWN0KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IGFueSB7XG4gICAgaWYgKCg8VG91Y2hFdmVudD5ldmVudCkuaGFzT3duUHJvcGVydHkoJ2NoYW5nZWRUb3VjaGVzJykpIHtcbiAgICAgIHJldHVybiAoPFRvdWNoRXZlbnQ+ZXZlbnQpLmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21EcmFnRXZlbnQoZWxlbWVudDogTm9kZSwgc3RhcnRPbkV2ZW50OiBzdHJpbmcsIG1vdmVPbkV2ZW50OiBzdHJpbmcsIGVuZE9uRXZlbnQ6IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCBzdGFydE9uRXZlbnQsIChzdGFydEV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgLy8gc2F2ZSB0aGUgaW5pdGlhbCBwb2ludCB0byBpbml0aWFsUG9zaXRpb25cbiAgICAgIC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBob3cgZmFyIHRoZSBkcmFnZ2FibGUgaGFzIGJlZW4gZHJhZ2dlZCBmcm9tIGl0cyBpbml0aWFsIHBvc2l0aW9uXG4gICAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IHtcbiAgICAgICAgcGFnZVg6IHRoaXMuZ2V0TmF0aXZlRXZlbnRPYmplY3Qoc3RhcnRFdmVudCkucGFnZVgsXG4gICAgICAgIHBhZ2VZOiB0aGlzLmdldE5hdGl2ZUV2ZW50T2JqZWN0KHN0YXJ0RXZlbnQpLnBhZ2VZLFxuICAgICAgfTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBuZXN0ZWQgbGlzdGVuZXJzJyBwcm9wZXJ0eSB3aXRoIGEgbmV3IGVtcHR5IGFycmF5O1xuICAgICAgdGhpcy5uZXN0ZWRMaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZGlzYWJsZSBzZWxlY3Rpb24gZHVyaW5nIGRyYWdnaW5nIChlc3BlY2lhbGx5IGluIEVER0UvSUUxMSkuXG4gICAgICB0aGlzLm5lc3RlZExpc3RlbmVycy5wdXNoKFxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnc2VsZWN0c3RhcnQnLCAoc2VsZWN0RXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgc2VsZWN0RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZWxlY3RFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIExpc3RlbiB0byBtb3VzZW1vdmUvdG91Y2htb3ZlIGV2ZW50cyBvdXRzaWRlIG9mIGFuZ3VsYXIgem9uZS5cbiAgICAgIHRoaXMubmVzdGVkTGlzdGVuZXJzLnB1c2goXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgbW92ZU9uRXZlbnQsIChtb3ZlRXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBpcyBuZWVkZWQgaGVyZSB0byBwcmV2ZW50IG5lc3RlZCBkcmFnZ2FibGVzIGZyb20gZ2V0dGluZyBkcmFnZ2VkXG4gICAgICAgICAgICAvLyBhbHRvZ2V0aGVyLiBXZSBzaG91bGRuJ3QgdXNlIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIGhlcmUgYXMgd2UgYXJlIGxpc3RlbmluZyB0byB0aGUgZXZlbnRzXG4gICAgICAgICAgICAvLyBvbiB0aGUgZ2xvYmFsIGVsZW1lbnQgbGV2ZWwuXG5cbiAgICAgICAgICAgIC8vIFdpdGggRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksIGl0IHJlZ2lzdGVycyB0aGUgZXZlbnRzIHNlbnQgZnJvbSB0aGUgaW5uZXIgbW9zdCBkcmFnZ2FibGVcbiAgICAgICAgICAgIC8vIGZpcnN0LiBUaGVuIGltbWVkaWF0ZWx5IGFmdGVyIHRoYXQsIGl0IHN0b3BzIGxpc3RlbmluZyB0byB0aGUgc2FtZSB0eXBlIG9mIGV2ZW50cyBvbiB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gZWxlbWVudC4gU28gdGhpcyB3aWxsIGhlbHAgdXMgdG8gbm90IHJlZ2lzdGVyIHRoZSBzYW1lIGV2ZW50cyB0aGF0IHdvdWxkIGNvbWUgZnJvbSB0aGUgcGFyZW50XG4gICAgICAgICAgICAvLyBsZXZlbCBkcmFnZ2FibGVzIGV2ZW50dWFsbHkuXG5cbiAgICAgICAgICAgIG1vdmVFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0RyYWdTdGFydGVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFzRHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAvLyBGaXJlIFwiZHJhZ3N0YXJ0XCJcbiAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3QobW92ZUV2ZW50LCBEcmFnRXZlbnRUeXBlLkRSQUdfU1RBUlQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRmlyZSBcImRyYWdtb3ZlXCJcbiAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3QobW92ZUV2ZW50LCBEcmFnRXZlbnRUeXBlLkRSQUdfTU9WRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBMaXN0ZW4gdG8gbW91c2V1cC90b3VjaGVuZCBldmVudHMuXG4gICAgICB0aGlzLm5lc3RlZExpc3RlbmVycy5wdXNoKFxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCBlbmRPbkV2ZW50LCAoZW5kRXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIC8vIEZpcmUgXCJkcmFnZW5kXCIgb25seSBpZiBkcmFnc3RhcnQgaXMgcmVnaXN0ZXJlZFxuICAgICAgICAgICAgdGhpcy5oYXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5icm9hZGNhc3QoZW5kRXZlbnQsIERyYWdFdmVudFR5cGUuRFJBR19FTkQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFdlIG11c3QgcmVtb3ZlIHRoZSB0aGUgbmVzdGVkIGxpc3RlbmVycyBldmVyeSB0aW1lIGRyYWcgY29tcGxldGVzLlxuICAgICAgICAgIGlmICh0aGlzLm5lc3RlZExpc3RlbmVycykge1xuICAgICAgICAgICAgdGhpcy5uZXN0ZWRMaXN0ZW5lcnMubWFwKGV2ZW50ID0+IGV2ZW50KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJyb2FkY2FzdChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsIGV2ZW50VHlwZTogRHJhZ0V2ZW50VHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IGRyYWdFdmVudDogRHJhZ0V2ZW50SW50ZXJmYWNlPFQ+ID0gdGhpcy5nZW5lcmF0ZURyYWdFdmVudChldmVudCwgZXZlbnRUeXBlKTtcblxuICAgIHN3aXRjaCAoZHJhZ0V2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgRHJhZ0V2ZW50VHlwZS5EUkFHX1NUQVJUOlxuICAgICAgICB0aGlzLmRyYWdTdGFydC5uZXh0KGRyYWdFdmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEcmFnRXZlbnRUeXBlLkRSQUdfTU9WRTpcbiAgICAgICAgdGhpcy5kcmFnTW92ZS5uZXh0KGRyYWdFdmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEcmFnRXZlbnRUeXBlLkRSQUdfRU5EOlxuICAgICAgICB0aGlzLmRyYWdFbmQubmV4dChkcmFnRXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgc2V0IGFmdGVyIHRoZXkgYXJlIGJyb2FkY2FzdGVkIHRvIHRoZSBEcmFnZ2FibGVHaG9zdCBjb21wb25lbnQuXG4gICAgZHJhZ0V2ZW50Lmdob3N0RWxlbWVudCA9IHRoaXMuZ2hvc3RFbGVtZW50O1xuICAgIGRyYWdFdmVudC5kcm9wUG9pbnRQb3NpdGlvbiA9IHRoaXMuZHJvcFBvaW50UG9zaXRpb247XG5cbiAgICB0aGlzLmV2ZW50QnVzLmJyb2FkY2FzdChkcmFnRXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZURyYWdFdmVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsIGV2ZW50VHlwZTogRHJhZ0V2ZW50VHlwZSk6IERyYWdFdmVudEludGVyZmFjZTxUPiB7XG4gICAgY29uc3QgbmF0aXZlRXZlbnQ6IGFueSA9IHRoaXMuZ2V0TmF0aXZlRXZlbnRPYmplY3QoZXZlbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IGV2ZW50VHlwZSxcbiAgICAgIGRyYWdQb3NpdGlvbjoge1xuICAgICAgICBwYWdlWDogbmF0aXZlRXZlbnQucGFnZVgsXG4gICAgICAgIHBhZ2VZOiBuYXRpdmVFdmVudC5wYWdlWSxcbiAgICAgICAgbW92ZVg6IG5hdGl2ZUV2ZW50LnBhZ2VYIC0gdGhpcy5pbml0aWFsUG9zaXRpb24ucGFnZVgsXG4gICAgICAgIG1vdmVZOiBuYXRpdmVFdmVudC5wYWdlWSAtIHRoaXMuaW5pdGlhbFBvc2l0aW9uLnBhZ2VZLFxuICAgICAgfSxcbiAgICAgIGdyb3VwOiB0aGlzLmdyb3VwLFxuICAgICAgZHJhZ0RhdGFUcmFuc2ZlcjogdGhpcy5kcmFnRGF0YVRyYW5zZmVyLFxuICAgICAgZ2hvc3RFbGVtZW50OiB0aGlzLmdob3N0RWxlbWVudCxcbiAgICB9O1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21BZGFwdGVyIH0gZnJvbSAnLi4vLi4vZG9tLWFkYXB0ZXIvZG9tLWFkYXB0ZXInO1xuaW1wb3J0IHsgRHJhZ0V2ZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kcmFnLWV2ZW50LmludGVyZmFjZSc7XG5cbi8vIFRoaXMgc2VydmljZSBpcyB1c2VkIHRvIGNhcHR1cmUgdGhlIHN0YXRlIG9mIGNsckRyYWdnYWJsZSBlbGVtZW50XG4vLyBhdCBhIGNlcnRhaW4gZXZlbnQgYW5kIHBhc3NlcyBpdCB0byBjbHJEcmFnZ2FibGVHaG9zdCBjb21wb25lbnQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlU25hcHNob3RTZXJ2aWNlPFQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkb21BZGFwdGVyOiBEb21BZGFwdGVyKSB7fVxuXG4gIHByaXZhdGUgZHJhZ2dhYmxlRWxDbGllbnRSZWN0OiBDbGllbnRSZWN0O1xuICBwcml2YXRlIHNuYXBzaG90RHJhZ0V2ZW50OiBEcmFnRXZlbnRJbnRlcmZhY2U8VD47XG5cbiAgcHVibGljIGNhcHR1cmUoZWw6IE5vZGUsIGV2ZW50OiBEcmFnRXZlbnRJbnRlcmZhY2U8VD4pOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdnYWJsZUVsQ2xpZW50UmVjdCA9IHRoaXMuZG9tQWRhcHRlci5jbGllbnRSZWN0KGVsKTtcbiAgICB0aGlzLnNuYXBzaG90RHJhZ0V2ZW50ID0gZXZlbnQ7XG4gIH1cbiAgcHVibGljIGRpc2NhcmQoKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuZHJhZ2dhYmxlRWxDbGllbnRSZWN0O1xuICAgIGRlbGV0ZSB0aGlzLnNuYXBzaG90RHJhZ0V2ZW50O1xuICB9XG4gIGdldCBoYXNEcmFnZ2FibGVTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnNuYXBzaG90RHJhZ0V2ZW50ICYmICEhdGhpcy5kcmFnZ2FibGVFbENsaWVudFJlY3Q7XG4gIH1cbiAgZ2V0IGNsaWVudFJlY3QoKTogQ2xpZW50UmVjdCB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dhYmxlRWxDbGllbnRSZWN0O1xuICB9XG4gIGdldCBkcmFnRXZlbnQoKTogRHJhZ0V2ZW50SW50ZXJmYWNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5zbmFwc2hvdERyYWdFdmVudDtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIE5nWm9uZSwgT25EZXN0cm95LCBPcHRpb25hbCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRHJhZ0V2ZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RyYWctZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERyYWdFdmVudExpc3RlbmVyU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RyYWctZXZlbnQtbGlzdGVuZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEcmFnZ2FibGVTbmFwc2hvdFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kcmFnZ2FibGUtc25hcHNob3Quc2VydmljZSc7XG5cbnR5cGUgUGFnZVBvc2l0aW9uID0ge1xuICBwYWdlWDogbnVtYmVyO1xuICBwYWdlWTogbnVtYmVyO1xufTtcbnR5cGUgT2Zmc2V0UG9zaXRpb24gPSB7XG4gIHRvcDogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItZHJhZ2dhYmxlLWdob3N0JyxcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2xlYXZlQW5pbWF0aW9uJywgW1xuICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xuICAgICAgICBzdHlsZSh7IGxlZnQ6ICcqJywgdG9wOiAnKicgfSksXG4gICAgICAgIGFuaW1hdGUoJzAuMnMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IHRvcDogJ3t7dG9wfX0nLCBsZWZ0OiAne3tsZWZ0fX0nIH0pKSxcbiAgICAgIF0pLFxuICAgIF0pLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEcmFnZ2FibGVHaG9zdDxUPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZHJhZ2dhYmxlR2hvc3RFbDogYW55O1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBASG9zdEJpbmRpbmcoJ0BsZWF2ZUFuaW1hdGlvbicpIGxlYXZlQW5pbUNvbmZpZyA9IHsgdmFsdWU6IDAsIHBhcmFtczogeyB0b3A6ICcwcHgnLCBsZWZ0OiAnMHB4JyB9IH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRyYWdFdmVudExpc3RlbmVyOiBEcmFnRXZlbnRMaXN0ZW5lclNlcnZpY2U8VD4sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkcmFnZ2FibGVTbmFwc2hvdDogRHJhZ2dhYmxlU25hcHNob3RTZXJ2aWNlPFQ+LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIGlmICghdGhpcy5kcmFnRXZlbnRMaXN0ZW5lciB8fCAhdGhpcy5kcmFnZ2FibGVTbmFwc2hvdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2xyLWRyYWdnYWJsZS1naG9zdCBjb21wb25lbnQgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbHJEcmFnZ2FibGUgZGlyZWN0aXZlLicpO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ2dhYmxlR2hvc3RFbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblxuICAgIC8vIE5lZWQgdG8gdXNlIFJlbmRlcmVyMiBhcyBpdCBydW5zIG91dHNpZGUgb2YgTmdab25lXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyYWdnYWJsZUdob3N0RWwsICdkcmFnZ2FibGUtZ2hvc3QnKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBnaG9zdCBlbGVtZW50IGluIERyYWdFdmVudExpc3RlbmVyIHRvIHBhc3MgaW4gYSBDbHJEcmFnRXZlbnQuXG4gICAgdGhpcy5kcmFnRXZlbnRMaXN0ZW5lci5naG9zdEVsZW1lbnQgPSB0aGlzLmRyYWdnYWJsZUdob3N0RWw7XG5cbiAgICAvLyBEZWZhdWx0IGdob3N0IHNpemUgZ2V0cyB0aGUgc2l6ZSBvZiBDbHJEcmFnZ2FibGUgZWxlbWVudC5cbiAgICB0aGlzLnNldERlZmF1bHRHaG9zdFNpemUodGhpcy5kcmFnZ2FibGVHaG9zdEVsKTtcblxuICAgIGNvbnN0IG9mZnNldDogT2Zmc2V0UG9zaXRpb24gPSB7XG4gICAgICB0b3A6IHRoaXMuZHJhZ2dhYmxlU25hcHNob3QuaGFzRHJhZ2dhYmxlU3RhdGVcbiAgICAgICAgPyB0aGlzLmRyYWdnYWJsZVNuYXBzaG90LmRyYWdFdmVudC5kcmFnUG9zaXRpb24ucGFnZVkgLSB0aGlzLmRyYWdnYWJsZVNuYXBzaG90LmNsaWVudFJlY3QudG9wXG4gICAgICAgIDogMCxcbiAgICAgIGxlZnQ6IHRoaXMuZHJhZ2dhYmxlU25hcHNob3QuaGFzRHJhZ2dhYmxlU3RhdGVcbiAgICAgICAgPyB0aGlzLmRyYWdnYWJsZVNuYXBzaG90LmRyYWdFdmVudC5kcmFnUG9zaXRpb24ucGFnZVggLSB0aGlzLmRyYWdnYWJsZVNuYXBzaG90LmNsaWVudFJlY3QubGVmdFxuICAgICAgICA6IDAsXG4gICAgfTtcblxuICAgIGxldCBpc0FuaW1hdGlvbkNvbmZpZ3VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5kcmFnRXZlbnRMaXN0ZW5lci5kcmFnTW92ZWQuc3Vic2NyaWJlKChldmVudDogRHJhZ0V2ZW50SW50ZXJmYWNlPFQ+KSA9PiB7XG4gICAgICAgIC8vIE9uIHRoZSBmaXJzdCBkcmFnIG1vdmUgZXZlbnQsIHdlIGNvbmZpZ3VyZSB0aGUgYW5pbWF0aW9uIGFzIGl0J3MgZGVwZW5kZW50IG9uIHRoZSBmaXJzdCBkcmFnIGV2ZW50LlxuICAgICAgICBpZiAoIWlzQW5pbWF0aW9uQ29uZmlndXJlZCkge1xuICAgICAgICAgIGlmICh0aGlzLmRyYWdnYWJsZVNuYXBzaG90Lmhhc0RyYWdnYWJsZVN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGVUb09uTGVhdmUoXG4gICAgICAgICAgICAgIGAke3RoaXMuZHJhZ2dhYmxlU25hcHNob3QuY2xpZW50UmVjdC50b3B9cHhgLFxuICAgICAgICAgICAgICBgJHt0aGlzLmRyYWdnYWJsZVNuYXBzaG90LmNsaWVudFJlY3QubGVmdH1weGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZVRvT25MZWF2ZShgJHtldmVudC5kcmFnUG9zaXRpb24ucGFnZVl9cHhgLCBgJHtldmVudC5kcmFnUG9zaXRpb24ucGFnZVh9cHhgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaXNBbmltYXRpb25Db25maWd1cmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc2l0aW9uIHRoZSBkcmFnZ2FibGUgZ2hvc3QuXG4gICAgICAgIGNvbnN0IHRvcExlZnRQb3NpdGlvbjogUGFnZVBvc2l0aW9uID0gdGhpcy5maW5kVG9wTGVmdFBvc2l0aW9uKGV2ZW50LmRyYWdQb3NpdGlvbiwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvblN0eWxlKHRoaXMuZHJhZ2dhYmxlR2hvc3RFbCwgdG9wTGVmdFBvc2l0aW9uLnBhZ2VYLCB0b3BMZWZ0UG9zaXRpb24ucGFnZVkpO1xuICAgICAgICB0aGlzLmRyYWdFdmVudExpc3RlbmVyLmRyb3BQb2ludFBvc2l0aW9uID0gdGhpcy5maW5kRHJvcFBvaW50UG9zaXRpb24odG9wTGVmdFBvc2l0aW9uKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGVmYXVsdEdob3N0U2l6ZShlbDogTm9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdnYWJsZVNuYXBzaG90Lmhhc0RyYWdnYWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLnNldFNpemVTdHlsZShlbCwgdGhpcy5kcmFnZ2FibGVTbmFwc2hvdC5jbGllbnRSZWN0LndpZHRoLCB0aGlzLmRyYWdnYWJsZVNuYXBzaG90LmNsaWVudFJlY3QuaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGVUb09uTGVhdmUodG9wOiBzdHJpbmcsIGxlZnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmxlYXZlQW5pbUNvbmZpZyA9IHsgdmFsdWU6IDAsIHBhcmFtczogeyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9IH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRUb3BMZWZ0UG9zaXRpb24oZHJhZ1Bvc2l0aW9uOiBQYWdlUG9zaXRpb24sIG9mZnNldDogT2Zmc2V0UG9zaXRpb24pOiBQYWdlUG9zaXRpb24ge1xuICAgIHJldHVybiB7IHBhZ2VYOiBkcmFnUG9zaXRpb24ucGFnZVggLSBvZmZzZXQubGVmdCwgcGFnZVk6IGRyYWdQb3NpdGlvbi5wYWdlWSAtIG9mZnNldC50b3AgfTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3BQb2ludFBvc2l0aW9uKHRvcExlZnRQb3NpdGlvbjogUGFnZVBvc2l0aW9uKTogUGFnZVBvc2l0aW9uIHtcbiAgICBpZiAodGhpcy5kcmFnZ2FibGVTbmFwc2hvdC5oYXNEcmFnZ2FibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVg6IHRvcExlZnRQb3NpdGlvbi5wYWdlWCArIHRoaXMuZHJhZ2dhYmxlU25hcHNob3QuY2xpZW50UmVjdC53aWR0aCAvIDIsXG4gICAgICAgIHBhZ2VZOiB0b3BMZWZ0UG9zaXRpb24ucGFnZVkgKyB0aGlzLmRyYWdnYWJsZVNuYXBzaG90LmNsaWVudFJlY3QuaGVpZ2h0IC8gMixcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b3BMZWZ0UG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTaXplU3R5bGUoZWw6IE5vZGUsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsLCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gIH1cblxuICBwcml2YXRlIHNldFBvc2l0aW9uU3R5bGUoZWw6IE5vZGUsIGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsLCAnbGVmdCcsIGAke2xlZnR9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsLCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbCwgJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgT25EZXN0cm95LCBPcHRpb25hbCwgU2tpcFNlbGYsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRHJhZ0V2ZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RyYWctZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERyYWdFdmVudExpc3RlbmVyU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2RyYWctZXZlbnQtbGlzdGVuZXIuc2VydmljZSc7XG5cbi8vIFRoaXMgc3RydWN0dXJhbCBkaXJlY3RpdmUgd2lsbCBiZSB1c2VkIG1haW5seSB0b2dldGhlciB3aXRoIGBjbHItZHJhZ2dhYmxlLWdob3N0YCBkaXJlY3RpdmUgaW5zaWRlIG9mIGNsckRyYWdnYWJsZVxuLy8gZGlyZWN0aXZlLiBUaGUgZGlyZWN0aXZlIGlzIHJlc3BvbnNpYmxlIGZvciBpbnN0YW50aWF0aW5nIGBjbHItZHJhZ2dhYmxlLWdob3N0YCBkaXJlY3RpdmUgb25seSBkdXJpbmcgZHJhZ2dpbmcgc29cbi8vIHRoYXQgQW5ndWxhciBDaGFuZ2UgRGV0ZWN0aW9uIGlzIHByZXZlbnRlZCBmcm9tIHJ1bm5pbmcgaWYgYSBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGlzIHBsYWNlZCBpbnNpZGUgb2YgdGhlXG4vLyBgY2xyLWRyYWdnYWJsZS1naG9zdGAgZGlyZWN0aXZlLlxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY2xySWZEcmFnZ2VkXScgfSlcbmV4cG9ydCBjbGFzcyBDbHJJZkRyYWdnZWQ8VD4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgQE9wdGlvbmFsKClcbiAgICBAU2tpcFNlbGYoKVxuICAgIHByaXZhdGUgY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZHJhZ0V2ZW50TGlzdGVuZXI6IERyYWdFdmVudExpc3RlbmVyU2VydmljZTxUPlxuICApIHtcbiAgICBpZiAoIXRoaXMuZHJhZ0V2ZW50TGlzdGVuZXIgfHwgIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSAqY2xySWZEcmFnZ2VkIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBvZiBhIGNsckRyYWdnYWJsZSBkaXJlY3RpdmUuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmRyYWdFdmVudExpc3RlbmVyLmRyYWdTdGFydGVkLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudEludGVyZmFjZTxUPikgPT4ge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmRyYWdFdmVudExpc3RlbmVyLmRyYWdFbmRlZC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnRXZlbnRJbnRlcmZhY2U8VD4pID0+IHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuY2xlYXIoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWI6IFN1YnNjcmlwdGlvbikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRHJhZ0V2ZW50TGlzdGVuZXJTZXJ2aWNlIH0gZnJvbSAnLi9kcmFnLWV2ZW50LWxpc3RlbmVyLnNlcnZpY2UnO1xuXG4vLyBUaGlzIHByb3ZpZGVyIHJlZ2lzdGVycyB0aGUgZHJhZyBoYW5kbGUgZWxlbWVudC5cbi8vIFdoZW4gaXQgcmVnaXN0ZXJzIGEgZWxlbWVudCBhcyBhIGRyYWcgaGFuZGxlLCBpdCBhdHRhY2hlcyB0aGF0IGVsZW1lbnQgdG8gdGhlIGxpc3RlbmVycyBmcm9tIENsckRyYWdFdmVudExpc3RlbmVyLlxuLy8gQWxzbywgaXQgYWRkcyB0aGUgXCJkcmFnLWhhbmRsZVwiIGNzcyBjbGFzcyB0byB0aGUgcmVnaXN0ZXJlZCBlbGVtZW50IHRocm91Z2ggUmVuZGVyZXIuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHJhZ0hhbmRsZVJlZ2lzdHJhclNlcnZpY2U8VD4ge1xuICBwcml2YXRlIF9jdXN0b21IYW5kbGVFbDogYW55O1xuICBwcml2YXRlIF9kZWZhdWx0SGFuZGxlRWw6IGFueTtcblxuICBnZXQgZGVmYXVsdEhhbmRsZUVsKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0SGFuZGxlRWw7XG4gIH1cblxuICBzZXQgZGVmYXVsdEhhbmRsZUVsKGVsOiBOb2RlKSB7XG4gICAgdGhpcy5fZGVmYXVsdEhhbmRsZUVsID0gZWw7IC8vIGRlZmF1bHRIYW5kbGVFbCB3aWxsIGJlIHVzdWFsbHkgdGhlIGNsckRyYWdnYWJsZSBlbGVtZW50LlxuXG4gICAgLy8gSWYgdGhlIGN1c3RvbUhhbmRsZUVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQsXG4gICAgLy8gZG9uJ3QgbWFrZSB0aGUgZGVmYXVsdEhhbmRsZUVsIHRoZSBkcmFnIGhhbmRsZSB5ZXQgdW50aWwgdGhlIGN1c3RvbUhhbmRsZUVsIGlzIHVucmVnaXN0ZXJlZC5cbiAgICBpZiAoIXRoaXMuX2N1c3RvbUhhbmRsZUVsKSB7XG4gICAgICB0aGlzLm1ha2VFbGVtZW50SGFuZGxlKHRoaXMuX2RlZmF1bHRIYW5kbGVFbCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkcmFnRXZlbnRMaXN0ZW5lcjogRHJhZ0V2ZW50TGlzdGVuZXJTZXJ2aWNlPFQ+LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgcHJpdmF0ZSBtYWtlRWxlbWVudEhhbmRsZShlbDogTm9kZSkge1xuICAgIGlmICh0aGlzLl9kZWZhdWx0SGFuZGxlRWwgJiYgdGhpcy5fZGVmYXVsdEhhbmRsZUVsICE9PSBlbCkge1xuICAgICAgLy8gQmVmb3JlIG1ha2luZyBhbiBlbGVtZW50IHRoZSBjdXN0b20gaGFuZGxlIGVsZW1lbnQsXG4gICAgICAvLyB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBleGlzdGluZyBkcmFnLWhhbmRsZSBjbGFzcyBmcm9tIHRoZSBkcmFnZ2FibGUgZWxlbWVudC5cbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fZGVmYXVsdEhhbmRsZUVsLCAnZHJhZy1oYW5kbGUnKTtcbiAgICB9XG4gICAgdGhpcy5kcmFnRXZlbnRMaXN0ZW5lci5hdHRhY2hEcmFnTGlzdGVuZXJzKGVsKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsLCAnZHJhZy1oYW5kbGUnKTtcbiAgfVxuXG4gIGdldCBjdXN0b21IYW5kbGVFbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tSGFuZGxlRWw7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDdXN0b21IYW5kbGUoZWw6IE5vZGUpIHtcbiAgICB0aGlzLmRyYWdFdmVudExpc3RlbmVyLmRldGFjaERyYWdMaXN0ZW5lcnMoKTsgLy8gcmVtb3ZlcyB0aGUgZXhpc3RpbmcgbGlzdGVuZXJzXG4gICAgdGhpcy5fY3VzdG9tSGFuZGxlRWwgPSBlbDtcbiAgICB0aGlzLm1ha2VFbGVtZW50SGFuZGxlKHRoaXMuX2N1c3RvbUhhbmRsZUVsKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyQ3VzdG9tSGFuZGxlKCkge1xuICAgIHRoaXMuZHJhZ0V2ZW50TGlzdGVuZXIuZGV0YWNoRHJhZ0xpc3RlbmVycygpOyAvLyByZW1vdmVzIHRoZSBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2N1c3RvbUhhbmRsZUVsLCAnZHJhZy1oYW5kbGUnKTtcbiAgICBkZWxldGUgdGhpcy5fY3VzdG9tSGFuZGxlRWw7XG4gICAgLy8gaWYgZGVmYXVsdCBoYW5kbGUgaXMgc2V0LCBtYWtlIHRoYXQgaGFuZGxlXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRIYW5kbGVFbCkge1xuICAgICAgdGhpcy5tYWtlRWxlbWVudEhhbmRsZSh0aGlzLl9kZWZhdWx0SGFuZGxlRWwpO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8vIFRoaXMgc2VydmljZSBjbGFzcyBhZGRzIGFuZCByZW1vdmVzIHRoZSBcImluLWRyYWdcIiBjbGFzcyB0byB0aGUgZG9jdW1lbnQgYm9keSBlbGVtZW50XG4vLyB0aHJvdWdoIGl0cyBwdWJsaWMgZW50ZXIoKSBhbmQgZXhpdCgpIG1ldGhvZHMuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR2xvYmFsRHJhZ01vZGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIGVudGVyKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ2luLWRyYWcnKTtcbiAgfVxuXG4gIGV4aXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCAnaW4tZHJhZycpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbnRlbnRDaGlsZCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IERvbUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kb20tYWRhcHRlci9kb20tYWRhcHRlcic7XG5pbXBvcnQgeyBDbHJEcmFnRXZlbnQgfSBmcm9tICcuLi9kcmFnLWV2ZW50JztcbmltcG9ydCB7IENsckRyYWdnYWJsZUdob3N0IH0gZnJvbSAnLi4vZHJhZ2dhYmxlLWdob3N0JztcbmltcG9ydCB7IENscklmRHJhZ2dlZCB9IGZyb20gJy4uL2lmLWRyYWdnZWQnO1xuaW1wb3J0IHsgRHJhZ0V2ZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kcmFnLWV2ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcmFnRXZlbnRMaXN0ZW5lclNlcnZpY2UgfSBmcm9tICcuLi9wcm92aWRlcnMvZHJhZy1ldmVudC1saXN0ZW5lci5zZXJ2aWNlJztcbmltcG9ydCB7IERyYWdIYW5kbGVSZWdpc3RyYXJTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2RyYWctaGFuZGxlLXJlZ2lzdHJhci5zZXJ2aWNlJztcbmltcG9ydCB7IERyYWdnYWJsZVNuYXBzaG90U2VydmljZSB9IGZyb20gJy4uL3Byb3ZpZGVycy9kcmFnZ2FibGUtc25hcHNob3Quc2VydmljZSc7XG5pbXBvcnQgeyBHbG9iYWxEcmFnTW9kZVNlcnZpY2UgfSBmcm9tICcuLi9wcm92aWRlcnMvZ2xvYmFsLWRyYWctbW9kZS5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NsckRyYWdnYWJsZV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICBEcmFnRXZlbnRMaXN0ZW5lclNlcnZpY2UsXG4gICAgRHJhZ0hhbmRsZVJlZ2lzdHJhclNlcnZpY2UsXG4gICAgRHJhZ2dhYmxlU25hcHNob3RTZXJ2aWNlLFxuICAgIEdsb2JhbERyYWdNb2RlU2VydmljZSxcbiAgICBEb21BZGFwdGVyLFxuICBdLFxuICBob3N0OiB7ICdbY2xhc3MuZHJhZ2dhYmxlXSc6ICd0cnVlJywgJ1tjbGFzcy5iZWluZy1kcmFnZ2VkXSc6ICdkcmFnT24nIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRyYWdnYWJsZTxUPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZHJhZ2dhYmxlRWw6IGFueTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8Q2xyRHJhZ2dhYmxlR2hvc3Q8VD4+O1xuICBwdWJsaWMgZHJhZ09uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRyYWdFdmVudExpc3RlbmVyOiBEcmFnRXZlbnRMaXN0ZW5lclNlcnZpY2U8VD4sXG4gICAgcHJpdmF0ZSBkcmFnSGFuZGxlUmVnaXN0cmFyOiBEcmFnSGFuZGxlUmVnaXN0cmFyU2VydmljZTxUPixcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGRyYWdnYWJsZVNuYXBzaG90OiBEcmFnZ2FibGVTbmFwc2hvdFNlcnZpY2U8VD4sXG4gICAgcHJpdmF0ZSBnbG9iYWxEcmFnTW9kZTogR2xvYmFsRHJhZ01vZGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZHJhZ2dhYmxlRWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5jb21wb25lbnRGYWN0b3J5ID0gdGhpcy5jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3Rvcnk8Q2xyRHJhZ2dhYmxlR2hvc3Q8VD4+KENsckRyYWdnYWJsZUdob3N0KTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoQ2xySWZEcmFnZ2VkKSBjdXN0b21HaG9zdDogQ2xySWZEcmFnZ2VkPFQ+O1xuXG4gIEBJbnB1dCgnY2xyRHJhZ2dhYmxlJylcbiAgc2V0IGRhdGFUcmFuc2Zlcih2YWx1ZTogVCkge1xuICAgIHRoaXMuZHJhZ0V2ZW50TGlzdGVuZXIuZHJhZ0RhdGFUcmFuc2ZlciA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KCdjbHJHcm91cCcpXG4gIHNldCBncm91cCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmRyYWdFdmVudExpc3RlbmVyLmdyb3VwID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRHaG9zdChldmVudDogRHJhZ0V2ZW50SW50ZXJmYWNlPFQ+KSB7XG4gICAgdGhpcy5kcmFnZ2FibGVTbmFwc2hvdC5jYXB0dXJlKHRoaXMuZHJhZ2dhYmxlRWwsIGV2ZW50KTtcbiAgICAvLyBOT1RFOiBUaGUgZGVmYXVsdCBnaG9zdCBlbGVtZW50IHdpbGwgYXBwZWFyXG4gICAgLy8gbmV4dCB0byB0aGUgY2xyRHJhZ2dhYmxlIGluIHRoZSBET00gYXMgYSBzaWJsaW5nIGVsZW1lbnQuXG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmNvbXBvbmVudEZhY3RvcnksIDAsIHRoaXMuaW5qZWN0b3IsIFtcbiAgICAgIFt0aGlzLmRyYWdnYWJsZUVsLmNsb25lTm9kZSh0cnVlKV0sXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lEZWZhdWx0R2hvc3QoKSB7XG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgdGhpcy5kcmFnZ2FibGVTbmFwc2hvdC5kaXNjYXJkKCk7XG4gIH1cblxuICBAT3V0cHV0KCdjbHJEcmFnU3RhcnQnKSBkcmFnU3RhcnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8Q2xyRHJhZ0V2ZW50PFQ+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgnY2xyRHJhZ01vdmUnKSBkcmFnTW92ZUVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxDbHJEcmFnRXZlbnQ8VD4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCdjbHJEcmFnRW5kJykgZHJhZ0VuZEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxDbHJEcmFnRXZlbnQ8VD4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmRyYWdIYW5kbGVSZWdpc3RyYXIuZGVmYXVsdEhhbmRsZUVsID0gdGhpcy5kcmFnZ2FibGVFbDtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5kcmFnRXZlbnRMaXN0ZW5lci5kcmFnU3RhcnRlZC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnRXZlbnRJbnRlcmZhY2U8VD4pID0+IHtcbiAgICAgICAgdGhpcy5nbG9iYWxEcmFnTW9kZS5lbnRlcigpO1xuICAgICAgICB0aGlzLmRyYWdPbiA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5jdXN0b21HaG9zdCkge1xuICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEdob3N0KGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0RW1pdHRlci5lbWl0KG5ldyBDbHJEcmFnRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuZHJhZ0V2ZW50TGlzdGVuZXIuZHJhZ01vdmVkLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudEludGVyZmFjZTxUPikgPT4ge1xuICAgICAgICB0aGlzLmRyYWdNb3ZlRW1pdHRlci5lbWl0KG5ldyBDbHJEcmFnRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuZHJhZ0V2ZW50TGlzdGVuZXIuZHJhZ0VuZGVkLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudEludGVyZmFjZTxUPikgPT4ge1xuICAgICAgICB0aGlzLmdsb2JhbERyYWdNb2RlLmV4aXQoKTtcbiAgICAgICAgdGhpcy5kcmFnT24gPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLmN1c3RvbUdob3N0KSB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95RGVmYXVsdEdob3N0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmFnRW5kRW1pdHRlci5lbWl0KG5ldyBDbHJEcmFnRXZlbnQoZXZlbnQpKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWI6IFN1YnNjcmlwdGlvbikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuZHJhZ0V2ZW50TGlzdGVuZXIuZGV0YWNoRHJhZ0xpc3RlbmVycygpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IERvbUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kb20tYWRhcHRlci9kb20tYWRhcHRlcic7XG5pbXBvcnQgeyBDbHJEcmFnRXZlbnQgfSBmcm9tICcuLi9kcmFnLWV2ZW50JztcbmltcG9ydCB7IERyYWdFdmVudEludGVyZmFjZSwgRHJhZ0V2ZW50VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZHJhZy1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2xyRHJvcFRvbGVyYW5jZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZHJvcC10b2xlcmFuY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IERyYWdBbmREcm9wRXZlbnRCdXNTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2RyYWctYW5kLWRyb3AtZXZlbnQtYnVzLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2xyRHJvcHBhYmxlXScsXG4gIHByb3ZpZGVyczogW0RvbUFkYXB0ZXJdLFxuICBob3N0OiB7ICdbY2xhc3MuZHJvcHBhYmxlXSc6ICd0cnVlJywgJ1tjbGFzcy5kcmFnZ2FibGUtbWF0Y2hdJzogJ2lzRHJhZ2dhYmxlTWF0Y2gnIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRyb3BwYWJsZTxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBkcmFnU3RhcnRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBkcmFnTW92ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRyYWdFbmRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIGRyb3BwYWJsZUVsOiBhbnk7XG4gIHByaXZhdGUgY2xpZW50UmVjdDogQ2xpZW50UmVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgZXZlbnRCdXM6IERyYWdBbmREcm9wRXZlbnRCdXNTZXJ2aWNlPFQ+LFxuICAgIHByaXZhdGUgZG9tQWRhcHRlcjogRG9tQWRhcHRlcixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7XG4gICAgdGhpcy5kcm9wcGFibGVFbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgaXNEcmFnZ2FibGVNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0RyYWdnYWJsZU92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzZXQgaXNEcmFnZ2FibGVPdmVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgLy8gV2UgbmVlZCB0byBhZGQvcmVtb3ZlIHRoaXMgZHJhZ2dhYmxlLW92ZXIgY2xhc3MgdmlhIFJlbmRlcmVyMlxuICAgIC8vIGJlY2F1c2UgaXNEcmFnZ2FibGVPdmVyIGlzIHNldCBvdXRzaWRlIG9mIE5nWm9uZS5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kcm9wcGFibGVFbCwgJ2RyYWdnYWJsZS1vdmVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kcm9wcGFibGVFbCwgJ2RyYWdnYWJsZS1vdmVyJyk7XG4gICAgfVxuICAgIHRoaXMuX2lzRHJhZ2dhYmxlT3ZlciA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ3JvdXA6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIEBJbnB1dCgnY2xyR3JvdXAnKVxuICBzZXQgZ3JvdXAodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZ3JvdXAgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2Ryb3BUb2xlcmFuY2U6IENsckRyb3BUb2xlcmFuY2VJbnRlcmZhY2UgPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuXG4gIHByaXZhdGUgZHJvcFRvbGVyYW5jZUdlbmVyYXRvcih0b3AgPSAwLCByaWdodCA9IHRvcCwgYm90dG9tID0gdG9wLCBsZWZ0ID0gcmlnaHQpOiBDbHJEcm9wVG9sZXJhbmNlSW50ZXJmYWNlIHtcbiAgICByZXR1cm4geyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQgfTtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyRHJvcFRvbGVyYW5jZScpXG4gIHNldCBkcm9wVG9sZXJhbmNlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBDbHJEcm9wVG9sZXJhbmNlSW50ZXJmYWNlKSB7XG4gICAgLy8gSWYgdXNlciBwcm92aWRlcyBhbiBvYmplY3QgaGVyZSBhbmQgd2FudHMgdG8gbWFuaXB1bGF0ZS91cGRhdGUgcHJvcGVydGllcyBpbmRpdmlkdWFsbHksXG4gICAgLy8gdGhlIG9iamVjdCBtdXN0IGJlIGltbXV0YWJsZSBhcyB3ZSBnZW5lcmF0ZSBuZXcgb2JqZWN0IGJhc2VkIHVzZXIncyBnaXZlbiBvYmplY3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuX2Ryb3BUb2xlcmFuY2UgPSB0aGlzLmRyb3BUb2xlcmFuY2VHZW5lcmF0b3IodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdG9sZXJhbmNlVmFsdWVzID0gdmFsdWVcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAubWFwKHRvbGVyYW5jZSA9PiBwYXJzZUludCh0b2xlcmFuY2UsIDEwKSk7XG4gICAgICB0aGlzLl9kcm9wVG9sZXJhbmNlID0gdGhpcy5kcm9wVG9sZXJhbmNlR2VuZXJhdG9yKC4uLnRvbGVyYW5jZVZhbHVlcyk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgLy8gVGhlIHZhbHVlIGNvdWxkIGJlIHBhc3NlZCBpbiBhcyB7bGVmdDogMjAsIHRvcDogMzAgfVxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmVzdCBvZiB0aGUgZGlyZWN0aW9uIHByb3BlcnRpZXMgc2hvdWxkIGJlIDAuXG4gICAgICAvLyBUaGF0J3Mgd2h5IHdlIGluaXRpYWxpemUgcHJvcGVydGllcyB3aXRoIDAgZmlyc3QsIHRoZW4gb3ZlcnJpZGUgd2l0aCB1c2VyJ3MgZ2l2ZW4gdmFsdWUuXG4gICAgICB0aGlzLl9kcm9wVG9sZXJhbmNlID0geyAuLi50aGlzLmRyb3BUb2xlcmFuY2VHZW5lcmF0b3IoMCksIC4uLnZhbHVlIH07XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgnY2xyRHJhZ1N0YXJ0JykgZHJhZ1N0YXJ0RW1pdHRlcjogRXZlbnRFbWl0dGVyPENsckRyYWdFdmVudDxUPj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoJ2NsckRyYWdNb3ZlJykgZHJhZ01vdmVFbWl0dGVyOiBFdmVudEVtaXR0ZXI8Q2xyRHJhZ0V2ZW50PFQ+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgnY2xyRHJhZ0VuZCcpIGRyYWdFbmRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8Q2xyRHJhZ0V2ZW50PFQ+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgnY2xyRHJhZ0xlYXZlJykgZHJhZ0xlYXZlRW1pdHRlcjogRXZlbnRFbWl0dGVyPENsckRyYWdFdmVudDxUPj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoJ2NsckRyYWdFbnRlcicpIGRyYWdFbnRlckVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxDbHJEcmFnRXZlbnQ8VD4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCdjbHJEcm9wJykgZHJvcEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxDbHJEcmFnRXZlbnQ8VD4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVGcm9tKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uKTogdm9pZCB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0dyb3VwTWF0Y2goZHJhZ2dhYmxlR3JvdXA6IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgLy8gQm90aCBEcmFnZ2FibGUgYW5kIERyb3BwYWJsZSBoYXZlIGNsckdyb3VwIGlucHV0LlxuICAgIC8vIFRoZSBjbHJHcm91cCBpbnB1dCBjYW4gYmUgYm90aCBhIHN0cmluZyBrZXkgb3IgYXJyYXkgb2Ygc3RyaW5nIGtleXMgaW4gRHJhZ2dhYmxlIGFuZCBEcm9wcGFibGUuXG5cbiAgICAvLyBJdCdzIG5vdCBtYXRjaCBpZiBEcmFnZ2FibGUgaGFzIG5vIGRlZmluZWQgdmFsdWUgYXNzaWduZWQgdG8gY2xyR3JvdXAsIGJ1dCBEcm9wcGFibGUgaGFzIGEgZGVmaW5lZCBjbHJHcm91cC5cbiAgICBpZiAoIWRyYWdnYWJsZUdyb3VwICYmIHRoaXMuX2dyb3VwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRoZSBzYW1lIGlzIHRydWUgdGhlIG90aGVyIHdheSByb3VuZC5cbiAgICBpZiAoIXRoaXMuX2dyb3VwICYmIGRyYWdnYWJsZUdyb3VwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSXQncyBtYXRjaCBpZiBib3RoIERyYWdnYWJsZSBhbmQgRHJvcHBhYmxlIGhhdmUgbm8gYXNzaWduZWQgdmFsdWUgZm9yIGNsckdyb3VwLlxuICAgIGlmICghdGhpcy5fZ3JvdXAgJiYgIWRyYWdnYWJsZUdyb3VwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJdCdzIG1hdGNoIGlmIGJvdGggRHJhZ2dhYmxlIGFuZCBEcm9wcGFibGUgaGF2ZSBzaW1wbGUgc3RyaW5nIGtleXMgdGhhdCBhcmUgbWF0Y2hpbmcuXG4gICAgLy8gSXQncyBtYXRjaCBpZiBEcmFnZ2FibGUncyBzaW1wbGUgY2xyR3JvdXAga2V5IGlzIG1hdGNoaW5nIHdpdGggb25lIG9mIHRoZSBjbHJHcm91cCBrZXlzIG9mIERyb3BwYWJsZS4gVGhlXG4gICAgLy8gc2FtZSBpcyB0cnVlIHRoZSBvdGhlciB3YXkgcm91bmQuXG4gICAgLy8gaXQncyBtYXRjaCBpZiBvbmUgb2YgdGhlIGNsckdyb3VwIGtleXMgb2YgRHJvcHBhYmxlIGlzIG1hdGNoaW5nIHdpdGggb25lIG9mIHRoZSBjbHJHcm91cCBrZXlzIG9mIERyYWdnYWJsZS5cbiAgICBpZiAodHlwZW9mIGRyYWdnYWJsZUdyb3VwID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9ncm91cCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwID09PSBkcmFnZ2FibGVHcm91cDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cC5pbmRleE9mKGRyYWdnYWJsZUdyb3VwKSA+IC0xO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX2dyb3VwID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZHJhZ2dhYmxlR3JvdXAuaW5kZXhPZih0aGlzLl9ncm91cCkgPiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fZ3JvdXAgYXMgc3RyaW5nW10pLnNvbWUoZ3JvdXBLZXkgPT4gZHJhZ2dhYmxlR3JvdXAuaW5kZXhPZihncm91cEtleSkgPiAtMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0luRHJvcEFyZWEocG9pbnQ6IHsgcGFnZVg6IG51bWJlcjsgcGFnZVk6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgaWYgKCFwb2ludCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jbGllbnRSZWN0KSB7XG4gICAgICB0aGlzLmNsaWVudFJlY3QgPSB0aGlzLmRvbUFkYXB0ZXIuY2xpZW50UmVjdCh0aGlzLmRyb3BwYWJsZUVsKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwb2ludC5wYWdlWCA+PSB0aGlzLmNsaWVudFJlY3QubGVmdCAtIHRoaXMuX2Ryb3BUb2xlcmFuY2UubGVmdCAmJlxuICAgICAgcG9pbnQucGFnZVggPD0gdGhpcy5jbGllbnRSZWN0LnJpZ2h0ICsgdGhpcy5fZHJvcFRvbGVyYW5jZS5yaWdodCAmJlxuICAgICAgcG9pbnQucGFnZVkgPj0gdGhpcy5jbGllbnRSZWN0LnRvcCAtIHRoaXMuX2Ryb3BUb2xlcmFuY2UudG9wICYmXG4gICAgICBwb2ludC5wYWdlWSA8PSB0aGlzLmNsaWVudFJlY3QuYm90dG9tICsgdGhpcy5fZHJvcFRvbGVyYW5jZS5ib3R0b21cbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdTdGFydChkcmFnU3RhcnRFdmVudDogRHJhZ0V2ZW50SW50ZXJmYWNlPFQ+KTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgZHJhZ2dhYmxlIGFuZCBkcm9wcGFibGUgaGF2ZSBhIG1hdGNoaW5nIGdyb3VwIGtleS5cbiAgICB0aGlzLmlzRHJhZ2dhYmxlTWF0Y2ggPSB0aGlzLmNoZWNrR3JvdXBNYXRjaChkcmFnU3RhcnRFdmVudC5ncm91cCk7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gZHJhZ01vdmVkIGFuZCBkcmFnRW5kZWQgb25seSBpZiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZSBoYXZlIGEgbWF0Y2hpbmcgZ3JvdXAga2V5LlxuICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlTWF0Y2gpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0RW1pdHRlci5lbWl0KG5ldyBDbHJEcmFnRXZlbnQoZHJhZ1N0YXJ0RXZlbnQpKTtcbiAgICAgIHRoaXMuZHJhZ01vdmVTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50QnVzLmRyYWdNb3ZlZC5zdWJzY3JpYmUoKGRyYWdNb3ZlRXZlbnQ6IERyYWdFdmVudEludGVyZmFjZTxUPikgPT4ge1xuICAgICAgICB0aGlzLm9uRHJhZ01vdmUoZHJhZ01vdmVFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZHJhZ0VuZFN1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRCdXMuZHJhZ0VuZGVkLnN1YnNjcmliZSgoZHJhZ0VuZEV2ZW50OiBEcmFnRXZlbnRJbnRlcmZhY2U8VD4pID0+IHtcbiAgICAgICAgdGhpcy5vbkRyYWdFbmQoZHJhZ0VuZEV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25EcmFnTW92ZShkcmFnTW92ZUV2ZW50OiBEcmFnRXZlbnRJbnRlcmZhY2U8VD4pOiB2b2lkIHtcbiAgICBjb25zdCBpc0luRHJvcEFyZWEgPSB0aGlzLmlzSW5Ecm9wQXJlYShkcmFnTW92ZUV2ZW50LmRyb3BQb2ludFBvc2l0aW9uKTtcbiAgICBpZiAoIXRoaXMuX2lzRHJhZ2dhYmxlT3ZlciAmJiBpc0luRHJvcEFyZWEpIHtcbiAgICAgIHRoaXMuaXNEcmFnZ2FibGVPdmVyID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGRyYWdFbnRlckV2ZW50ID0geyAuLi5kcmFnTW92ZUV2ZW50LCB0eXBlOiBEcmFnRXZlbnRUeXBlLkRSQUdfRU5URVIgfTtcbiAgICAgIHRoaXMuZXZlbnRCdXMuYnJvYWRjYXN0KGRyYWdFbnRlckV2ZW50KTtcbiAgICAgIHRoaXMuZHJhZ0VudGVyRW1pdHRlci5lbWl0KG5ldyBDbHJEcmFnRXZlbnQoZHJhZ0VudGVyRXZlbnQpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lzRHJhZ2dhYmxlT3ZlciAmJiAhaXNJbkRyb3BBcmVhKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dhYmxlT3ZlciA9IGZhbHNlO1xuICAgICAgY29uc3QgZHJhZ0xlYXZlRXZlbnQgPSB7IC4uLmRyYWdNb3ZlRXZlbnQsIHR5cGU6IERyYWdFdmVudFR5cGUuRFJBR19MRUFWRSB9O1xuICAgICAgdGhpcy5ldmVudEJ1cy5icm9hZGNhc3QoZHJhZ0xlYXZlRXZlbnQpO1xuICAgICAgdGhpcy5kcmFnTGVhdmVFbWl0dGVyLmVtaXQobmV3IENsckRyYWdFdmVudChkcmFnTGVhdmVFdmVudCkpO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ01vdmVFbWl0dGVyLmVtaXQobmV3IENsckRyYWdFdmVudChkcmFnTW92ZUV2ZW50KSk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ0VuZChkcmFnRW5kRXZlbnQ6IERyYWdFdmVudEludGVyZmFjZTxUPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0RyYWdnYWJsZU92ZXIpIHtcbiAgICAgIGlmIChkcmFnRW5kRXZlbnQuZ2hvc3RFbGVtZW50KSB7XG4gICAgICAgIC8vIEJ5IHRoaXMgcG9pbnQsIHRoZSBkcmFnZ2FibGUgZ2hvc3QgY29tcG9uZW50IGlzIGRlc3Ryb3llZCxcbiAgICAgICAgLy8gYnV0IHRoZSBlbGVtZW50IHdvdWxkIGJlIGFjdGl2ZSB1bnRpbCBpdHMgYW5pbWF0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgLy8gQXMgc3VjaCwgb25jZSB0aGUgZ2hvc3QgaXMgZHJvcHBlZCBvdmVyLCB3ZSB3aWxsIGdpdmUgaXQgXCJkcm9wcGVkXCIgY2xhc3MuXG5cbiAgICAgICAgLy8gVGhpcyBwcm9jZXNzIGNhbm5vdCBiZSBkb25lIGluIHRoZSBnaG9zdCBjb21wb25lbnRcbiAgICAgICAgLy8gYmVjYXVzZSBhbnkgc3Vic2NyaXB0aW9uIHRvIHRoZSBkcm9wIGV2ZW50IGlzIGluZWZmZWN0aXZlIG9yIGludmFsaWRcbiAgICAgICAgLy8gYXMgdGhlIGNvbXBvbmVudCBoYWQgYmVlbiBhbHJlYWR5IGRlc3Ryb3llZC5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkcmFnRW5kRXZlbnQuZ2hvc3RFbGVtZW50LCAnZHJvcHBlZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkcm9wRXZlbnQgPSB7IC4uLmRyYWdFbmRFdmVudCwgdHlwZTogRHJhZ0V2ZW50VHlwZS5EUk9QIH07XG4gICAgICB0aGlzLmV2ZW50QnVzLmJyb2FkY2FzdChkcm9wRXZlbnQpO1xuICAgICAgdGhpcy5kcm9wRW1pdHRlci5lbWl0KG5ldyBDbHJEcmFnRXZlbnQoZHJvcEV2ZW50KSk7XG4gICAgICB0aGlzLmlzRHJhZ2dhYmxlT3ZlciA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmRyYWdFbmRFbWl0dGVyLmVtaXQobmV3IENsckRyYWdFdmVudChkcmFnRW5kRXZlbnQpKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbSh0aGlzLmRyYWdNb3ZlU3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbSh0aGlzLmRyYWdFbmRTdWJzY3JpcHRpb24pO1xuICAgIHRoaXMuaXNEcmFnZ2FibGVNYXRjaCA9IGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLmNsaWVudFJlY3Q7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRyYWdTdGFydFN1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRCdXMuZHJhZ1N0YXJ0ZWQuc3Vic2NyaWJlKChkcmFnU3RhcnRFdmVudDogRHJhZ0V2ZW50SW50ZXJmYWNlPFQ+KSA9PiB7XG4gICAgICB0aGlzLm9uRHJhZ1N0YXJ0KGRyYWdTdGFydEV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tKHRoaXMuZHJhZ1N0YXJ0U3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbSh0aGlzLmRyYWdNb3ZlU3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbSh0aGlzLmRyYWdFbmRTdWJzY3JpcHRpb24pO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHJhZ0hhbmRsZVJlZ2lzdHJhclNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kcmFnLWhhbmRsZS1yZWdpc3RyYXIuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJEcmFnSGFuZGxlXScsIGhvc3Q6IHsgJ1tjbGFzcy5kcmFnLWhhbmRsZV0nOiAndHJ1ZScgfSB9KVxuZXhwb3J0IGNsYXNzIENsckRyYWdIYW5kbGU8VD4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBAT3B0aW9uYWwoKSBwcml2YXRlIGRyYWdIYW5kbGVSZWdpc3RyYXI6IERyYWdIYW5kbGVSZWdpc3RyYXJTZXJ2aWNlPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdIYW5kbGVSZWdpc3RyYXIpIHtcbiAgICAgIC8vIENsckRyYWdIYW5kbGVSZWdpc3RyYXIgaXMgcHJvdmlkZWQgaW4gQ2xyRHJhZ2dhYmxlIHNvIHdlIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50IGhlcmVcbiAgICAgIC8vIGFzIGNsckRyYWdIYW5kbGUgaXMgcmVxdWlyZWQgdG8gYmUgdXNlZCBvbmx5IGluc2lkZSBvZiBhIGNsckRyYWdnYWJsZSBkaXJlY3RpdmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjbHJEcmFnSGFuZGxlIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBvZiBhIGNsckRyYWdnYWJsZSBkaXJlY3RpdmUuJyk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ0hhbmRsZVJlZ2lzdHJhci5yZWdpc3RlckN1c3RvbUhhbmRsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kcmFnSGFuZGxlUmVnaXN0cmFyLnVucmVnaXN0ZXJDdXN0b21IYW5kbGUoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckRyYWdnYWJsZSB9IGZyb20gJy4vZHJhZ2dhYmxlL2RyYWdnYWJsZSc7XG5pbXBvcnQgeyBDbHJEcm9wcGFibGUgfSBmcm9tICcuL2Ryb3BwYWJsZS9kcm9wcGFibGUnO1xuaW1wb3J0IHsgQ2xySWZEcmFnZ2VkIH0gZnJvbSAnLi9pZi1kcmFnZ2VkJztcbmltcG9ydCB7IENsckRyYWdIYW5kbGUgfSBmcm9tICcuL2RyYWctaGFuZGxlJztcbmltcG9ydCB7IENsckRyYWdnYWJsZUdob3N0IH0gZnJvbSAnLi9kcmFnZ2FibGUtZ2hvc3QnO1xuXG5leHBvcnQgY29uc3QgQ0xSX0RSQUdfQU5EX0RST1BfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbXG4gIENsckRyYWdnYWJsZSxcbiAgQ2xyRHJvcHBhYmxlLFxuICBDbHJJZkRyYWdnZWQsXG4gIENsckRyYWdIYW5kbGUsXG4gIENsckRyYWdnYWJsZUdob3N0LFxuXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9EUkFHX0FORF9EUk9QX0RJUkVDVElWRVNdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtDbHJEcmFnZ2FibGVHaG9zdF0sXG4gIGV4cG9ydHM6IFtDTFJfRFJBR19BTkRfRFJPUF9ESVJFQ1RJVkVTXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRHJhZ0FuZERyb3BNb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUsIE9wdGlvbmFsLCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUm9vdERyb3Bkb3duU2VydmljZSB7XG4gIHByaXZhdGUgX2NoYW5nZXM6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGdldCBjaGFuZ2VzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgY2xvc2VNZW51cygpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFuZ2VzLm5leHQoZmFsc2UpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbHJSb290RHJvcGRvd25GYWN0b3J5KGV4aXN0aW5nOiBSb290RHJvcGRvd25TZXJ2aWNlKSB7XG4gIHJldHVybiBleGlzdGluZyB8fCBuZXcgUm9vdERyb3Bkb3duU2VydmljZSgpO1xufVxuXG5leHBvcnQgY29uc3QgUk9PVF9EUk9QRE9XTl9QUk9WSURFUiA9IHtcbiAgcHJvdmlkZTogUm9vdERyb3Bkb3duU2VydmljZSxcbiAgdXNlRmFjdG9yeTogY2xyUm9vdERyb3Bkb3duRmFjdG9yeSxcbiAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIFJvb3REcm9wZG93blNlcnZpY2VdXSxcbn07XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJZk9wZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZGl0aW9uYWwvaWYtb3Blbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBPUE9WRVJfSE9TVF9BTkNIT1IgfSBmcm9tICcuLi9jb21tb24vcG9wb3Zlci1ob3N0LWFuY2hvci50b2tlbic7XG5cbmltcG9ydCB7IFJPT1RfRFJPUERPV05fUFJPVklERVIsIFJvb3REcm9wZG93blNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9kcm9wZG93bi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWRyb3Bkb3duJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+JyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuZHJvcGRvd25dJzogJ3RydWUnLFxuICAgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyBhcyBzb29uIGFzIHdlIHN0b3Agc3VwcG9ydGluZyB0aGlzIG9sZCA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPiBzeW50YXhcbiAgICAnW2NsYXNzLm9wZW5dJzogJ2lmT3BlblNlcnZpY2Uub3BlbicsXG4gIH0sXG4gIHByb3ZpZGVyczogW0lmT3BlblNlcnZpY2UsIFJPT1RfRFJPUERPV05fUFJPVklERVIsIHsgcHJvdmlkZTogUE9QT1ZFUl9IT1NUX0FOQ0hPUiwgdXNlRXhpc3Rpbmc6IEVsZW1lbnRSZWYgfV0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRyb3Bkb3duIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBTa2lwU2VsZigpXG4gICAgQE9wdGlvbmFsKClcbiAgICBwdWJsaWMgcGFyZW50OiBDbHJEcm9wZG93bixcbiAgICBwdWJsaWMgaWZPcGVuU2VydmljZTogSWZPcGVuU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgZHJvcGRvd25TZXJ2aWNlOiBSb290RHJvcGRvd25TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGRyb3Bkb3duU2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiAodGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW4gPSB2YWx1ZSkpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChpZk9wZW5TZXJ2aWNlLm9wZW5DaGFuZ2Uuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKSk7XG4gIH1cblxuICBASW5wdXQoJ2NsckNsb3NlTWVudU9uSXRlbUNsaWNrJykgaXNNZW51Q2xvc2FibGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckRyb3Bkb3duIH0gZnJvbSAnLi9kcm9wZG93bic7XG5pbXBvcnQgeyBSb290RHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvZHJvcGRvd24uc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJEcm9wZG93bkl0ZW1dJywgaG9zdDogeyAnW2NsYXNzLmRyb3Bkb3duLWl0ZW1dJzogJ3RydWUnIH0gfSlcbmV4cG9ydCBjbGFzcyBDbHJEcm9wZG93bkl0ZW0gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkcm9wZG93bjogQ2xyRHJvcGRvd24sXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9kcm9wZG93blNlcnZpY2U6IFJvb3REcm9wZG93blNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCAoKSA9PiB0aGlzLm9uRHJvcGRvd25JdGVtQ2xpY2soKSk7XG4gIH1cblxuICBvbkRyb3Bkb3duSXRlbUNsaWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duLmlzTWVudUNsb3NhYmxlICYmICF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgICB0aGlzLl9kcm9wZG93blNlcnZpY2UuY2xvc2VNZW51cygpO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT3B0aW9uYWwsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFBvcG92ZXIgfSBmcm9tICcuLi9jb21tb24vYWJzdHJhY3QtcG9wb3Zlcic7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2NvbW1vbi9wb3BvdmVyJztcbmltcG9ydCB7IFBPUE9WRVJfSE9TVF9BTkNIT1IgfSBmcm9tICcuLi9jb21tb24vcG9wb3Zlci1ob3N0LWFuY2hvci50b2tlbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1kcm9wZG93bi1tZW51JyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmRyb3Bkb3duLW1lbnVdJzogJ3RydWUnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJEcm9wZG93bk1lbnUgZXh0ZW5kcyBBYnN0cmFjdFBvcG92ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFBPUE9WRVJfSE9TVF9BTkNIT1IpXG4gICAgcGFyZW50SG9zdDogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBTa2lwU2VsZigpXG4gICAgbmVzdGVkOiBDbHJEcm9wZG93bk1lbnVcbiAgKSB7XG4gICAgaWYgKCFwYXJlbnRIb3N0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nsci1kcm9wZG93bi1tZW51IHNob3VsZCBvbmx5IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xyLWRyb3Bkb3duJyk7XG4gICAgfVxuICAgIHN1cGVyKGluamVjdG9yLCBwYXJlbnRIb3N0KTtcbiAgICBpZiAoIW5lc3RlZCkge1xuICAgICAgLy8gRGVmYXVsdCBwb3NpdGlvbmluZyBmb3Igbm9ybWFsIGRyb3Bkb3duIGlzIGJvdHRvbS1sZWZ0XG4gICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuQk9UVE9NX0xFRlQ7XG4gICAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LkxFRlRfVE9QO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHBvc2l0aW9uaW5nIGZvciBuZXN0ZWQgZHJvcGRvd24gaXMgcmlnaHQtdG9wXG4gICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuUklHSFRfVE9QO1xuICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5MRUZUX1RPUDtcbiAgICB9XG4gICAgdGhpcy5wb3BvdmVyT3B0aW9ucy5hbGxvd011bHRpcGxlT3BlbiA9IHRydWU7XG4gICAgdGhpcy5jbG9zZU9uT3V0c2lkZUNsaWNrID0gdHJ1ZTtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyUG9zaXRpb24nKVxuICBzZXQgcG9zaXRpb24ocG9zaXRpb246IHN0cmluZykge1xuICAgIC8vIHNldCB0aGUgcG9wb3ZlciB2YWx1ZXMgYmFzZWQgb24gbWVudSBwb3NpdGlvblxuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5UT1BfUklHSFQ7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuUklHSFRfQk9UVE9NO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LlRPUF9MRUZUO1xuICAgICAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LkxFRlRfQk9UVE9NO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5CT1RUT01fUklHSFQ7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuUklHSFRfVE9QO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LkJPVFRPTV9MRUZUO1xuICAgICAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LkxFRlRfVE9QO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0LXRvcCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5SSUdIVF9UT1A7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuTEVGVF9UT1A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQtYm90dG9tJzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LlJJR0hUX0JPVFRPTTtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5MRUZUX0JPVFRPTTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0LXRvcCc6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5MRUZUX1RPUDtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5SSUdIVF9UT1A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdC1ib3R0b20nOlxuICAgICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuTEVGVF9CT1RUT007XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuUklHSFRfQk9UVE9NO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5CT1RUT01fTEVGVDtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5MRUZUX1RPUDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJZk9wZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZGl0aW9uYWwvaWYtb3Blbi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ2xyRHJvcGRvd24gfSBmcm9tICcuL2Ryb3Bkb3duJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIFdlIHN1cHBvcnQgYm90aCBzZWxlY3RvcnMgZm9yIGxlZ2FjeSByZWFzb25zXG4gIHNlbGVjdG9yOiAnW2NsckRyb3Bkb3duVHJpZ2dlcl0sW2NsckRyb3Bkb3duVG9nZ2xlXScsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmRyb3Bkb3duLXRvZ2dsZV0nOiAnaXNSb290TGV2ZWxUb2dnbGUnLFxuICAgICdbY2xhc3MuZHJvcGRvd24taXRlbV0nOiAnIWlzUm9vdExldmVsVG9nZ2xlJyxcbiAgICAnW2NsYXNzLmV4cGFuZGFibGVdJzogJyFpc1Jvb3RMZXZlbFRvZ2dsZScsXG4gICAgJ1tjbGFzcy5hY3RpdmVdJzogJ2FjdGl2ZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsckRyb3Bkb3duVHJpZ2dlciB7XG4gIHB1YmxpYyBpc1Jvb3RMZXZlbFRvZ2dsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoZHJvcGRvd246IENsckRyb3Bkb3duLCBwcml2YXRlIGlmT3BlblNlcnZpY2U6IElmT3BlblNlcnZpY2UpIHtcbiAgICAvLyBpZiB0aGUgY29udGFpbmluZyBkcm9wZG93biBoYXMgYSBwYXJlbnQsIHRoZW4gdGhpcyBpcyBub3QgdGhlIHJvb3QgbGV2ZWwgb25lXG4gICAgaWYgKGRyb3Bkb3duLnBhcmVudCkge1xuICAgICAgdGhpcy5pc1Jvb3RMZXZlbFRvZ2dsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWZPcGVuU2VydmljZS5vcGVuO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkRyb3Bkb3duVHJpZ2dlckNsaWNrKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmlmT3BlblNlcnZpY2UudG9nZ2xlV2l0aEV2ZW50KGV2ZW50KTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xySWNvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyQ29uZGl0aW9uYWxNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9jb25kaXRpb25hbC9jb25kaXRpb25hbC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uUG9wb3Zlck1vZHVsZSB9IGZyb20gJy4uL2NvbW1vbi9wb3BvdmVyLm1vZHVsZSc7XG5cbmltcG9ydCB7IENsckRyb3Bkb3duIH0gZnJvbSAnLi9kcm9wZG93bic7XG5pbXBvcnQgeyBDbHJEcm9wZG93bkl0ZW0gfSBmcm9tICcuL2Ryb3Bkb3duLWl0ZW0nO1xuaW1wb3J0IHsgQ2xyRHJvcGRvd25NZW51IH0gZnJvbSAnLi9kcm9wZG93bi1tZW51JztcbmltcG9ydCB7IENsckRyb3Bkb3duVHJpZ2dlciB9IGZyb20gJy4vZHJvcGRvd24tdHJpZ2dlcic7XG5cbmV4cG9ydCBjb25zdCBDTFJfRFJPUERPV05fRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyRHJvcGRvd24sIENsckRyb3Bkb3duTWVudSwgQ2xyRHJvcGRvd25UcmlnZ2VyLCBDbHJEcm9wZG93bkl0ZW1dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDbHJDb21tb25Qb3BvdmVyTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQ0xSX0RST1BET1dOX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX0RST1BET1dOX0RJUkVDVElWRVMsIENsckNvbmRpdGlvbmFsTW9kdWxlLCBDbHJJY29uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyRHJvcGRvd25Nb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuLy8gQFRPRE8gTWFrZSB0aGlzIGFuIGVudW1cbmV4cG9ydCBjb25zdCBBTEVSVF9UWVBFUzogc3RyaW5nW10gPSBbJ2luZm8nLCAnd2FybmluZycsICdkYW5nZXInLCAnc3VjY2VzcyddO1xuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFsZXJ0SW5mb09iamVjdCB9IGZyb20gJy4uL3V0aWxzL2FsZXJ0LWluZm8tb2JqZWN0JztcbmltcG9ydCB7IEFMRVJUX1RZUEVTIH0gZnJvbSAnLi4vdXRpbHMvYWxlcnQtdHlwZXMnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFsZXJ0SWNvbkFuZFR5cGVzU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5ncykge31cblxuICBwcml2YXRlIGRlZmF1bHRJY29uU2hhcGUgPSAnaW5mby1jaXJjbGUnO1xuICBwcml2YXRlIF9hbGVydEljb25TaGFwZSA9ICcnO1xuICBwcml2YXRlIF9hbGVydFR5cGUgPSAnaW5mbyc7XG5cbiAgZ2V0IGFsZXJ0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hbGVydFR5cGU7XG4gIH1cbiAgc2V0IGFsZXJ0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIGlmIChBTEVSVF9UWVBFUy5pbmRleE9mKHZhbCkgPiAtMSkge1xuICAgICAgdGhpcy5fYWxlcnRUeXBlID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGVydEljb25TaGFwZSgpOiBzdHJpbmcge1xuICAgIGlmICgnJyA9PT0gdGhpcy5fYWxlcnRJY29uU2hhcGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmljb25JbmZvRnJvbVR5cGUodGhpcy5fYWxlcnRUeXBlKS5zaGFwZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FsZXJ0SWNvblNoYXBlO1xuICB9XG4gIHNldCBhbGVydEljb25TaGFwZSh2YWw6IHN0cmluZykge1xuICAgIGlmICghdmFsKSB7XG4gICAgICB0aGlzLl9hbGVydEljb25TaGFwZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAodmFsICE9PSB0aGlzLl9hbGVydEljb25TaGFwZSkge1xuICAgICAgdGhpcy5fYWxlcnRJY29uU2hhcGUgPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsZXJ0SWNvblRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWNvbkluZm9Gcm9tVHlwZSh0aGlzLl9hbGVydFR5cGUpLnRpdGxlO1xuICB9XG5cbiAgcHVibGljIGljb25JbmZvRnJvbVR5cGUodHlwZTogc3RyaW5nKTogQWxlcnRJbmZvT2JqZWN0IHtcbiAgICBjb25zdCByZXR1cm5PYmogPSB7IHNoYXBlOiAnJywgY3NzQ2xhc3M6ICcnLCB0aXRsZTogJycgfTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybk9iai5zaGFwZSA9ICdleGNsYW1hdGlvbi10cmlhbmdsZSc7XG4gICAgICAgIHJldHVybk9iai5jc3NDbGFzcyA9ICdhbGVydC13YXJuaW5nJztcbiAgICAgICAgcmV0dXJuT2JqLnRpdGxlID0gdGhpcy5jb21tb25TdHJpbmdzLndhcm5pbmc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGFuZ2VyJzpcbiAgICAgICAgcmV0dXJuT2JqLnNoYXBlID0gJ2V4Y2xhbWF0aW9uLWNpcmNsZSc7XG4gICAgICAgIHJldHVybk9iai5jc3NDbGFzcyA9ICdhbGVydC1kYW5nZXInO1xuICAgICAgICByZXR1cm5PYmoudGl0bGUgPSB0aGlzLmNvbW1vblN0cmluZ3MuZGFuZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICByZXR1cm5PYmouc2hhcGUgPSAnY2hlY2stY2lyY2xlJztcbiAgICAgICAgcmV0dXJuT2JqLmNzc0NsYXNzID0gJ2FsZXJ0LXN1Y2Nlc3MnO1xuICAgICAgICByZXR1cm5PYmoudGl0bGUgPSB0aGlzLmNvbW1vblN0cmluZ3Muc3VjY2VzcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm5PYmouc2hhcGUgPSB0aGlzLmRlZmF1bHRJY29uU2hhcGU7XG4gICAgICAgIHJldHVybk9iai5jc3NDbGFzcyA9ICdhbGVydC1pbmZvJztcbiAgICAgICAgcmV0dXJuT2JqLnRpdGxlID0gdGhpcy5jb21tb25TdHJpbmdzLmluZm87XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5PYmo7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IEluamVjdGFibGUsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENsckFsZXJ0IH0gZnJvbSAnLi4vYWxlcnQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTXVsdGlBbGVydFNlcnZpY2Uge1xuICBwcml2YXRlIGFsbEFsZXJ0czogUXVlcnlMaXN0PENsckFsZXJ0PiA9IG5ldyBRdWVyeUxpc3Q8Q2xyQWxlcnQ+KCk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX2N1cnJlbnQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzZXJ2YWJsZSB0aGF0IGxldHMgb3RoZXIgY2xhc3NlcyBzdWJzY3JpYmUgdG8gY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBfY2hhbmdlID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICBwdWJsaWMgZ2V0IGNoYW5nZXMoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gIH1cbiAgc2V0IGN1cnJlbnQoaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCAhPT0gdGhpcy5fY3VycmVudCkge1xuICAgICAgdGhpcy5fY3VycmVudCA9IGluZGV4O1xuICAgICAgdGhpcy5fY2hhbmdlLm5leHQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3RpdmVBbGVydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsQWxlcnRzLmZpbHRlcihhbGVydCA9PiAhYWxlcnQuX2Nsb3NlZCk7XG4gIH1cblxuICBnZXQgY3VycmVudEFsZXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUFsZXJ0c1t0aGlzLmN1cnJlbnRdO1xuICB9XG5cbiAgc2V0IGN1cnJlbnRBbGVydChhbGVydDogQ2xyQWxlcnQpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmFjdGl2ZUFsZXJ0cy5pbmRleE9mKGFsZXJ0KTtcbiAgfVxuXG4gIGdldCBjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVBbGVydHMubGVuZ3RoO1xuICB9XG5cbiAgbWFuYWdlKGFsZXJ0czogUXVlcnlMaXN0PENsckFsZXJ0Pikge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5hbGxBbGVydHMgPSBhbGVydHM7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmFsbEFsZXJ0cy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50ID49IHRoaXMuYWxsQWxlcnRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBNYXRoLm1heCgwLCB0aGlzLmFsbEFsZXJ0cy5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5leHQoKSB7XG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50ID09PSB0aGlzLmFjdGl2ZUFsZXJ0cy5sZW5ndGggLSAxID8gMCA6IHRoaXMuY3VycmVudCArIDE7XG4gIH1cblxuICBwcmV2aW91cygpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVBbGVydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuY3VycmVudCA9PT0gMCA/IHRoaXMuYWN0aXZlQWxlcnRzLmxlbmd0aCAtIDEgOiB0aGlzLmN1cnJlbnQgLSAxO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5wcmV2aW91cygpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPcHRpb25hbCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8vIHByb3ZpZGVyc1xuaW1wb3J0IHsgQWxlcnRJY29uQW5kVHlwZXNTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvaWNvbi1hbmQtdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBNdWx0aUFsZXJ0U2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL211bHRpLWFsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWFsZXJ0JyxcbiAgcHJvdmlkZXJzOiBbQWxlcnRJY29uQW5kVHlwZXNTZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0Lmh0bWwnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJBbGVydCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpY29uU2VydmljZTogQWxlcnRJY29uQW5kVHlwZXNTZXJ2aWNlLFxuICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBtdWx0aUFsZXJ0U2VydmljZTogTXVsdGlBbGVydFNlcnZpY2UsXG4gICAgcHVibGljIGNvbW1vblN0cmluZ3M6IENsckNvbW1vblN0cmluZ3NcbiAgKSB7fVxuXG4gIEBJbnB1dCgnY2xyQWxlcnRTaXplU21hbGwnKSBpc1NtYWxsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgnY2xyQWxlcnRDbG9zYWJsZScpIGNsb3NhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCdjbHJBbGVydEFwcExldmVsJykgaXNBcHBMZXZlbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgnY2xyQWxlcnRDbG9zZWQnKSBfY2xvc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoJ2NsckFsZXJ0Q2xvc2VkQ2hhbmdlJykgX2Nsb3NlZENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIEBJbnB1dCgnY2xyQWxlcnRUeXBlJylcbiAgc2V0IGFsZXJ0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuaWNvblNlcnZpY2UuYWxlcnRUeXBlID0gdmFsO1xuICB9XG4gIGdldCBhbGVydFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5hbGVydFR5cGU7XG4gIH1cblxuICBASW5wdXQoJ2NsckFsZXJ0SWNvbicpXG4gIHNldCBhbGVydEljb25TaGFwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5pY29uU2VydmljZS5hbGVydEljb25TaGFwZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGFsZXJ0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5pY29uSW5mb0Zyb21UeXBlKHRoaXMuaWNvblNlcnZpY2UuYWxlcnRUeXBlKS5jc3NDbGFzcztcbiAgfVxuXG4gIHByaXZhdGUgcHJldmlvdXNseUhpZGRlbiA9IGZhbHNlO1xuICBwcml2YXRlIGhpZGRlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGV0ZWN0Q2hhbmdlc0lmTmVlZGVkKCkge1xuICAgIGlmICh0aGlzLnByZXZpb3VzbHlIaWRkZW4gIT09IHRoaXMuaGlkZGVuKSB7XG4gICAgICB0aGlzLnByZXZpb3VzbHlIaWRkZW4gPSB0aGlzLmhpZGRlbjtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNIaWRkZW4oKSB7XG4gICAgaWYgKHRoaXMubXVsdGlBbGVydFNlcnZpY2UpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmN1cnJlbnRBbGVydCA9PT0gdGhpcykge1xuICAgICAgICBpZiAodGhpcy5oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnByZXZpb3VzbHlIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaWRkZW4gPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNseUhpZGRlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLmRldGVjdENoYW5nZXNJZk5lZWRlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmhpZGRlbjtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbG9zYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLm11bHRpQWxlcnRTZXJ2aWNlKSB7XG4gICAgICB0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuX2Nsb3NlZENoYW5nZWQuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIG9wZW4oKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5fY2xvc2VkQ2hhbmdlZC5lbWl0KGZhbHNlKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0SWNvbkFuZFR5cGVzU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2ljb24tYW5kLXR5cGVzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItYWxlcnQtaXRlbScsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydC1pY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxjbHItaWNvbiBjbGFzcz1cImFsZXJ0LWljb25cIiBcbiAgICAgICAgICAgICAgW2F0dHIuc2hhcGVdPVwiaWNvblNlcnZpY2UuYWxlcnRJY29uU2hhcGVcIiBcbiAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiaWNvblNlcnZpY2UuYWxlcnRJY29uVGl0bGVcIj48L2Nsci1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIGhvc3Q6IHsgY2xhc3M6ICdhbGVydC1pdGVtJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJBbGVydEl0ZW0ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaWNvblNlcnZpY2U6IEFsZXJ0SWNvbkFuZFR5cGVzU2VydmljZSkge31cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsckFsZXJ0IH0gZnJvbSAnLi9hbGVydCc7XG5pbXBvcnQgeyBNdWx0aUFsZXJ0U2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL211bHRpLWFsZXJ0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItYWxlcnRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0cy5odG1sJyxcbiAgcHJvdmlkZXJzOiBbTXVsdGlBbGVydFNlcnZpY2VdLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5hbGVydHNdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuYWxlcnQtZGFuZ2VyXSc6IFwidGhpcy5jdXJyZW50QWxlcnRUeXBlID09ICdkYW5nZXInXCIsXG4gICAgJ1tjbGFzcy5hbGVydC1pbmZvXSc6IFwidGhpcy5jdXJyZW50QWxlcnRUeXBlID09ICdpbmZvJ1wiLFxuICAgICdbY2xhc3MuYWxlcnQtc3VjY2Vzc10nOiBcInRoaXMuY3VycmVudEFsZXJ0VHlwZSA9PSAnc3VjY2VzcydcIixcbiAgICAnW2NsYXNzLmFsZXJ0LXdhcm5pbmddJzogXCJ0aGlzLmN1cnJlbnRBbGVydFR5cGUgPT0gJ3dhcm5pbmcnXCIsXG4gIH0sXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrIH0nXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQWxlcnRzIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgQENvbnRlbnRDaGlsZHJlbihDbHJBbGVydCkgYWxsQWxlcnRzOiBRdWVyeUxpc3Q8Q2xyQWxlcnQ+O1xuXG4gIC8qKlxuICAgKiBJbnB1dC9PdXRwdXQgdG8gc3VwcG9ydCB0d28gd2F5IGJpbmRpbmcgb24gY3VycmVudCBhbGVydCBpbmRleFxuICAgKi9cbiAgQElucHV0KCdjbHJDdXJyZW50QWxlcnRJbmRleCcpXG4gIHB1YmxpYyBzZXQgX2lucHV0Q3VycmVudEluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5tdWx0aUFsZXJ0U2VydmljZS5jdXJyZW50ID0gaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgnY2xyQ3VycmVudEFsZXJ0SW5kZXhDaGFuZ2UnKSBwdWJsaWMgY3VycmVudEFsZXJ0SW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oZmFsc2UpO1xuXG4gIHNldCBjdXJyZW50QWxlcnRJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5tdWx0aUFsZXJ0U2VydmljZS5jdXJyZW50ID0gaW5kZXg7XG4gIH1cbiAgZ2V0IGN1cnJlbnRBbGVydEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmN1cnJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogSW5wdXQvT3V0cHV0IHRvIHN1cHBvcnQgdHdvIHdheSBiaW5kaW5nIG9uIGN1cnJlbnQgYWxlcnQgaW5zdGFuY2VcbiAgICovXG4gIEBJbnB1dCgnY2xyQ3VycmVudEFsZXJ0JylcbiAgc2V0IGN1cnJlbnRBbGVydChhbGVydDogQ2xyQWxlcnQpIHtcbiAgICBpZiAoYWxlcnQpIHtcbiAgICAgIHRoaXMubXVsdGlBbGVydFNlcnZpY2UuY3VycmVudEFsZXJ0ID0gYWxlcnQ7XG4gICAgfVxuICB9XG4gIGdldCBjdXJyZW50QWxlcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlBbGVydFNlcnZpY2UuY3VycmVudEFsZXJ0O1xuICB9XG4gIEBPdXRwdXQoJ2NsckN1cnJlbnRBbGVydENoYW5nZScpIHB1YmxpYyBjdXJyZW50QWxlcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENsckFsZXJ0PihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB3ZSBhcmUgb25seSBkZWFsaW5nIHdpdGggYWxlcnRzIHRoYXQgaGF2ZSBub3QgYmVlbiBjbG9zZWQgeWV0XG4gICAqL1xuICBnZXQgYWxlcnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFsbEFsZXJ0cy5maWx0ZXIoYWxlcnQgPT4ge1xuICAgICAgcmV0dXJuIGFsZXJ0LmlzSGlkZGVuID09PSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjdXJyZW50QWxlcnRUeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubXVsdGlBbGVydFNlcnZpY2UuY3VycmVudEFsZXJ0KSB7XG4gICAgICByZXR1cm4gdGhpcy5tdWx0aUFsZXJ0U2VydmljZS5jdXJyZW50QWxlcnQuYWxlcnRUeXBlO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbXVsdGlBbGVydFNlcnZpY2U6IE11bHRpQWxlcnRTZXJ2aWNlKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLm1hbmFnZSh0aGlzLmFsbEFsZXJ0cyk7XG4gICAgdGhpcy5tdWx0aUFsZXJ0U2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRBbGVydEluZGV4Q2hhbmdlLm5leHQoaW5kZXgpO1xuICAgICAgdGhpcy5jdXJyZW50QWxlcnRDaGFuZ2UubmV4dCh0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmN1cnJlbnRBbGVydCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2xyQWxlcnQgfSBmcm9tICcuL2FsZXJ0JztcbmltcG9ydCB7IE11bHRpQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvbXVsdGktYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBDbHJDb21tb25TdHJpbmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItYWxlcnRzLXBhZ2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0cy1wYWdlci5odG1sJyxcbiAgaG9zdDogeyAnW2NsYXNzLmFsZXJ0cy1wYWdlcl0nOiAndHJ1ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyQWxlcnRzUGFnZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbXVsdGlBbGVydFNlcnZpY2VDaGFuZ2VzOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIElucHV0L091dHB1dCB0byBzdXBwb3J0IHR3byB3YXkgYmluZGluZyBvbiBjdXJyZW50IGFsZXJ0IGluc3RhbmNlXG4gICAqL1xuICBASW5wdXQoJ2NsckN1cnJlbnRBbGVydCcpXG4gIHNldCBjdXJyZW50QWxlcnQoYWxlcnQ6IENsckFsZXJ0KSB7XG4gICAgaWYgKGFsZXJ0KSB7XG4gICAgICB0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmN1cnJlbnRBbGVydCA9IGFsZXJ0O1xuICAgIH1cbiAgfVxuICBnZXQgY3VycmVudEFsZXJ0KCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmN1cnJlbnRBbGVydDtcbiAgfVxuXG4gIEBPdXRwdXQoJ2NsckN1cnJlbnRBbGVydENoYW5nZScpIGN1cnJlbnRBbGVydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xyQWxlcnQ+KGZhbHNlKTtcblxuICAvKipcbiAgICogSW5wdXQvT3V0cHV0IHRvIHN1cHBvcnQgdHdvIHdheSBiaW5kaW5nIG9uIGN1cnJlbnQgYWxlcnQgaW5kZXhcbiAgICovXG4gIEBJbnB1dCgnY2xyQ3VycmVudEFsZXJ0SW5kZXgnKVxuICBzZXQgY3VycmVudEFsZXJ0SW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubXVsdGlBbGVydFNlcnZpY2UuY3VycmVudCA9IGluZGV4O1xuICB9XG4gIGdldCBjdXJyZW50QWxlcnRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aUFsZXJ0U2VydmljZS5jdXJyZW50O1xuICB9XG5cbiAgQE91dHB1dCgnY2xyQ3VycmVudEFsZXJ0SW5kZXhDaGFuZ2UnKSBjdXJyZW50QWxlcnRJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtdWx0aUFsZXJ0U2VydmljZTogTXVsdGlBbGVydFNlcnZpY2UsIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubXVsdGlBbGVydFNlcnZpY2VDaGFuZ2VzID0gdGhpcy5tdWx0aUFsZXJ0U2VydmljZS5jaGFuZ2VzLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRBbGVydEluZGV4Q2hhbmdlLmVtaXQoaW5kZXgpO1xuICAgICAgdGhpcy5jdXJyZW50QWxlcnRDaGFuZ2UuZW1pdCh0aGlzLm11bHRpQWxlcnRTZXJ2aWNlLmFjdGl2ZUFsZXJ0c1tpbmRleF0pO1xuICAgIH0pO1xuICB9XG5cbiAgcGFnZVVwKCkge1xuICAgIHRoaXMubXVsdGlBbGVydFNlcnZpY2UubmV4dCgpO1xuICB9XG5cbiAgcGFnZURvd24oKSB7XG4gICAgdGhpcy5tdWx0aUFsZXJ0U2VydmljZS5wcmV2aW91cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5tdWx0aUFsZXJ0U2VydmljZUNoYW5nZXMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xySWNvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyRHJvcGRvd25Nb2R1bGUgfSBmcm9tICcuLi8uLi9wb3BvdmVyL2Ryb3Bkb3duL2Ryb3Bkb3duLm1vZHVsZSc7XG5cbmltcG9ydCB7IENsckFsZXJ0IH0gZnJvbSAnLi9hbGVydCc7XG5pbXBvcnQgeyBDbHJBbGVydEl0ZW0gfSBmcm9tICcuL2FsZXJ0LWl0ZW0nO1xuaW1wb3J0IHsgQ2xyQWxlcnRzIH0gZnJvbSAnLi9hbGVydHMnO1xuaW1wb3J0IHsgQ2xyQWxlcnRzUGFnZXIgfSBmcm9tICcuL2FsZXJ0cy1wYWdlcic7XG5cbmV4cG9ydCBjb25zdCBDTFJfQUxFUlRfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyQWxlcnQsIENsckFsZXJ0SXRlbSwgQ2xyQWxlcnRzLCBDbHJBbGVydHNQYWdlcl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENsckljb25Nb2R1bGUsIENsckRyb3Bkb3duTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQ0xSX0FMRVJUX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX0FMRVJUX0RJUkVDVElWRVNdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJBbGVydE1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsckFsZXJ0TW9kdWxlIH0gZnJvbSAnLi9hbGVydC9hbGVydC5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoeyBleHBvcnRzOiBbQ2xyQWxlcnRNb2R1bGVdIH0pXG5leHBvcnQgY2xhc3MgQ2xyRW1waGFzaXNNb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNpdmVOYXZDb2RlcyB7XG4gIHB1YmxpYyBzdGF0aWMgTkFWX0xFVkVMXzE6IG51bWJlciA9IDE7XG4gIHB1YmxpYyBzdGF0aWMgTkFWX0xFVkVMXzI6IG51bWJlciA9IDI7XG4gIHB1YmxpYyBzdGF0aWMgTkFWX0NMT1NFX0FMTDogc3RyaW5nID0gJ05BVl9DTE9TRV9BTEwnO1xuICBwdWJsaWMgc3RhdGljIE5BVl9PUEVOOiBzdHJpbmcgPSAnTkFWX09QRU4nO1xuICBwdWJsaWMgc3RhdGljIE5BVl9DTE9TRTogc3RyaW5nID0gJ05BVl9DTE9TRSc7XG4gIHB1YmxpYyBzdGF0aWMgTkFWX1RPR0dMRTogc3RyaW5nID0gJ05BVl9UT0dHTEUnO1xuICBwdWJsaWMgc3RhdGljIE5BVl9DTEFTU19IQU1CVVJHRVJfTUVOVTogc3RyaW5nID0gJ29wZW4taGFtYnVyZ2VyLW1lbnUnO1xuICBwdWJsaWMgc3RhdGljIE5BVl9DTEFTU19PVkVSRkxPV19NRU5VOiBzdHJpbmcgPSAnb3Blbi1vdmVyZmxvdy1tZW51JztcbiAgcHVibGljIHN0YXRpYyBOQVZfQ0xBU1NfVFJJR0dFUl8xOiBzdHJpbmcgPSAnaGVhZGVyLWhhbWJ1cmdlci10cmlnZ2VyJztcbiAgcHVibGljIHN0YXRpYyBOQVZfQ0xBU1NfVFJJR0dFUl8yOiBzdHJpbmcgPSAnaGVhZGVyLW92ZXJmbG93LXRyaWdnZXInO1xuICBwdWJsaWMgc3RhdGljIE5BVl9DTEFTU19MRVZFTF8xOiBzdHJpbmcgPSAnY2xyLW5hdi1sZXZlbC0xJztcbiAgcHVibGljIHN0YXRpYyBOQVZfQ0xBU1NfTEVWRUxfMjogc3RyaW5nID0gJ2Nsci1uYXYtbGV2ZWwtMic7XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmV4cG9ydCBjbGFzcyBSZXNwb25zaXZlTmF2Q29udHJvbE1lc3NhZ2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb250cm9sQ29kZTogc3RyaW5nLCBwcml2YXRlIF9uYXZMZXZlbDogbnVtYmVyKSB7fVxuXG4gIGdldCBjb250cm9sQ29kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb250cm9sQ29kZTtcbiAgfVxuXG4gIGdldCBuYXZMZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9uYXZMZXZlbDtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXNwb25zaXZlTmF2Q29kZXMgfSBmcm9tICcuLi9yZXNwb25zaXZlLW5hdi1jb2Rlcyc7XG5pbXBvcnQgeyBSZXNwb25zaXZlTmF2Q29udHJvbE1lc3NhZ2UgfSBmcm9tICcuLi9yZXNwb25zaXZlLW5hdi1jb250cm9sLW1lc3NhZ2UnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlc3BvbnNpdmVOYXZpZ2F0aW9uU2VydmljZSB7XG4gIHB1YmxpYyByZXNwb25zaXZlTmF2TGlzdDogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWdpc3Rlck5hdlN1YmplY3Q6IFN1YmplY3Q8bnVtYmVyW10+ID0gbmV3IFN1YmplY3Q8bnVtYmVyW10+KCk7XG4gIHByaXZhdGUgY29udHJvbE5hdlN1YmplY3Q6IFN1YmplY3Q8UmVzcG9uc2l2ZU5hdkNvbnRyb2xNZXNzYWdlPiA9IG5ldyBTdWJqZWN0PFJlc3BvbnNpdmVOYXZDb250cm9sTWVzc2FnZT4oKTtcblxuICBnZXQgcmVnaXN0ZXJlZE5hdnMoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyTmF2U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBuYXZDb250cm9sKCk6IE9ic2VydmFibGU8UmVzcG9uc2l2ZU5hdkNvbnRyb2xNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbE5hdlN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsb3NlQWxsTmF2cygpOyAvLyBXZSBzdGFydCB3aXRoIGFsbCBuYXZzIGNsb3NlZFxuICB9XG5cbiAgcmVnaXN0ZXJOYXYobmF2TGV2ZWw6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghbmF2TGV2ZWwgfHwgdGhpcy5pc05hdlJlZ2lzdGVyZWQobmF2TGV2ZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzcG9uc2l2ZU5hdkxpc3QucHVzaChuYXZMZXZlbCk7XG4gICAgdGhpcy5yZWdpc3Rlck5hdlN1YmplY3QubmV4dCh0aGlzLnJlc3BvbnNpdmVOYXZMaXN0KTtcbiAgfVxuXG4gIGlzTmF2UmVnaXN0ZXJlZChuYXZMZXZlbDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucmVzcG9uc2l2ZU5hdkxpc3QuaW5kZXhPZihuYXZMZXZlbCkgPiAtMSkge1xuICAgICAgY29uc29sZS5lcnJvcignTXVsdGlwbGUgY2xyLW5hdi1sZXZlbCAnICsgbmF2TGV2ZWwgKyAnIGF0dHJpYnV0ZXMgZm91bmQuIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBleGlzdHMnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB1bnJlZ2lzdGVyTmF2KG5hdkxldmVsOiBudW1iZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucmVzcG9uc2l2ZU5hdkxpc3QuaW5kZXhPZihuYXZMZXZlbCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMucmVzcG9uc2l2ZU5hdkxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMucmVnaXN0ZXJOYXZTdWJqZWN0Lm5leHQodGhpcy5yZXNwb25zaXZlTmF2TGlzdCk7XG4gICAgfVxuICB9XG5cbiAgc2VuZENvbnRyb2xNZXNzYWdlKGNvbnRyb2xDb2RlOiBzdHJpbmcsIG5hdkxldmVsOiBudW1iZXIpIHtcbiAgICBjb25zdCBtZXNzYWdlOiBSZXNwb25zaXZlTmF2Q29udHJvbE1lc3NhZ2UgPSBuZXcgUmVzcG9uc2l2ZU5hdkNvbnRyb2xNZXNzYWdlKGNvbnRyb2xDb2RlLCBuYXZMZXZlbCk7XG4gICAgdGhpcy5jb250cm9sTmF2U3ViamVjdC5uZXh0KG1lc3NhZ2UpO1xuICB9XG5cbiAgY2xvc2VBbGxOYXZzKCkge1xuICAgIGNvbnN0IG1lc3NhZ2U6IFJlc3BvbnNpdmVOYXZDb250cm9sTWVzc2FnZSA9IG5ldyBSZXNwb25zaXZlTmF2Q29udHJvbE1lc3NhZ2UoXG4gICAgICBSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMT1NFX0FMTCxcbiAgICAgIC05OTlcbiAgICApO1xuICAgIHRoaXMuY29udHJvbE5hdlN1YmplY3QubmV4dChtZXNzYWdlKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlc3BvbnNpdmVOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25hdi9wcm92aWRlcnMvcmVzcG9uc2l2ZS1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzcG9uc2l2ZU5hdkNvZGVzIH0gZnJvbSAnLi4vbmF2L3Jlc3BvbnNpdmUtbmF2LWNvZGVzJztcbmltcG9ydCB7IFJlc3BvbnNpdmVOYXZDb250cm9sTWVzc2FnZSB9IGZyb20gJy4uL25hdi9yZXNwb25zaXZlLW5hdi1jb250cm9sLW1lc3NhZ2UnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdjbHItbWFpbi1jb250YWluZXInLCBob3N0OiB7ICdbY2xhc3MubWFpbi1jb250YWluZXJdJzogJ3RydWUnIH0gfSlcbmV4cG9ydCBjbGFzcyBDbHJNYWluQ29udGFpbmVyIGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfY2xhc3NMaXN0OiBET01Ub2tlbkxpc3Q7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZXNwb25zaXZlTmF2U2VydmljZTogUmVzcG9uc2l2ZU5hdmlnYXRpb25TZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2NsYXNzTGlzdCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5yZXNwb25zaXZlTmF2U2VydmljZS5uYXZDb250cm9sLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobWVzc2FnZTogUmVzcG9uc2l2ZU5hdkNvbnRyb2xNZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc01lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvY2Vzc01lc3NhZ2UobWVzc2FnZTogUmVzcG9uc2l2ZU5hdkNvbnRyb2xNZXNzYWdlKTogdm9pZCB7XG4gICAgbGV0IG5hdkNsYXNzOiBzdHJpbmcgPSBSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMQVNTX0hBTUJVUkdFUl9NRU5VO1xuICAgIGlmIChtZXNzYWdlLmNvbnRyb2xDb2RlID09PSBSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMT1NFX0FMTCkge1xuICAgICAgdGhpcy5fY2xhc3NMaXN0LnJlbW92ZShSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMQVNTX0hBTUJVUkdFUl9NRU5VKTtcbiAgICAgIHRoaXMuX2NsYXNzTGlzdC5yZW1vdmUoUmVzcG9uc2l2ZU5hdkNvZGVzLk5BVl9DTEFTU19PVkVSRkxPV19NRU5VKTtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubmF2TGV2ZWwgPT09IFJlc3BvbnNpdmVOYXZDb2Rlcy5OQVZfTEVWRUxfMSkge1xuICAgICAgdGhpcy5jb250cm9sTmF2KG1lc3NhZ2UuY29udHJvbENvZGUsIG5hdkNsYXNzKTtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubmF2TGV2ZWwgPT09IFJlc3BvbnNpdmVOYXZDb2Rlcy5OQVZfTEVWRUxfMikge1xuICAgICAgbmF2Q2xhc3MgPSBSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMQVNTX09WRVJGTE9XX01FTlU7XG4gICAgICB0aGlzLmNvbnRyb2xOYXYobWVzc2FnZS5jb250cm9sQ29kZSwgbmF2Q2xhc3MpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnRyb2xOYXYoY29udHJvbENvZGU6IHN0cmluZywgbmF2Q2xhc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChjb250cm9sQ29kZSA9PT0gUmVzcG9uc2l2ZU5hdkNvZGVzLk5BVl9PUEVOKSB7XG4gICAgICB0aGlzLl9jbGFzc0xpc3QuYWRkKG5hdkNsYXNzKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2xDb2RlID09PSBSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMT1NFKSB7XG4gICAgICB0aGlzLl9jbGFzc0xpc3QucmVtb3ZlKG5hdkNsYXNzKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2xDb2RlID09PSBSZXNwb25zaXZlTmF2Q29kZXMuTkFWX1RPR0dMRSkge1xuICAgICAgdGhpcy5fY2xhc3NMaXN0LnRvZ2dsZShuYXZDbGFzcyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9pY29uL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IENsck1haW5Db250YWluZXIgfSBmcm9tICcuL21haW4tY29udGFpbmVyJztcblxuZXhwb3J0IGNvbnN0IENMUl9MQVlPVVRfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyTWFpbkNvbnRhaW5lcl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENsckljb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDTFJfTEFZT1VUX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX0xBWU9VVF9ESVJFQ1RJVkVTXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyTWFpbkNvbnRhaW5lck1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXaWxseVdvbmthIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY2hvY29sYXRlL3dpbGx5LXdvbmthJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnY2xyLW1haW4tY29udGFpbmVyJyB9KVxuZXhwb3J0IGNsYXNzIE1haW5Db250YWluZXJXaWxseVdvbmthIGV4dGVuZHMgV2lsbHlXb25rYSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9vbXBhTG9vbXBhIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY2hvY29sYXRlL29vbXBhLWxvb21wYSc7XG5pbXBvcnQgeyBSZXNwb25zaXZlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9wcm92aWRlcnMvcmVzcG9uc2l2ZS1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFpbkNvbnRhaW5lcldpbGx5V29ua2EgfSBmcm9tICcuL21haW4tY29udGFpbmVyLXdpbGx5LXdvbmthJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnY2xyLWhlYWRlcicgfSlcbmV4cG9ydCBjbGFzcyBOYXZEZXRlY3Rpb25Pb21wYUxvb21wYSBleHRlbmRzIE9vbXBhTG9vbXBhIHtcbiAgcHJpdmF0ZSByZXNwb25zaXZlTmF2U2VydmljZTogUmVzcG9uc2l2ZU5hdmlnYXRpb25TZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgd2lsbHlXb25rYTogTWFpbkNvbnRhaW5lcldpbGx5V29ua2EsXG4gICAgcmVzcG9uc2l2ZU5hdlNlcnZpY2U6IFJlc3BvbnNpdmVOYXZpZ2F0aW9uU2VydmljZVxuICApIHtcbiAgICBpZiAoIXdpbGx5V29ua2EpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xyLWhlYWRlciBzaG91bGQgb25seSBiZSB1c2VkIGluc2lkZSBvZiBhIGNsci1tYWluLWNvbnRhaW5lcicpO1xuICAgIH1cbiAgICBzdXBlcihjZHIsIHdpbGx5V29ua2EpO1xuICAgIHRoaXMucmVzcG9uc2l2ZU5hdlNlcnZpY2UgPSByZXNwb25zaXZlTmF2U2VydmljZTtcbiAgfVxuXG4gIC8vIE5hdkRldGVjdGlvbk9vbXBhTG9vbXBhIGlzIHRoZSBhZGRpdGlvbiBvZiB0aGUgbmF2IGxldmVsc1xuICAvLyBTaW5jZSB3ZSBzdXBwb3J0IDIgbGV2ZWxzLCB0aGUgcG9zc2liaWxpdGllcyBhcmUgMCwgMSBvciAzICgxICsgMilcbiAgZ2V0IGZsYXZvcigpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zaXZlTmF2U2VydmljZS5yZXNwb25zaXZlTmF2TGlzdC5yZWR1Y2UoKHN1bSwgbmF2TGV2ZWwpID0+IHN1bSArIG5hdkxldmVsLCAwKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXNwb25zaXZlTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9yZXNwb25zaXZlLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBSZXNwb25zaXZlTmF2Q29kZXMgfSBmcm9tICcuL3Jlc3BvbnNpdmUtbmF2LWNvZGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLWhlYWRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKm5nSWY9XCJpc05hdkxldmVsMU9uUGFnZVwiXG4gICAgICAgICAgICBjbGFzcz1cImhlYWRlci1oYW1idXJnZXItdHJpZ2dlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTmF2KHJlc3BvbnNpdmVOYXZDb2Rlcy5OQVZfTEVWRUxfMSlcIj5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAqbmdJZj1cImlzTmF2TGV2ZWwyT25QYWdlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLW92ZXJmbG93LXRyaWdnZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU5hdihyZXNwb25zaXZlTmF2Q29kZXMuTkFWX0xFVkVMXzIpXCI+XG4gICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlT3Blbk5hdigpXCI+PC9kaXY+XG4gICAgYCxcbiAgaG9zdDogeyAnW2NsYXNzLmhlYWRlcl0nOiAndHJ1ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xySGVhZGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBpc05hdkxldmVsMU9uUGFnZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNOYXZMZXZlbDJPblBhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHJlc3BvbnNpdmVOYXZDb2RlcyA9IFJlc3BvbnNpdmVOYXZDb2RlcztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlc3BvbnNpdmVOYXZTZXJ2aWNlOiBSZXNwb25zaXZlTmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSB0aGlzLnJlc3BvbnNpdmVOYXZTZXJ2aWNlLnJlZ2lzdGVyZWROYXZzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobmF2TGV2ZWxMaXN0OiBudW1iZXJbXSkgPT4ge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVOYXZUcmlnZ2VycyhuYXZMZXZlbExpc3QpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHJlc2V0IHRyaWdnZXJzLiBoYW5kbGVzIGNhc2VzIHdoZW4gYW4gYXBwbGljYXRpb24gaGFzIGRpZmZlcmVudCBuYXYgbGV2ZWxzIG9uIGRpZmZlcmVudCBwYWdlcy5cbiAgcmVzZXROYXZUcmlnZ2VycygpIHtcbiAgICB0aGlzLmlzTmF2TGV2ZWwxT25QYWdlID0gZmFsc2U7XG4gICAgdGhpcy5pc05hdkxldmVsMk9uUGFnZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gZGVjaWRlcyB3aGljaCB0cmlnZ2VycyB0byBzaG93IG9uIHRoZSBoZWFkZXJcbiAgaW5pdGlhbGl6ZU5hdlRyaWdnZXJzKG5hdkxpc3Q6IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldE5hdlRyaWdnZXJzKCk7XG4gICAgaWYgKG5hdkxpc3QubGVuZ3RoID4gMikge1xuICAgICAgY29uc29sZS5lcnJvcignTW9yZSB0aGFuIDIgTmF2IExldmVscyBkZXRlY3RlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmF2TGlzdC5mb3JFYWNoKG5hdkxldmVsID0+IHtcbiAgICAgIGlmIChuYXZMZXZlbCA9PT0gUmVzcG9uc2l2ZU5hdkNvZGVzLk5BVl9MRVZFTF8xKSB7XG4gICAgICAgIHRoaXMuaXNOYXZMZXZlbDFPblBhZ2UgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuYXZMZXZlbCA9PT0gUmVzcG9uc2l2ZU5hdkNvZGVzLk5BVl9MRVZFTF8yKSB7XG4gICAgICAgIHRoaXMuaXNOYXZMZXZlbDJPblBhZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gY2xvc2VzIHRoZSBuYXYgdGhhdCBpcyBvcGVuXG4gIGNsb3NlT3Blbk5hdigpIHtcbiAgICB0aGlzLnJlc3BvbnNpdmVOYXZTZXJ2aWNlLmNsb3NlQWxsTmF2cygpO1xuICB9XG5cbiAgLy8gdG9nZ2xlcyB0aGUgbmF2IHRoYXQgaXMgb3BlblxuICB0b2dnbGVOYXYobmF2TGV2ZWw6IG51bWJlcikge1xuICAgIHRoaXMucmVzcG9uc2l2ZU5hdlNlcnZpY2Uuc2VuZENvbnRyb2xNZXNzYWdlKFJlc3BvbnNpdmVOYXZDb2Rlcy5OQVZfVE9HR0xFLCBuYXZMZXZlbCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVzcG9uc2l2ZU5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvcmVzcG9uc2l2ZS1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzcG9uc2l2ZU5hdkNvZGVzIH0gZnJvbSAnLi9yZXNwb25zaXZlLW5hdi1jb2Rlcyc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHItbmF2LWxldmVsXScgfSlcbmV4cG9ydCBjbGFzcyBDbHJOYXZMZXZlbCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgnY2xyLW5hdi1sZXZlbCcpIF9sZXZlbDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVzcG9uc2l2ZU5hdlNlcnZpY2U6IFJlc3BvbnNpdmVOYXZpZ2F0aW9uU2VydmljZSwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmxldmVsICE9PSBSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0xFVkVMXzEgJiYgdGhpcy5sZXZlbCAhPT0gUmVzcG9uc2l2ZU5hdkNvZGVzLk5BVl9MRVZFTF8yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdOYXYgTGV2ZWwgY2FuIG9ubHkgYmUgMSBvciAyJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzcG9uc2l2ZU5hdlNlcnZpY2UucmVnaXN0ZXJOYXYodGhpcy5sZXZlbCk7XG4gICAgdGhpcy5hZGROYXZDbGFzcyh0aGlzLmxldmVsKTtcbiAgfVxuXG4gIGFkZE5hdkNsYXNzKGxldmVsOiBudW1iZXIpIHtcbiAgICBjb25zdCBuYXZIb3N0Q2xhc3NMaXN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIGlmIChsZXZlbCA9PT0gUmVzcG9uc2l2ZU5hdkNvZGVzLk5BVl9MRVZFTF8xKSB7XG4gICAgICBuYXZIb3N0Q2xhc3NMaXN0LmFkZChSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMQVNTX0xFVkVMXzEpO1xuICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09IFJlc3BvbnNpdmVOYXZDb2Rlcy5OQVZfTEVWRUxfMikge1xuICAgICAgbmF2SG9zdENsYXNzTGlzdC5hZGQoUmVzcG9uc2l2ZU5hdkNvZGVzLk5BVl9DTEFTU19MRVZFTF8yKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cblxuICAvLyBnZXR0ZXIgdG8gYWNjZXNzIHRoZSByZXNwb25zaXZlIG5hdmlnYXRpb24gY29kZXMgZnJvbSB0aGUgdGVtcGxhdGVcbiAgZ2V0IHJlc3BvbnNpdmVOYXZDb2RlcygpOiBSZXNwb25zaXZlTmF2Q29kZXMge1xuICAgIHJldHVybiBSZXNwb25zaXZlTmF2Q29kZXM7XG4gIH1cblxuICBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMucmVzcG9uc2l2ZU5hdlNlcnZpY2Uuc2VuZENvbnRyb2xNZXNzYWdlKFJlc3BvbnNpdmVOYXZDb2Rlcy5OQVZfT1BFTiwgdGhpcy5sZXZlbCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3BvbnNpdmVOYXZTZXJ2aWNlLnNlbmRDb250cm9sTWVzc2FnZShSZXNwb25zaXZlTmF2Q29kZXMuTkFWX0NMT1NFLCB0aGlzLmxldmVsKTtcbiAgfVxuXG4gIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdHMgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMuIFBvc3NpYmxlIG1ldGhvZHNcbiAgLy8gMS4gSG9zdExpc3RlbmVyIChjdXJyZW50IHNvbHV0aW9uKVxuICAvLyAyLiBEaXJlY3RpdmVzIG9uIHRoZSAubmF2LWxpbmsgY2xhc3MuIFdlIGRpc2N1c3NlZCBvbiBtb3ZpbmcgYXdheSBmcm9tIGNsYXNzIHNlbGVjdG9ycyBidXQgSSBmb3JnZXQgdGhlIHJlYXNvblxuICAvLyB3aHlcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudC50YXJnZXQnXSlcbiAgb25Nb3VzZUNsaWNrKHRhcmdldDogYW55KSB7XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRhcmdldDsgLy8gR2V0IHRoZSBlbGVtZW50IGluIHRoZSBET00gb24gd2hpY2ggdGhlIG1vdXNlIHdhcyBjbGlja2VkXG4gICAgY29uc3QgbmF2SG9zdDogYW55ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7IC8vIEdldCB0aGUgY3VycmVudCBuYXYgbmF0aXZlIEhUTUwgZWxlbWVudFxuXG4gICAgLy8gU3RhcnQgY2hlY2tpbmcgaWYgY3VycmVudCBhbmQgbmF2SG9zdCBhcmUgZXF1YWwuXG4gICAgLy8gSWYgbm90IHRyYXZlcnNlIHRvIHRoZSBwYXJlbnROb2RlIGFuZCBjaGVjayBhZ2Fpbi5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGN1cnJlbnQgPT09IG5hdkhvc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50LmNsYXNzTGlzdC5jb250YWlucygnbmF2LWxpbmsnKSkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZXNwb25zaXZlTmF2U2VydmljZS51bnJlZ2lzdGVyTmF2KHRoaXMubGV2ZWwpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJEcm9wZG93bk1vZHVsZSB9IGZyb20gJy4uLy4uL3BvcG92ZXIvZHJvcGRvd24vZHJvcGRvd24ubW9kdWxlJztcblxuaW1wb3J0IHsgTWFpbkNvbnRhaW5lcldpbGx5V29ua2EgfSBmcm9tICcuL2Nob2NvbGF0ZS9tYWluLWNvbnRhaW5lci13aWxseS13b25rYSc7XG5pbXBvcnQgeyBOYXZEZXRlY3Rpb25Pb21wYUxvb21wYSB9IGZyb20gJy4vY2hvY29sYXRlL25hdi1kZXRlY3Rpb24tb29tcGEtbG9vbXBhJztcbmltcG9ydCB7IENsckhlYWRlciB9IGZyb20gJy4vaGVhZGVyJztcbmltcG9ydCB7IENsck5hdkxldmVsIH0gZnJvbSAnLi9uYXYtbGV2ZWwnO1xuXG5leHBvcnQgY29uc3QgQ0xSX05BVklHQVRJT05fRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbXG4gIENsckhlYWRlcixcbiAgQ2xyTmF2TGV2ZWwsXG4gIE5hdkRldGVjdGlvbk9vbXBhTG9vbXBhLFxuICBNYWluQ29udGFpbmVyV2lsbHlXb25rYSxcbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENsckljb25Nb2R1bGUsIENsckRyb3Bkb3duTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQ0xSX05BVklHQVRJT05fRElSRUNUSVZFU10sXG4gIGV4cG9ydHM6IFtDTFJfTkFWSUdBVElPTl9ESVJFQ1RJVkVTXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyTmF2aWdhdGlvbk1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogYFxuICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGAsXG59KVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlUmVmQ29udGFpbmVyIHtcbiAgQFZpZXdDaGlsZChUZW1wbGF0ZVJlZikgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVJlZkNvbnRhaW5lciB9IGZyb20gJy4vdGVtcGxhdGUtcmVmLWNvbnRhaW5lcic7XG5cbmV4cG9ydCAqIGZyb20gJy4vdGVtcGxhdGUtcmVmLWNvbnRhaW5lcic7XG5cbmV4cG9ydCBjb25zdCBURU1QTEFURV9SRUZfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbVGVtcGxhdGVSZWZDb250YWluZXJdO1xuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRFTVBMQVRFX1JFRl9ESVJFQ1RJVkVTIH0gZnJvbSAnLi9pbmRleCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtURU1QTEFURV9SRUZfRElSRUNUSVZFU10sXG4gIGVudHJ5Q29tcG9uZW50czogW1RFTVBMQVRFX1JFRl9ESVJFQ1RJVkVTXSxcbiAgZXhwb3J0czogW1RFTVBMQVRFX1JFRl9ESVJFQ1RJVkVTXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyVGVtcGxhdGVSZWZNb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV2lsbHlXb25rYSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Nob2NvbGF0ZS93aWxseS13b25rYSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ2Nsci10YWJzJyB9KVxuZXhwb3J0IGNsYXNzIFRhYnNXaWxseVdvbmthIGV4dGVuZHMgV2lsbHlXb25rYSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPb21wYUxvb21wYSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Nob2NvbGF0ZS9vb21wYS1sb29tcGEnO1xuaW1wb3J0IHsgSUZfQUNUSVZFX0lELCBJZkFjdGl2ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9jb25kaXRpb25hbC9pZi1hY3RpdmUuc2VydmljZSc7XG5cbmltcG9ydCB7IFRhYnNXaWxseVdvbmthIH0gZnJvbSAnLi90YWJzLXdpbGx5LXdvbmthJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NsclRhYkxpbmtdLCBjbHItdGFiLWNvbnRlbnQnIH0pXG5leHBvcnQgY2xhc3MgQWN0aXZlT29tcGFMb29tcGEgZXh0ZW5kcyBPb21wYUxvb21wYSB7XG4gIHByaXZhdGUgaWZBY3RpdmU6IElmQWN0aXZlU2VydmljZTtcbiAgcHJpdmF0ZSBpZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgd2lsbHlXb25rYTogVGFic1dpbGx5V29ua2EsXG4gICAgQEluamVjdChJRl9BQ1RJVkVfSUQpIGlkOiBudW1iZXIsXG4gICAgaWZBY3RpdmU6IElmQWN0aXZlU2VydmljZVxuICApIHtcbiAgICBpZiAoIXdpbGx5V29ua2EpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xyVGFiTGluayBhbmQgY2xyLXRhYi1jb250ZW50IHNob3VsZCBvbmx5IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xyLXRhYnMnKTtcbiAgICB9XG4gICAgc3VwZXIoY2RyLCB3aWxseVdvbmthKTtcbiAgICB0aGlzLmlmQWN0aXZlID0gaWZBY3RpdmU7XG4gICAgdGhpcy5pZCA9IGlkO1xuICB9XG5cbiAgZ2V0IGZsYXZvcigpIHtcbiAgICByZXR1cm4gdGhpcy5pZkFjdGl2ZS5jdXJyZW50ID09PSB0aGlzLmlkO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8vIFRPRE86IGlmIHdlIGZpbmQgbW9yZSBjb21wb25lbnRzIHRoYXQgY291bGQgdXNlIHRoaXMsIGNvbnNpZGVyIG1vdmluZyB0aGlzIHRvIHV0aWxzXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXJpYVNlcnZpY2Uge1xuICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZztcbiAgcHVibGljIGFyaWFDb250cm9sczogc3RyaW5nO1xufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xyVGFiIH0gZnJvbSAnLi4vdGFiJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhYnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfY2hpbGRyZW46IENsclRhYltdID0gW107XG5cbiAgcmVnaXN0ZXIodGFiOiBDbHJUYWIpIHtcbiAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKHRhYik7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZVRhYigpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5maW5kKCh0YWI6IENsclRhYikgPT4ge1xuICAgICAgcmV0dXJuIHRhYi5hY3RpdmU7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgb3ZlcmZsb3dUYWJzKCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmZpbHRlcigodGFiOiBDbHJUYWIpID0+IHtcbiAgICAgIHJldHVybiB0YWIudGFiTGluay5pbk92ZXJmbG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgdW5yZWdpc3Rlcih0YWI6IENsclRhYikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKHRhYik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUZfQUNUSVZFX0lELCBJZkFjdGl2ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy9jb25kaXRpb25hbC9pZi1hY3RpdmUuc2VydmljZSc7XG5pbXBvcnQgeyBBcmlhU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2FyaWEuc2VydmljZSc7XG5cbmxldCBuYlRhYkNvbnRlbnRDb21wb25lbnRzOiBudW1iZXIgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItdGFiLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYCxcbiAgaG9zdDoge1xuICAgICdbaWRdJzogJ3RhYkNvbnRlbnRJZCcsXG4gICAgJ1thdHRyLmFyaWEtbGFiZWxsZWRieV0nOiAnYXJpYUxhYmVsbGVkQnknLFxuICAgICdbYXR0ci5hcmlhLWhpZGRlbl0nOiAnIWFjdGl2ZScsXG4gICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2FjdGl2ZScsXG4gICAgJ1thdHRyLmRhdGEtaGlkZGVuXSc6ICchYWN0aXZlJyxcbiAgICByb2xlOiAndGFicGFuZWwnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUYWJDb250ZW50IHtcbiAgQFZpZXdDaGlsZCgndGFiQ29udGVudFByb2plY3RlZFJlZicpIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxDbHJUYWJDb250ZW50PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaWZBY3RpdmVTZXJ2aWNlOiBJZkFjdGl2ZVNlcnZpY2UsXG4gICAgQEluamVjdChJRl9BQ1RJVkVfSUQpIHB1YmxpYyBpZDogbnVtYmVyLFxuICAgIHByaXZhdGUgYXJpYVNlcnZpY2U6IEFyaWFTZXJ2aWNlXG4gICkge1xuICAgIGlmICghdGhpcy50YWJDb250ZW50SWQpIHtcbiAgICAgIHRoaXMudGFiQ29udGVudElkID0gJ2Nsci10YWItY29udGVudC0nICsgbmJUYWJDb250ZW50Q29tcG9uZW50cysrO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhcmlhTGFiZWxsZWRCeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFTZXJ2aWNlLmFyaWFMYWJlbGxlZEJ5O1xuICB9XG5cbiAgZ2V0IHRhYkNvbnRlbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFTZXJ2aWNlLmFyaWFDb250cm9scztcbiAgfVxuXG4gIEBJbnB1dCgnaWQnKVxuICBzZXQgdGFiQ29udGVudElkKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFyaWFTZXJ2aWNlLmFyaWFDb250cm9scyA9IGlkO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pZkFjdGl2ZVNlcnZpY2UuY3VycmVudCA9PT0gdGhpcy5pZDtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxubGV0IG5iVGFic0NvbXBvbmVudCA9IDA7XG5cbmV4cG9ydCBjb25zdCBUQUJTX0lEID0gbmV3IEluamVjdGlvblRva2VuPG51bWJlcj4oJ1RBQlNfSUQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuRmFjdG9yeSgpIHtcbiAgcmV0dXJuICdjbHItdGFicy0nICsgbmJUYWJzQ29tcG9uZW50Kys7XG59XG5cbmV4cG9ydCBjb25zdCBUQUJTX0lEX1BST1ZJREVSID0ge1xuICBwcm92aWRlOiBUQUJTX0lELFxuICB1c2VGYWN0b3J5OiB0b2tlbkZhY3RvcnksXG59O1xuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IElGX0FDVElWRV9JRCwgSWZBY3RpdmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZGl0aW9uYWwvaWYtYWN0aXZlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVSZWZDb250YWluZXIgfSBmcm9tICcuLi8uLi91dGlscy90ZW1wbGF0ZS1yZWYvdGVtcGxhdGUtcmVmLWNvbnRhaW5lcic7XG5cbmltcG9ydCB7IEFyaWFTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvYXJpYS5zZXJ2aWNlJztcbmltcG9ydCB7IFRBQlNfSUQgfSBmcm9tICcuL3RhYnMtaWQucHJvdmlkZXInO1xuXG5sZXQgbmJUYWJMaW5rQ29tcG9uZW50czogbnVtYmVyID0gMDtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NsclRhYkxpbmtdJyxcbiAgaG9zdDoge1xuICAgICdbaWRdJzogJ3RhYkxpbmtJZCcsXG4gICAgJ1thdHRyLmFyaWEtc2VsZWN0ZWRdJzogJ2FjdGl2ZScsXG4gICAgJ1thdHRyLmFyaWEtaGlkZGVuXSc6ICdmYWxzZScsXG4gICAgJ1thdHRyLmFyaWEtY29udHJvbHNdJzogJ2FyaWFDb250cm9scycsXG4gICAgJ1tjbGFzcy5idG5dJzogJ3RydWUnLFxuICAgICdbY2xhc3MuYnRuLWxpbmtdJzogJyFpbk92ZXJmbG93JyxcbiAgICAnW2NsYXNzLm5hdi1saW5rXSc6ICchaW5PdmVyZmxvdycsXG4gICAgJ1tjbGFzcy5uYXYtaXRlbV0nOiAnIWluT3ZlcmZsb3cnLFxuICAgICdbY2xhc3MuYWN0aXZlXSc6ICdhY3RpdmUnLFxuICAgIHJvbGU6ICd0YWInLFxuICAgIHR5cGU6ICdidXR0b24nLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUYWJMaW5rIHtcbiAgQElucHV0KCdjbHJUYWJMaW5rSW5PdmVyZmxvdycpIGluT3ZlcmZsb3c6IGJvb2xlYW47XG4gIHRlbXBsYXRlUmVmQ29udGFpbmVyOiBUZW1wbGF0ZVJlZkNvbnRhaW5lcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaWZBY3RpdmVTZXJ2aWNlOiBJZkFjdGl2ZVNlcnZpY2UsXG4gICAgQEluamVjdChJRl9BQ1RJVkVfSUQpIHByaXZhdGUgaWQ6IG51bWJlcixcbiAgICBwcml2YXRlIGFyaWFTZXJ2aWNlOiBBcmlhU2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEBJbmplY3QoVEFCU19JRCkgcHVibGljIHRhYnNJZDogbnVtYmVyXG4gICkge1xuICAgIGlmICghdGhpcy50YWJMaW5rSWQpIHtcbiAgICAgIHRoaXMudGFiTGlua0lkID0gJ2Nsci10YWItbGluay0nICsgbmJUYWJMaW5rQ29tcG9uZW50cysrO1xuICAgIH1cblxuICAgIC8vIFRhYiBsaW5rcyBjYW4gYmUgcmVuZGVyZWQgaW4gb25lIG9mIHR3byBwbGFjZXM6IGluIHRoZSBtYWluIGFyZWEgb3IgaW5zaWRlIHRoZSBvdmVyZmxvdyBkcm9wZG93biBtZW51LlxuICAgIC8vIEhlcmUsIHdlIGNyZWF0ZSBhIGNvbnRhaW5lciBzbyB0aGF0IGl0cyB0ZW1wbGF0ZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgZW1iZWRkZWRWaWV3IG9uIHRoZSBmbHkuXG4gICAgLy8gU2VlIFRhYnNTZXJ2aWNlJ3MgcmVuZGVyVmlldygpIG1ldGhvZCBhbmQgaG93IGl0J3MgdXNlZCBpbiBUYWJzIGNsYXNzIGZvciBhbiBleGFtcGxlLlxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShUZW1wbGF0ZVJlZkNvbnRhaW5lcik7XG4gICAgdGhpcy50ZW1wbGF0ZVJlZkNvbnRhaW5lciA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSwgMSwgdW5kZWZpbmVkLCBbXG4gICAgICBbdGhpcy5lbC5uYXRpdmVFbGVtZW50XSxcbiAgICBdKS5pbnN0YW5jZTtcbiAgfVxuXG4gIGdldCBhcmlhQ29udHJvbHMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhU2VydmljZS5hcmlhQ29udHJvbHM7XG4gIH1cblxuICBnZXQgdGFiTGlua0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXJpYVNlcnZpY2UuYXJpYUxhYmVsbGVkQnk7XG4gIH1cblxuICBASW5wdXQoJ2lkJylcbiAgc2V0IHRhYkxpbmtJZChpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hcmlhU2VydmljZS5hcmlhTGFiZWxsZWRCeSA9IGlkO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmlmQWN0aXZlU2VydmljZS5jdXJyZW50ID0gdGhpcy5pZDtcbiAgfVxuXG4gIGdldCBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWZBY3RpdmVTZXJ2aWNlLmN1cnJlbnQgPT09IHRoaXMuaWQ7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSUZfQUNUSVZFX0lELCBJRl9BQ1RJVkVfSURfUFJPVklERVIsIElmQWN0aXZlU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmRpdGlvbmFsL2lmLWFjdGl2ZS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQXJpYVNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9hcmlhLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFic1NlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy90YWJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyVGFiQ29udGVudCB9IGZyb20gJy4vdGFiLWNvbnRlbnQnO1xuaW1wb3J0IHsgQ2xyVGFiTGluayB9IGZyb20gJy4vdGFiLWxpbmsuZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXRhYicsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICBgLFxuICBwcm92aWRlcnM6IFtJRl9BQ1RJVkVfSURfUFJPVklERVIsIEFyaWFTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyVGFiIHtcbiAgQENvbnRlbnRDaGlsZChDbHJUYWJMaW5rKSB0YWJMaW5rOiBDbHJUYWJMaW5rO1xuICBAQ29udGVudENoaWxkKENsclRhYkNvbnRlbnQpIHRhYkNvbnRlbnQ6IENsclRhYkNvbnRlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGlmQWN0aXZlU2VydmljZTogSWZBY3RpdmVTZXJ2aWNlLFxuICAgIEBJbmplY3QoSUZfQUNUSVZFX0lEKSBwdWJsaWMgaWQ6IG51bWJlcixcbiAgICBwcml2YXRlIHRhYnNTZXJ2aWNlOiBUYWJzU2VydmljZVxuICApIHtcbiAgICB0YWJzU2VydmljZS5yZWdpc3Rlcih0aGlzKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudGFic1NlcnZpY2UudW5yZWdpc3Rlcih0aGlzKTtcbiAgfVxuXG4gIGdldCBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWZBY3RpdmVTZXJ2aWNlLmN1cnJlbnQgPT09IHRoaXMuaWQ7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0UG9wb3ZlciB9IGZyb20gJy4uLy4uL3BvcG92ZXIvY29tbW9uL2Fic3RyYWN0LXBvcG92ZXInO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi8uLi9wb3BvdmVyL2NvbW1vbi9wb3BvdmVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXRhYi1vdmVyZmxvdy1jb250ZW50JyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmRyb3Bkb3duLW1lbnVdJzogJ3RydWUnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUYWJPdmVyZmxvd0NvbnRlbnQgZXh0ZW5kcyBBYnN0cmFjdFBvcG92ZXIge1xuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIEBTa2lwU2VsZigpIHBhcmVudEhvc3Q6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcihpbmplY3RvciwgcGFyZW50SG9zdCk7XG4gICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LkJPVFRPTV9SSUdIVDtcbiAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LlJJR0hUX1RPUDtcbiAgICB0aGlzLmNsb3NlT25PdXRzaWRlQ2xpY2sgPSB0cnVlO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgSW5qZWN0LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSWZBY3RpdmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZGl0aW9uYWwvaWYtYWN0aXZlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWZPcGVuU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmRpdGlvbmFsL2lmLW9wZW4uc2VydmljZSc7XG5cbmltcG9ydCB7IFRhYnNTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvdGFicy5zZXJ2aWNlJztcbmltcG9ydCB7IENsclRhYkxpbmsgfSBmcm9tICcuL3RhYi1saW5rLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUQUJTX0lELCBUQUJTX0lEX1BST1ZJREVSIH0gZnJvbSAnLi90YWJzLWlkLnByb3ZpZGVyJztcbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9pMThuL2NvbW1vbi1zdHJpbmdzLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci10YWJzJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPHVsIGNsYXNzPVwibmF2XCIgcm9sZT1cInRhYmxpc3RcIiBbYXR0ci5hcmlhLW93bnNdPVwidGFiSWRzXCI+XG4gICAgICAgICAgICA8IS0tdGFiIGxpbmtzLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsaW5rIG9mIHRhYkxpbmtEaXJlY3RpdmVzXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpbmsudGFic0lkID09PSB0YWJzSWQgJiYgIWxpbmsuaW5PdmVyZmxvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsaW5rLnRlbXBsYXRlUmVmQ29udGFpbmVyLnRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJzU2VydmljZS5vdmVyZmxvd1RhYnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzLW92ZXJmbG93IGJvdHRvbS1yaWdodFwiIFtjbGFzcy5vcGVuXT1cImlmT3BlblNlcnZpY2Uub3BlblwiXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3ZlcmZsb3coJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgbmF2LWxpbmsgZHJvcGRvd24tdG9nZ2xlXCIgdHlwZT1cImJ1dHRvblwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiSW5PdmVyZmxvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImVsbGlwc2lzLWhvcml6b250YWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWluZm9dPVwiaWZPcGVuU2VydmljZS5vcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImNvbW1vblN0cmluZ3MubW9yZVwiPjwvY2xyLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPCEtLXRhYiBsaW5rcyBpbiBvdmVyZmxvdyBtZW51LS0+XG4gICAgICAgICAgICAgICAgICAgIDxjbHItdGFiLW92ZXJmbG93LWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsaW5rIG9mIHRhYkxpbmtEaXJlY3RpdmVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpbmsudGFic0lkID09PSB0YWJzSWQgJiYgbGluay5pbk92ZXJmbG93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpbmsudGVtcGxhdGVSZWZDb250YWluZXIudGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Nsci10YWItb3ZlcmZsb3ctY29udGVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8IS0tdGFiIGNvbnRlbnQtLT5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIGAsXG4gIHByb3ZpZGVyczogW0lmQWN0aXZlU2VydmljZSwgSWZPcGVuU2VydmljZSwgVGFic1NlcnZpY2UsIFRBQlNfSURfUFJPVklERVJdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUYWJzIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGRyZW4oQ2xyVGFiTGluaywgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICB0YWJMaW5rRGlyZWN0aXZlczogUXVlcnlMaXN0PENsclRhYkxpbms+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpZkFjdGl2ZVNlcnZpY2U6IElmQWN0aXZlU2VydmljZSxcbiAgICBwdWJsaWMgaWZPcGVuU2VydmljZTogSWZPcGVuU2VydmljZSxcbiAgICBwdWJsaWMgdGFic1NlcnZpY2U6IFRhYnNTZXJ2aWNlLFxuICAgIEBJbmplY3QoVEFCU19JRCkgcHVibGljIHRhYnNJZDogbnVtYmVyLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzXG4gICkge31cblxuICBnZXQgYWN0aXZlVGFiSW5PdmVyZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy50YWJzU2VydmljZS5vdmVyZmxvd1RhYnMuaW5kZXhPZih0aGlzLnRhYnNTZXJ2aWNlLmFjdGl2ZVRhYikgPiAtMTtcbiAgfVxuXG4gIGdldCB0YWJJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFic1NlcnZpY2UuY2hpbGRyZW4ubWFwKHRhYiA9PiB0YWIudGFiTGluay50YWJMaW5rSWQpLmpvaW4oJyAnKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuaWZBY3RpdmVTZXJ2aWNlLmN1cnJlbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnRhYkxpbmtEaXJlY3RpdmVzLmZpcnN0LmFjdGl2YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlT3ZlcmZsb3coZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuaWZPcGVuU2VydmljZS50b2dnbGVXaXRoRXZlbnQoZXZlbnQpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb21tb25Qb3BvdmVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vcG9wb3Zlci9jb21tb24vcG9wb3Zlci5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyQ29uZGl0aW9uYWxNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9jb25kaXRpb25hbC9jb25kaXRpb25hbC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyVGVtcGxhdGVSZWZNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy90ZW1wbGF0ZS1yZWYvdGVtcGxhdGUtcmVmLm1vZHVsZSc7XG5cbmltcG9ydCB7IEFjdGl2ZU9vbXBhTG9vbXBhIH0gZnJvbSAnLi9jaG9jb2xhdGUvYWN0aXZlLW9vbXBhLWxvb21wYSc7XG5pbXBvcnQgeyBUYWJzV2lsbHlXb25rYSB9IGZyb20gJy4vY2hvY29sYXRlL3RhYnMtd2lsbHktd29ua2EnO1xuaW1wb3J0IHsgQ2xyVGFiIH0gZnJvbSAnLi90YWInO1xuaW1wb3J0IHsgQ2xyVGFiQ29udGVudCB9IGZyb20gJy4vdGFiLWNvbnRlbnQnO1xuaW1wb3J0IHsgQ2xyVGFiTGluayB9IGZyb20gJy4vdGFiLWxpbmsuZGlyZWN0aXZlJztcbmltcG9ydCB7IENsclRhYk92ZXJmbG93Q29udGVudCB9IGZyb20gJy4vdGFiLW92ZXJmbG93LWNvbnRlbnQnO1xuaW1wb3J0IHsgQ2xyVGFicyB9IGZyb20gJy4vdGFicyc7XG5cbmV4cG9ydCBjb25zdCBDTFJfVEFCU19ESVJFQ1RJVkVTOiBUeXBlPGFueT5bXSA9IFtcbiAgQ2xyVGFiQ29udGVudCxcbiAgQ2xyVGFiLFxuICBDbHJUYWJzLFxuICBDbHJUYWJPdmVyZmxvd0NvbnRlbnQsXG4gIENsclRhYkxpbmssXG4gIFRhYnNXaWxseVdvbmthLFxuICBBY3RpdmVPb21wYUxvb21wYSxcbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENsckNvbW1vblBvcG92ZXJNb2R1bGUsIENsckNvbmRpdGlvbmFsTW9kdWxlLCBDbHJJY29uTW9kdWxlLCBDbHJUZW1wbGF0ZVJlZk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9UQUJTX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX1RBQlNfRElSRUNUSVZFUywgQ2xyQ29uZGl0aW9uYWxNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUYWJzTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZlcnRpY2FsTmF2R3JvdXBSZWdpc3RyYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIG5hdkdyb3VwQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgcmVnaXN0ZXJOYXZHcm91cCgpIHtcbiAgICB0aGlzLm5hdkdyb3VwQ291bnQrKztcbiAgfVxuXG4gIHVucmVnaXN0ZXJOYXZHcm91cCgpOiB2b2lkIHtcbiAgICB0aGlzLm5hdkdyb3VwQ291bnQtLTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBWZXJ0aWNhbE5hdkljb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfaWNvbnM6IG51bWJlciA9IDA7XG5cbiAgZ2V0IGhhc0ljb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pY29ucyA+IDA7XG4gIH1cblxuICByZWdpc3Rlckljb24oKTogdm9pZCB7XG4gICAgdGhpcy5faWNvbnMrKztcbiAgfVxuXG4gIHVucmVnaXN0ZXJJY29uKCk6IHZvaWQge1xuICAgIHRoaXMuX2ljb25zLS07XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmVydGljYWxOYXZTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfYW5pbWF0ZU9uQ29sbGFwc2VkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBnZXQgYW5pbWF0ZU9uQ29sbGFwc2VkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9hbmltYXRlT25Db2xsYXBzZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIF9jb2xsYXBzZWRDaGFuZ2VkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBnZXQgY29sbGFwc2VkQ2hhbmdlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGFwc2VkQ2hhbmdlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxhcHNlZDtcbiAgfVxuXG4gIHNldCBjb2xsYXBzZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gICAgaWYgKHRoaXMuY29sbGFwc2libGUgJiYgdGhpcy5fY29sbGFwc2VkICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGVDb2xsYXBzZUJlaGF2aW9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jb2xsYXBzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBjb2xsYXBzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGFwc2libGU7XG4gIH1cblxuICBzZXQgY29sbGFwc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gICAgaWYgKHRoaXMuX2NvbGxhcHNpYmxlICE9PSB2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbGxhcHNlQmVoYXZpb3IoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29sbGFwc2libGUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbGxhcHNlQmVoYXZpb3IodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9hbmltYXRlT25Db2xsYXBzZWQubmV4dCh2YWx1ZSk7XG4gICAgdGhpcy5fY29sbGFwc2VkID0gdmFsdWU7XG4gICAgdGhpcy5fY29sbGFwc2VkQ2hhbmdlZC5uZXh0KHZhbHVlKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVmVydGljYWxOYXZHcm91cFJlZ2lzdHJhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy92ZXJ0aWNhbC1uYXYtZ3JvdXAtcmVnaXN0cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmVydGljYWxOYXZJY29uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL3ZlcnRpY2FsLW5hdi1pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmVydGljYWxOYXZTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvdmVydGljYWwtbmF2LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xyQ29tbW9uU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4vY29tbW9uLXN0cmluZ3MuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXZlcnRpY2FsLW5hdicsXG4gIHRlbXBsYXRlVXJsOiAnLi92ZXJ0aWNhbC1uYXYuaHRtbCcsXG4gIHByb3ZpZGVyczogW1ZlcnRpY2FsTmF2U2VydmljZSwgVmVydGljYWxOYXZJY29uU2VydmljZSwgVmVydGljYWxOYXZHcm91cFJlZ2lzdHJhdGlvblNlcnZpY2VdLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdjbHItdmVydGljYWwtbmF2JyxcbiAgICAnW2NsYXNzLmlzLWNvbGxhcHNlZF0nOiAnY29sbGFwc2VkJyxcbiAgICAnW2NsYXNzLmhhcy1uYXYtZ3JvdXBzXSc6ICdoYXNOYXZHcm91cHMnLFxuICAgICdbY2xhc3MuaGFzLWljb25zXSc6ICdoYXNJY29ucycsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsclZlcnRpY2FsTmF2IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgZ2V0IGNvbGxhcHNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9uYXZTZXJ2aWNlLmNvbGxhcHNpYmxlO1xuICB9XG5cbiAgQElucHV0KCdjbHJWZXJ0aWNhbE5hdkNvbGxhcHNpYmxlJylcbiAgc2V0IGNvbGxhcHNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbmF2U2VydmljZS5jb2xsYXBzaWJsZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbmF2U2VydmljZS5jb2xsYXBzZWQ7XG4gIH1cblxuICBASW5wdXQoJ2NsclZlcnRpY2FsTmF2Q29sbGFwc2VkJylcbiAgc2V0IGNvbGxhcHNlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX25hdlNlcnZpY2UuY29sbGFwc2VkID0gdmFsdWU7XG4gIH1cblxuICBAT3V0cHV0KCdjbHJWZXJ0aWNhbE5hdkNvbGxhcHNlZENoYW5nZScpXG4gIHByaXZhdGUgX2NvbGxhcHNlZENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgZ2V0IGhhc05hdkdyb3VwcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbmF2R3JvdXBSZWdpc3RyYXRpb25TZXJ2aWNlLm5hdkdyb3VwQ291bnQgPiAwO1xuICB9XG5cbiAgZ2V0IGhhc0ljb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9uYXZJY29uU2VydmljZS5oYXNJY29ucztcbiAgfVxuXG4gIHByaXZhdGUgX3N1YjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25hdlNlcnZpY2U6IFZlcnRpY2FsTmF2U2VydmljZSxcbiAgICBwcml2YXRlIF9uYXZJY29uU2VydmljZTogVmVydGljYWxOYXZJY29uU2VydmljZSxcbiAgICBwcml2YXRlIF9uYXZHcm91cFJlZ2lzdHJhdGlvblNlcnZpY2U6IFZlcnRpY2FsTmF2R3JvdXBSZWdpc3RyYXRpb25TZXJ2aWNlLFxuICAgIHB1YmxpYyBjb21tb25TdHJpbmdzOiBDbHJDb21tb25TdHJpbmdzXG4gICkge1xuICAgIHRoaXMuX3N1YiA9IHRoaXMuX25hdlNlcnZpY2UuY29sbGFwc2VkQ2hhbmdlZC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5fY29sbGFwc2VkQ2hhbmdlZC5lbWl0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZUJ5QnV0dG9uKCkge1xuICAgIHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmVydGljYWxOYXZHcm91cFNlcnZpY2Uge1xuICBwcml2YXRlIF9leHBhbmRDaGFuZ2U6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGdldCBleHBhbmRDaGFuZ2UoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cGFuZENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGV4cGFuZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9leHBhbmRDaGFuZ2UubmV4dCh0cnVlKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25FdmVudCwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEV4cGFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL2V4cGFuZC9wcm92aWRlcnMvZXhwYW5kJztcblxuaW1wb3J0IHsgVmVydGljYWxOYXZHcm91cFJlZ2lzdHJhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy92ZXJ0aWNhbC1uYXYtZ3JvdXAtcmVnaXN0cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmVydGljYWxOYXZHcm91cFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy92ZXJ0aWNhbC1uYXYtZ3JvdXAuc2VydmljZSc7XG5pbXBvcnQgeyBWZXJ0aWNhbE5hdlNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy92ZXJ0aWNhbC1uYXYuc2VydmljZSc7XG5pbXBvcnQgeyBDbHJDb21tb25TdHJpbmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UnO1xuXG5jb25zdCBFWFBBTkRFRF9TVEFURTogc3RyaW5nID0gJ2V4cGFuZGVkJztcbmNvbnN0IENPTExBUFNFRF9TVEFURTogc3RyaW5nID0gJ2NvbGxhcHNlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci12ZXJ0aWNhbC1uYXYtZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vdmVydGljYWwtbmF2LWdyb3VwLmh0bWwnLFxuICBwcm92aWRlcnM6IFtFeHBhbmQsIFZlcnRpY2FsTmF2R3JvdXBTZXJ2aWNlXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2NsckV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKEVYUEFOREVEX1NUQVRFLCBzdHlsZSh7IGhlaWdodDogJyonIH0pKSxcbiAgICAgIHN0YXRlKENPTExBUFNFRF9TVEFURSwgc3R5bGUoeyBoZWlnaHQ6IDAsICdvdmVyZmxvdy15JzogJ2hpZGRlbicsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcbiAgICAgIHRyYW5zaXRpb24oYCR7RVhQQU5ERURfU1RBVEV9IDw9PiAke0NPTExBUFNFRF9TVEFURX1gLCBhbmltYXRlKCcwLjJzIGVhc2UtaW4tb3V0JykpLFxuICAgIF0pLFxuICBdLFxuICBob3N0OiB7IGNsYXNzOiAnbmF2LWdyb3VwJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJWZXJ0aWNhbE5hdkdyb3VwIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaXRlbUV4cGFuZDogRXhwYW5kLFxuICAgIHByaXZhdGUgX25hdkdyb3VwUmVnaXN0cmF0aW9uU2VydmljZTogVmVydGljYWxOYXZHcm91cFJlZ2lzdHJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfbmF2R3JvdXBTZXJ2aWNlOiBWZXJ0aWNhbE5hdkdyb3VwU2VydmljZSxcbiAgICBwcml2YXRlIF9uYXZTZXJ2aWNlOiBWZXJ0aWNhbE5hdlNlcnZpY2UsXG4gICAgcHVibGljIGNvbW1vblN0cmluZ3M6IENsckNvbW1vblN0cmluZ3NcbiAgKSB7XG4gICAgdGhpcy5fbmF2R3JvdXBSZWdpc3RyYXRpb25TZXJ2aWNlLnJlZ2lzdGVyTmF2R3JvdXAoKTtcblxuICAgIC8vIEZJWE1FOiBUaGlzIHN1YnNjcmlwdGlvbiBoYW5kbGVzIGEgY29ybmVyIGNhc2VcbiAgICAvLyBWZXJ0aWNhbCBOYXYgY29sbGFwc2UgcmVxdWlyZXMgdGhlIGFuaW1hdGlvbiB0byBydW4gZmlyc3QgYW5kIHRoZW5cbiAgICAvLyByZW1vdmUgdGhlIG5vZGVzIGZyb20gdGhlIERPTS4gSWYgdGhlIHVzZXIgZGlyZWN0bHkgc2V0cyB0aGUgaW5wdXRcbiAgICAvLyBvbiB0aGUgY2xySWZFeHBhbmRlZCBkaXJlY3RpdmUsIHdlIGhhdmUgbm8gY2hhbmNlIHRvIHJ1biB0aGUgYW5pbWF0aW9uXG4gICAgLy8gYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiBUaGlzIHN1YnNjcmlwdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlXG4gICAgLy8gYW5pbWF0aW9uIHN0YXRlcyBhcmUgY29ycmVjdCBmb3IgdGhhdCBlZGdlIGNhc2UuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5faXRlbUV4cGFuZC5leHBhbmRDaGFuZ2Uuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHRoaXMuZXhwYW5kQW5pbWF0aW9uU3RhdGUgPT09IENPTExBUFNFRF9TVEFURSkge1xuICAgICAgICAgIGlmICh0aGlzLl9uYXZTZXJ2aWNlLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5fbmF2U2VydmljZS5jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5leHBhbmRBbmltYXRpb25TdGF0ZSA9IEVYUEFOREVEX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiB0aGlzLmV4cGFuZEFuaW1hdGlvblN0YXRlID09PSBFWFBBTkRFRF9TVEFURSkge1xuICAgICAgICAgIHRoaXMuZXhwYW5kQW5pbWF0aW9uU3RhdGUgPSBDT0xMQVBTRURfU1RBVEU7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIDEuIElmIHRoZSBuYXYgaXMgY29sbGFwc2luZywgY2xvc2UgdGhlIG9wZW4gbmF2IGdyb3VwICsgc2F2ZSBpdHMgc3RhdGVcbiAgICAvLyAyLiBJZiB0aGUgbmF2IGlzIGV4cGFuZGluZywgZXhwYW5kIHRoZSBuYXYgZ3JvdXAgaWYgdGhlIHByZXZpb3VzIHN0YXRlIHdhcyBleHBhbmRlZFxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuX25hdlNlcnZpY2UuYW5pbWF0ZU9uQ29sbGFwc2VkLnN1YnNjcmliZSgoZ29pbmdUb0NvbGxhcHNlOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChnb2luZ1RvQ29sbGFwc2UgJiYgdGhpcy5leHBhbmRlZCkge1xuICAgICAgICAgIHRoaXMud2FzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZXhwYW5kQW5pbWF0aW9uU3RhdGUgPSBDT0xMQVBTRURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWdvaW5nVG9Db2xsYXBzZSAmJiB0aGlzLndhc0V4cGFuZGVkKSB7XG4gICAgICAgICAgdGhpcy5leHBhbmRHcm91cCgpO1xuICAgICAgICAgIHRoaXMud2FzRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gSWYgYSBsaW5rIGlzIGNsaWNrZWQsIGV4cGFuZCB0aGUgbmF2IGdyb3VwXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5fbmF2R3JvdXBTZXJ2aWNlLmV4cGFuZENoYW5nZS5zdWJzY3JpYmUoKGV4cGFuZDogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoZXhwYW5kICYmICF0aGlzLmV4cGFuZGVkKSB7XG4gICAgICAgICAgdGhpcy5leHBhbmRHcm91cCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHdhc0V4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1leHBhbmRlZCcpXG4gIGdldCBleHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbUV4cGFuZC5leHBhbmRlZDtcbiAgfVxuXG4gIHNldCBleHBhbmRlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9pdGVtRXhwYW5kLmV4cGFuZGVkICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5faXRlbUV4cGFuZC5leHBhbmRlZCA9IHZhbHVlO1xuICAgICAgdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoJ2NsclZlcnRpY2FsTmF2R3JvdXBFeHBhbmRlZCcpXG4gIHNldCB1c2VyRXhwYW5kZWRJbnB1dCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHZhbHVlID0gISF2YWx1ZTtcbiAgICBpZiAodGhpcy5leHBhbmRlZCAhPT0gdmFsdWUpIHtcbiAgICAgIC8vIFdlIGhhdmUgdG8gY2FsbCB0b2dnbGVFeHBhbmQgYmVjYXVzZSBzb21lIGNhc2VzIHJlcXVpcmUgYW5pbWF0aW9ucyB0byBvY2N1ciBmaXJzdFxuICAgICAgLy8gRGlyZWN0bHkgc2V0dGluZyB0aGUgRXhwYW5kIHNlcnZpY2UgdmFsdWUgc2tpcHMgdGhlIGFuaW1hdGlvbiBhbmQgY2FuIHJlc3VsdCBpblxuICAgICAgLy8gbm9kZXMgaW4gdGhlIERPTSBidXQgdGhlIG5hdiBncm91cCBzdGlsbCBiZWluZyBjb2xsYXBzZWRcbiAgICAgIHRoaXMudG9nZ2xlRXhwYW5kKCk7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgnY2xyVmVydGljYWxOYXZHcm91cEV4cGFuZGVkQ2hhbmdlJykgZXhwYW5kZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIF9leHBhbmRBbmltYXRpb25TdGF0ZTogc3RyaW5nID0gQ09MTEFQU0VEX1NUQVRFO1xuXG4gIGV4cGFuZEdyb3VwKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWQgPSB0cnVlO1xuICAgIC8vIEV4cGFuZGVkIGFuaW1hdGlvbiBvY2N1cnMgYWZ0ZXIgRXhwYW5kLmV4cGFuZCBpcyBzZXQgdG8gdHJ1ZVxuICAgIHRoaXMuZXhwYW5kQW5pbWF0aW9uU3RhdGUgPSBFWFBBTkRFRF9TVEFURTtcbiAgfVxuXG4gIGNvbGxhcHNlR3JvdXAoKTogdm9pZCB7XG4gICAgLy8gSWYgYSBWZXJ0aWNhbCBOYXYgR3JvdXAgdG9nZ2xlIGJ1dHRvbiBpcyBjbGlja2VkIHdoaWxlIHRoZSBWZXJ0aWNhbCBOYXYgaXMgaW4gQ29sbGFwc2VkIHN0YXRlLFxuICAgIC8vIHRoZSBWZXJ0aWNhbCBOYXYgc2hvdWxkIGJlIGV4cGFuZGVkIGZpcnN0LlxuICAgIHRoaXMuZXhwYW5kQW5pbWF0aW9uU3RhdGUgPSBDT0xMQVBTRURfU1RBVEU7XG4gIH1cblxuICAvLyBjbG9zZXMgYSBncm91cCBhZnRlciB0aGUgY29sbGFwc2UgYW5pbWF0aW9uXG4gIGV4cGFuZEFuaW1hdGlvbkRvbmUoJGV2ZW50OiBBbmltYXRpb25FdmVudCkge1xuICAgIGlmICgkZXZlbnQudG9TdGF0ZSA9PT0gQ09MTEFQU0VEX1NUQVRFKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGV4cGFuZEFuaW1hdGlvblN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cGFuZEFuaW1hdGlvblN0YXRlO1xuICB9XG5cbiAgc2V0IGV4cGFuZEFuaW1hdGlvblN0YXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2V4cGFuZEFuaW1hdGlvblN0YXRlKSB7XG4gICAgICB0aGlzLl9leHBhbmRBbmltYXRpb25TdGF0ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUV4cGFuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHBhbmRlZCkge1xuICAgICAgdGhpcy5jb2xsYXBzZUdyb3VwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5hdiBpcyBjb2xsYXNwZWQsIGZpcnN0IG9wZW4gdGhlIG5hdlxuICAgICAgaWYgKHRoaXMuX25hdlNlcnZpY2UuY29sbGFwc2VkKSB7XG4gICAgICAgIHRoaXMuX25hdlNlcnZpY2UuY29sbGFwc2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyB0aGVuIGV4cGFuZCB0aGUgbmF2IGdyb3VwXG4gICAgICB0aGlzLmV4cGFuZEdyb3VwKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIC8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IGlmIHNvbWVvbmUgbWFya3MgYSBuYXYgZ3JvdXAgZXhwYW5kZWQgaW4gYSBjb2xsYXBzZWQgbmF2XG4gICAgLy8gdGhlIGV4cGFuZGVkIHByb3BlcnR5IGlzIHN3aXRjaGVkIGJhY2sgdG8gY29sbGFwc2VkIHN0YXRlLlxuICAgIGlmICh0aGlzLl9uYXZTZXJ2aWNlLmNvbGxhcHNlZCAmJiB0aGlzLmV4cGFuZGVkKSB7XG4gICAgICB0aGlzLndhc0V4cGFuZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXhwYW5kQW5pbWF0aW9uU3RhdGUgPSBDT0xMQVBTRURfU1RBVEU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWI6IFN1YnNjcmlwdGlvbikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuX25hdkdyb3VwUmVnaXN0cmF0aW9uU2VydmljZS51bnJlZ2lzdGVyTmF2R3JvdXAoKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXZlcnRpY2FsLW5hdi1ncm91cC1jaGlsZHJlbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJWZXJ0aWNhbE5hdkdyb3VwQ2hpbGRyZW4ge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWZXJ0aWNhbE5hdkljb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvdmVydGljYWwtbmF2LWljb24uc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJWZXJ0aWNhbE5hdkljb25dJywgaG9zdDogeyBjbGFzczogJ25hdi1pY29uJyB9IH0pXG5leHBvcnQgY2xhc3MgQ2xyVmVydGljYWxOYXZJY29uIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmVydGljYWxOYXZJY29uU2VydmljZTogVmVydGljYWxOYXZJY29uU2VydmljZSkge1xuICAgIHRoaXMuX3ZlcnRpY2FsTmF2SWNvblNlcnZpY2UucmVnaXN0ZXJJY29uKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl92ZXJ0aWNhbE5hdkljb25TZXJ2aWNlLnVucmVnaXN0ZXJJY29uKCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmVydGljYWxOYXZHcm91cFNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy92ZXJ0aWNhbC1uYXYtZ3JvdXAuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1tjbHJWZXJ0aWNhbE5hdkxpbmtdJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2NsclZlcnRpY2FsTmF2SWNvbl1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmF2LXRleHRcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD4gICAgXG4gICAgICAgIDwvc3Bhbj5cbiAgICBgLFxuICBob3N0OiB7IGNsYXNzOiAnbmF2LWxpbmsnIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsclZlcnRpY2FsTmF2TGluayB7XG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgX25hdkdyb3VwU2VydmljZTogVmVydGljYWxOYXZHcm91cFNlcnZpY2UpIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBwdWJsaWMgZXhwYW5kUGFyZW50TmF2R3JvdXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX25hdkdyb3VwU2VydmljZSkge1xuICAgICAgdGhpcy5fbmF2R3JvdXBTZXJ2aWNlLmV4cGFuZCgpO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xySWNvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xySWZFeHBhbmRNb2R1bGUgfSBmcm9tICcuLi8uLi91dGlscy9leHBhbmQvaWYtZXhwYW5kLm1vZHVsZSc7XG5cbmltcG9ydCB7IENsclZlcnRpY2FsTmF2IH0gZnJvbSAnLi92ZXJ0aWNhbC1uYXYnO1xuaW1wb3J0IHsgQ2xyVmVydGljYWxOYXZHcm91cCB9IGZyb20gJy4vdmVydGljYWwtbmF2LWdyb3VwJztcbmltcG9ydCB7IENsclZlcnRpY2FsTmF2R3JvdXBDaGlsZHJlbiB9IGZyb20gJy4vdmVydGljYWwtbmF2LWdyb3VwLWNoaWxkcmVuJztcbmltcG9ydCB7IENsclZlcnRpY2FsTmF2SWNvbiB9IGZyb20gJy4vdmVydGljYWwtbmF2LWljb24nO1xuaW1wb3J0IHsgQ2xyVmVydGljYWxOYXZMaW5rIH0gZnJvbSAnLi92ZXJ0aWNhbC1uYXYtbGluayc7XG5cbmV4cG9ydCBjb25zdCBDTFJfVkVSVElDQUxfTkFWX0RJUkVDVElWRVM6IFR5cGU8YW55PltdID0gW1xuICBDbHJWZXJ0aWNhbE5hdixcbiAgQ2xyVmVydGljYWxOYXZMaW5rLFxuICBDbHJWZXJ0aWNhbE5hdkdyb3VwLFxuICBDbHJWZXJ0aWNhbE5hdkdyb3VwQ2hpbGRyZW4sXG4gIENsclZlcnRpY2FsTmF2SWNvbixcbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENsckljb25Nb2R1bGUsIENscklmRXhwYW5kTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQ0xSX1ZFUlRJQ0FMX05BVl9ESVJFQ1RJVkVTXSxcbiAgZXhwb3J0czogW0NMUl9WRVJUSUNBTF9OQVZfRElSRUNUSVZFUywgQ2xySWZFeHBhbmRNb2R1bGUsIENsckljb25Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJWZXJ0aWNhbE5hdk1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyTWFpbkNvbnRhaW5lck1vZHVsZSB9IGZyb20gJy4vbWFpbi1jb250YWluZXIvbWFpbi1jb250YWluZXIubW9kdWxlJztcbmltcG9ydCB7IENsck5hdmlnYXRpb25Nb2R1bGUgfSBmcm9tICcuL25hdi9uYXZpZ2F0aW9uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJUYWJzTW9kdWxlIH0gZnJvbSAnLi90YWJzL3RhYnMubW9kdWxlJztcbmltcG9ydCB7IENsclZlcnRpY2FsTmF2TW9kdWxlIH0gZnJvbSAnLi92ZXJ0aWNhbC1uYXYvdmVydGljYWwtbmF2Lm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7IGV4cG9ydHM6IFtDbHJNYWluQ29udGFpbmVyTW9kdWxlLCBDbHJOYXZpZ2F0aW9uTW9kdWxlLCBDbHJUYWJzTW9kdWxlLCBDbHJWZXJ0aWNhbE5hdk1vZHVsZV0gfSlcbmV4cG9ydCBjbGFzcyBDbHJMYXlvdXRNb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2Nyb2xsaW5nU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBhbnkpIHt9XG5cbiAgc3RvcFNjcm9sbGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ25vLXNjcm9sbGluZycpO1xuICB9XG5cbiAgcmVzdW1lU2Nyb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnbm8tc2Nyb2xsaW5nJykpIHtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbm8tc2Nyb2xsaW5nJyk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25FdmVudCwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBWaWV3Q2hpbGQsXG4gIEluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZvY3VzVHJhcERpcmVjdGl2ZSB9IGZyb20gJy4uL3V0aWxzL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2Nyb2xsaW5nU2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3Njcm9sbGluZy9zY3JvbGxpbmctc2VydmljZSc7XG5pbXBvcnQgeyBDbHJDb21tb25TdHJpbmdzIH0gZnJvbSAnLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVU5JUVVFX0lELCBVTklRVUVfSURfUFJPVklERVIgfSBmcm9tICcuLi91dGlscy9pZC1nZW5lcmF0b3IvaWQtZ2VuZXJhdG9yLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItbW9kYWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbU2Nyb2xsaW5nU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgICA6aG9zdCB7IGRpc3BsYXk6IG5vbmU7IH1cbiAgICAgICAgOmhvc3Qub3BlbiB7IGRpc3BsYXk6IGlubGluZTsgfVxuICAgIGAsXG4gIF0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdmYWRlRG93bicsIFtcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gZmFsc2UnLCBbc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoMCwgLTI1JSknIH0pLCBhbmltYXRlKCcwLjJzIGVhc2UtaW4tb3V0JyldKSxcbiAgICAgIHRyYW5zaXRpb24oJ2ZhbHNlID0+IConLCBbYW5pbWF0ZSgnMC4ycyBlYXNlLWluLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlKDAsIC0yNSUpJyB9KSldKSxcbiAgICBdKSxcbiAgICB0cmlnZ2VyKCdmYWRlJywgW1xuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW3N0eWxlKHsgb3BhY2l0eTogMCB9KSwgYW5pbWF0ZSgnMC4ycyBlYXNlLWluLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogMC44NSB9KSldKSxcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIFthbmltYXRlKCcwLjJzIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKV0pLFxuICAgIF0pLFxuICBdLFxuICBwcm92aWRlcnM6IFtVTklRVUVfSURfUFJPVklERVJdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJNb2RhbCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChGb2N1c1RyYXBEaXJlY3RpdmUpIGZvY3VzVHJhcDogRm9jdXNUcmFwRGlyZWN0aXZlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3Mub3BlbicpXG4gIEBJbnB1dCgnY2xyTW9kYWxPcGVuJylcbiAgX29wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgnY2xyTW9kYWxPcGVuQ2hhbmdlJykgX29wZW5DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcblxuICBASW5wdXQoJ2Nsck1vZGFsQ2xvc2FibGUnKSBjbG9zYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgnY2xyTW9kYWxTaXplJykgc2l6ZTogc3RyaW5nO1xuICBASW5wdXQoJ2Nsck1vZGFsU3RhdGljQmFja2Ryb3AnKSBzdGF0aWNCYWNrZHJvcDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgnY2xyTW9kYWxTa2lwQW5pbWF0aW9uJykgc2tpcEFuaW1hdGlvbjogc3RyaW5nID0gJ2ZhbHNlJztcblxuICAvLyBwcmVzZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgYnkgd2l6YXJkc1xuICBASW5wdXQoJ2Nsck1vZGFsT3ZlcnJpZGVTY3JvbGxTZXJ2aWNlJykgYnlwYXNzU2Nyb2xsU2VydmljZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoJ2Nsck1vZGFsUHJldmVudENsb3NlJykgc3RvcENsb3NlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoJ2Nsck1vZGFsQWx0ZXJuYXRlQ2xvc2UnKSBhbHRDbG9zZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfc2Nyb2xsaW5nU2VydmljZTogU2Nyb2xsaW5nU2VydmljZSxcbiAgICBwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5ncyxcbiAgICBASW5qZWN0KFVOSVFVRV9JRCkgcHVibGljIG1vZGFsSWQ6IHN0cmluZ1xuICApIHt9XG5cbiAgZ2V0IHNpemVDbGFzcygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIHJldHVybiAnbW9kYWwtJyArIHRoaXMuc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIERldGVjdCB3aGVuIF9vcGVuIGlzIHNldCB0byB0cnVlIGFuZCBzZXQgbm8tc2Nyb2xsaW5nIHRvIHRydWVcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBbcHJvcE5hbWU6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJ5cGFzc1Njcm9sbFNlcnZpY2UgJiYgY2hhbmdlcyAmJiBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdfb3BlbicpKSB7XG4gICAgICBpZiAoY2hhbmdlcy5fb3Blbi5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsaW5nU2VydmljZS5zdG9wU2Nyb2xsaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zY3JvbGxpbmdTZXJ2aWNlLnJlc3VtZVNjcm9sbGluZygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3Njcm9sbGluZ1NlcnZpY2UucmVzdW1lU2Nyb2xsaW5nKCk7XG4gIH1cblxuICBvcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX29wZW4gPSB0cnVlO1xuICAgIHRoaXMuX29wZW5DaGFuZ2VkLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdib2R5OmtleXVwLmVzY2FwZScpXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0b3BDbG9zZSkge1xuICAgICAgdGhpcy5hbHRDbG9zZS5lbWl0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNsb3NhYmxlIHx8ICF0aGlzLl9vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX29wZW4gPSBmYWxzZTtcbiAgICAvLyB0b2RvOiByZW1vdmUgdGhpcyBhZnRlciBhbmltYXRpb24gYnVnIGlzIGZpeGVkIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE1Nzk4XG4gICAgLy8gdGhpcyB3YXMgaGFuZGxlZCBieSB0aGUgZmFkZURvbmUgZXZlbnQgYmVsb3csIGJ1dCB0aGF0IEFuaW1hdGlvbkV2ZW50IGlzIG5vdCBmaXJpbmcgaW4gQW5ndWxhciA0LjAuXG4gICAgdGhpcy5fb3BlbkNoYW5nZWQuZW1pdChmYWxzZSk7XG4gICAgLy8gU1BFQ01FXG4gICAgdGhpcy5mb2N1c1RyYXAuc2V0UHJldmlvdXNGb2N1cygpOyAvLyBIYW5kbGVzIG1vdmluZyBmb2N1cyBiYWNrIHRvIHRoZSBlbGVtZW50IHRoYXQgaGFkIGl0IGJlZm9yZS5cbiAgfVxuXG4gIGZhZGVEb25lKGU6IEFuaW1hdGlvbkV2ZW50KSB7XG4gICAgaWYgKGUudG9TdGF0ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICB0aGlzLl9vcGVuQ2hhbmdlZC5lbWl0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi9pY29uL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IENsckZvY3VzVHJhcE1vZHVsZSB9IGZyb20gJy4uL3V0aWxzL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyTW9kYWwgfSBmcm9tICcuL21vZGFsJztcblxuZXhwb3J0IGNvbnN0IENMUl9NT0RBTF9ESVJFQ1RJVkVTOiBUeXBlPGFueT5bXSA9IFtDbHJNb2RhbF07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENsckljb25Nb2R1bGUsIENsckZvY3VzVHJhcE1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9NT0RBTF9ESVJFQ1RJVkVTXSxcbiAgZXhwb3J0czogW0NMUl9NT0RBTF9ESVJFQ1RJVkVTXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyTW9kYWxNb2R1bGUge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3BvcG92ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvc2l0aW9uIHtcbiAgYW5jaG9yUG9pbnQ6IFBvaW50O1xuICBwb3BvdmVyUG9pbnQ6IFBvaW50O1xuICBvZmZzZXRZOiBudW1iZXI7XG4gIG9mZnNldFg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFNJR05QT1NUX1BPU0lUSU9OUzogeyBbaW5wdXQ6IHN0cmluZ106IFBvc2l0aW9uIH0gPSB7XG4gICd0b3AtbGVmdCc6IHsgYW5jaG9yUG9pbnQ6IFBvaW50LlRPUF9DRU5URVIsIHBvcG92ZXJQb2ludDogUG9pbnQuQk9UVE9NX1JJR0hULCBvZmZzZXRZOiAtMTAsIG9mZnNldFg6IDAgfSxcbiAgJ3RvcC1taWRkbGUnOiB7IGFuY2hvclBvaW50OiBQb2ludC5UT1BfQ0VOVEVSLCBwb3BvdmVyUG9pbnQ6IFBvaW50LkJPVFRPTV9DRU5URVIsIG9mZnNldFk6IC0xMCwgb2Zmc2V0WDogMCB9LFxuICAndG9wLXJpZ2h0JzogeyBhbmNob3JQb2ludDogUG9pbnQuVE9QX0NFTlRFUiwgcG9wb3ZlclBvaW50OiBQb2ludC5CT1RUT01fTEVGVCwgb2Zmc2V0WTogLTEwLCBvZmZzZXRYOiAwIH0sXG4gICdyaWdodC10b3AnOiB7IGFuY2hvclBvaW50OiBQb2ludC5SSUdIVF9DRU5URVIsIHBvcG92ZXJQb2ludDogUG9pbnQuTEVGVF9CT1RUT00sIG9mZnNldFk6IDIsIG9mZnNldFg6IDE0IH0sXG4gICdyaWdodC1taWRkbGUnOiB7IGFuY2hvclBvaW50OiBQb2ludC5SSUdIVF9DRU5URVIsIHBvcG92ZXJQb2ludDogUG9pbnQuTEVGVF9DRU5URVIsIG9mZnNldFk6IDYsIG9mZnNldFg6IDE0IH0sXG4gICdyaWdodC1ib3R0b20nOiB7IGFuY2hvclBvaW50OiBQb2ludC5SSUdIVF9DRU5URVIsIHBvcG92ZXJQb2ludDogUG9pbnQuTEVGVF9UT1AsIG9mZnNldFk6IC0xLCBvZmZzZXRYOiAxNCB9LFxuICAnYm90dG9tLXJpZ2h0JzogeyBhbmNob3JQb2ludDogUG9pbnQuQk9UVE9NX0NFTlRFUiwgcG9wb3ZlclBvaW50OiBQb2ludC5UT1BfTEVGVCwgb2Zmc2V0WTogOSwgb2Zmc2V0WDogLTEgfSxcbiAgJ2JvdHRvbS1taWRkbGUnOiB7IGFuY2hvclBvaW50OiBQb2ludC5CT1RUT01fQ0VOVEVSLCBwb3BvdmVyUG9pbnQ6IFBvaW50LlRPUF9DRU5URVIsIG9mZnNldFk6IDksIG9mZnNldFg6IDEyIH0sXG4gICdib3R0b20tbGVmdCc6IHsgYW5jaG9yUG9pbnQ6IFBvaW50LkJPVFRPTV9DRU5URVIsIHBvcG92ZXJQb2ludDogUG9pbnQuVE9QX1JJR0hULCBvZmZzZXRZOiA5LCBvZmZzZXRYOiAwIH0sXG4gICdsZWZ0LWJvdHRvbSc6IHsgYW5jaG9yUG9pbnQ6IFBvaW50LkxFRlRfQ0VOVEVSLCBwb3BvdmVyUG9pbnQ6IFBvaW50LlJJR0hUX1RPUCwgb2Zmc2V0WTogMCwgb2Zmc2V0WDogLTE0IH0sXG4gICdsZWZ0LW1pZGRsZSc6IHsgYW5jaG9yUG9pbnQ6IFBvaW50LkxFRlRfQ0VOVEVSLCBwb3BvdmVyUG9pbnQ6IFBvaW50LlJJR0hUX0NFTlRFUiwgb2Zmc2V0WTogNCwgb2Zmc2V0WDogLTE0IH0sXG4gICdsZWZ0LXRvcCc6IHsgYW5jaG9yUG9pbnQ6IFBvaW50LkxFRlRfQ0VOVEVSLCBwb3BvdmVyUG9pbnQ6IFBvaW50LlJJR0hUX0JPVFRPTSwgb2Zmc2V0WTogMCwgb2Zmc2V0WDogLTE0IH0sXG4gIGRlZmF1bHQ6IHsgYW5jaG9yUG9pbnQ6IFBvaW50LlJJR0hUX0NFTlRFUiwgcG9wb3ZlclBvaW50OiBQb2ludC5MRUZUX0NFTlRFUiwgb2Zmc2V0WTogNiwgb2Zmc2V0WDogMTQgfSxcbn07XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFBvcG92ZXIgfSBmcm9tICcuLi9jb21tb24vYWJzdHJhY3QtcG9wb3Zlcic7XG5pbXBvcnQgeyBQT1BPVkVSX0hPU1RfQU5DSE9SIH0gZnJvbSAnLi4vY29tbW9uL3BvcG92ZXItaG9zdC1hbmNob3IudG9rZW4nO1xuXG5pbXBvcnQgeyBTSUdOUE9TVF9QT1NJVElPTlMgfSBmcm9tICcuL3NpZ25wb3N0LXBvc2l0aW9ucyc7XG5pbXBvcnQgeyBDbHJDb21tb25TdHJpbmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvaTE4bi9jb21tb24tc3RyaW5ncy5pbnRlcmZhY2UnO1xuXG4vLyBha2Egd2hlcmUgdGhlIGFycm93IC8gcG9pbnRlciBpcyBhdCBpbiByZWxhdGlvbiB0byB0aGUgYW5jaG9yXG5jb25zdCBQT1NJVElPTlM6IHN0cmluZ1tdID0gW1xuICAndG9wLWxlZnQnLFxuICAndG9wLW1pZGRsZScsXG4gICd0b3AtcmlnaHQnLFxuICAncmlnaHQtdG9wJyxcbiAgJ3JpZ2h0LW1pZGRsZScsIC8vIGRlZmF1bHRcbiAgJ3JpZ2h0LWJvdHRvbScsXG4gICdib3R0b20tcmlnaHQnLFxuICAnYm90dG9tLW1pZGRsZScsXG4gICdib3R0b20tbGVmdCcsXG4gICdsZWZ0LWJvdHRvbScsXG4gICdsZWZ0LW1pZGRsZScsXG4gICdsZWZ0LXRvcCcsXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItc2lnbnBvc3QtY29udGVudCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWducG9zdC1mbGV4LXdyYXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyLXBvaW50ZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWducG9zdC1jb250ZW50LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2lnbnBvc3QtYWN0aW9uIGNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwiY2xvc2VcIiBbYXR0ci50aXRsZV09XCJjb21tb25TdHJpbmdzLmNsb3NlXCI+PC9jbHItaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZ25wb3N0LWNvbnRlbnQtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICBob3N0OiB7ICdbY2xhc3Muc2lnbnBvc3QtY29udGVudF0nOiAndHJ1ZScgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyU2lnbnBvc3RDb250ZW50IGV4dGVuZHMgQWJzdHJhY3RQb3BvdmVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChQT1BPVkVSX0hPU1RfQU5DSE9SKVxuICAgIHBhcmVudEhvc3Q6IEVsZW1lbnRSZWYsXG4gICAgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5nc1xuICApIHtcbiAgICBpZiAoIXBhcmVudEhvc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xyLXNpZ25wb3N0LWNvbnRlbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbHItc2lnbnBvc3QnKTtcbiAgICB9XG4gICAgc3VwZXIoaW5qZWN0b3IsIHBhcmVudEhvc3QpO1xuICAgIHRoaXMuY29tbW9uU3RyaW5ncyA9IGNvbW1vblN0cmluZ3M7XG4gICAgLy8gRGVmYXVsdHNcbiAgICB0aGlzLnBvc2l0aW9uID0gJ3JpZ2h0LW1pZGRsZSc7XG4gICAgdGhpcy5jbG9zZU9uT3V0c2lkZUNsaWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbW1vblN0cmluZ3M6IENsckNvbW1vblN0cmluZ3M7XG5cbiAgLyoqKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENsb3NlIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGUgc2lnbnBvc3QgaW5zdGFuY2UgdG8gdG9nZ2xlIHRoZSBzdGF0ZSBvZiB0aGUgY29udGVudCBwb3BvdmVyLlxuICAgKlxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX3Bvc2l0aW9uOiBzdHJpbmc7XG5cbiAgZ2V0IHBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuXG4gIC8qKioqKioqKipcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgc2V0dGVyIGZvciB0aGUgcG9zaXRpb24gb2YgdGhlIENsclNpZ25wb3N0Q29udGVudCBwb3BvdmVyLiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZzpcbiAgICogLSBhbmNob3JQb2ludCAtIHdoZXJlIG9uIHRoZSB0cmlnZ2VyIHRvIGFuY2hvciB0aGUgQ2xyU2lnbnBvc3RDb250ZW50XG4gICAqIC0gcG9wb3ZlclBvaW50IC0gd2hlcmUgb24gdGhlIENsclNpZ25wb3N0Q29udGVudCBjb250YWluZXIgdG8gYWxpZ24gd2l0aCB0aGUgYW5jaG9yUG9pbnRcbiAgICogLSBvZmZzZXRZIC0gd2hlcmUgb24gdGhlIFkgYXhpcyB0byBhbGlnbiB0aGUgQ2xyU2lnbnBvc3RDb250ZW50IHNvIGl0IG1lZXRzIHNwZWNzXG4gICAqIC0gb2Zmc2V0WCAtIHdoZXJlIG9uIHRoZSBYIGF4aXMgdG8gYWxpZ24gdGhlIENsclNpZ25wb3N0Q29udGVudCBzbyBpdCBtZWV0cyBzcGVjc1xuICAgKiBUaGVyZSBhcmUgMTIgcG9zc2libGUgcG9zaXRpb25zIHRvIHBsYWNlIGEgQ2xyU2lnbnBvc3RDb250ZW50IGNvbnRhaW5lcjpcbiAgICogLSB0b3AtbGVmdFxuICAgKiAtIHRvcC1taWRkbGVcbiAgICogLSB0b3AtcmlnaHRcbiAgICogLSByaWdodC10b3BcbiAgICogLSByaWdodC1taWRkbGVcbiAgICogLSByaWdodC1ib3R0b21cbiAgICogLSBib3R0b20tcmlnaHRcbiAgICogLSBib3R0b20tbWlkZGxlXG4gICAqIC0gYm90dG9tLWxlZnRcbiAgICogLSBsZWZ0LWJvdHRvbVxuICAgKiAtIGxlZnQtbWlkZGxlXG4gICAqIC0gbGVmdC10b3BcbiAgICpcbiAgICogSSB0aGluayBvZiBpdCBhcyBmb2xsb3dzIGZvciAndG9wLWxlZnQnIC0+IENPTlRBSU5FUl9TSURFLVNJREVfUE9TSVRJT04uIEluIHRoaXMgY2FzZSBDT05UQUlORVJfU0lERSBpcyAndG9wJ1xuICAgKiBtZWFuaW5nIHRoZSB0b3Agb2YgdGhlIHRyaWdnZXIgaWNvbiAoYWJvdmUgdGhlIGljb24gdGhhdCBoaWRlcy9zaG93cykgdGhlIENsclNpZ25wb3N0Q29udGVudC4gQW5kLCBTSURFX1BPU0lUSU9OXG4gICAqIGlzICdsZWZ0JyBtZWFuaW5nIHR3byB0aGluZ3M6IDEpIHRoZSBDbHJTaWducG9zdENvbnRlbnQgY29udGFpbmVyIGV4dGVuZHMgdG8gdGhlIGxlZnQgYW5kIDIpIHRoZSAnYXJyb3cvcG9pbnRlcidcbiAgICogbGlua2luZyB0aGUgU2luZ3Bvc3RDb250ZW50IHRvIHRoZSB0cmlnZ2VyIHBvaW50cyBkb3duIGF0IHRoZSBob3Jpem9udGFsIGNlbnRlciBvZiB0aGUgdHJpZ2dlciBpY29uLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3UG9zaXRpb25cbiAgICovXG4gIEBJbnB1dCgnY2xyUG9zaXRpb24nKVxuICBzZXQgcG9zaXRpb24ocG9zaXRpb246IHN0cmluZykge1xuICAgIC8vIFVnaFxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnBvc2l0aW9uKTtcbiAgICBpZiAocG9zaXRpb24gJiYgUE9TSVRJT05TLmluZGV4T2YocG9zaXRpb24pID4gLTEpIHtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uID0gcG9zaXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uID0gJ3JpZ2h0LW1pZGRsZSc7XG4gICAgfVxuICAgIC8vIFVnaFxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnBvc2l0aW9uKTtcblxuICAgIGNvbnN0IHNldFBvc2l0aW9uID0gU0lHTlBPU1RfUE9TSVRJT05TW3RoaXMucG9zaXRpb25dO1xuICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBzZXRQb3NpdGlvbi5hbmNob3JQb2ludDtcbiAgICB0aGlzLnBvcG92ZXJQb2ludCA9IHNldFBvc2l0aW9uLnBvcG92ZXJQb2ludDtcbiAgICB0aGlzLnBvcG92ZXJPcHRpb25zLm9mZnNldFkgPSBzZXRQb3NpdGlvbi5vZmZzZXRZO1xuICAgIHRoaXMucG9wb3Zlck9wdGlvbnMub2Zmc2V0WCA9IHNldFBvc2l0aW9uLm9mZnNldFg7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi9pY29uL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IENsckNvbmRpdGlvbmFsTW9kdWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZGl0aW9uYWwvY29uZGl0aW9uYWwubW9kdWxlJztcbmltcG9ydCB7IENsckNvbW1vblBvcG92ZXJNb2R1bGUgfSBmcm9tICcuLi9jb21tb24vcG9wb3Zlci5tb2R1bGUnO1xuXG5pbXBvcnQgeyBDbHJTaWducG9zdCB9IGZyb20gJy4vc2lnbnBvc3QnO1xuaW1wb3J0IHsgQ2xyU2lnbnBvc3RDb250ZW50IH0gZnJvbSAnLi9zaWducG9zdC1jb250ZW50JztcbmltcG9ydCB7IENsclNpZ25wb3N0VHJpZ2dlciB9IGZyb20gJy4vc2lnbnBvc3QtdHJpZ2dlcic7XG5cbmV4cG9ydCBjb25zdCBDTFJfU0lHTlBPU1RfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyU2lnbnBvc3QsIENsclNpZ25wb3N0Q29udGVudCwgQ2xyU2lnbnBvc3RUcmlnZ2VyXTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2xyQ29tbW9uUG9wb3Zlck1vZHVsZSwgQ2xySWNvbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9TSUdOUE9TVF9ESVJFQ1RJVkVTXSxcbiAgZXhwb3J0czogW0NMUl9TSUdOUE9TVF9ESVJFQ1RJVkVTLCBDbHJDb25kaXRpb25hbE1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIENsclNpZ25wb3N0TW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElmT3BlblNlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy9jb25kaXRpb25hbC9pZi1vcGVuLnNlcnZpY2UnO1xuaW1wb3J0IHsgUE9QT1ZFUl9IT1NUX0FOQ0hPUiB9IGZyb20gJy4uL2NvbW1vbi9wb3BvdmVyLWhvc3QtYW5jaG9yLnRva2VuJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2xyLXRvb2x0aXAnLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MudG9vbHRpcF0nOiAndHJ1ZScsXG4gIH0sXG4gIHByb3ZpZGVyczogW0lmT3BlblNlcnZpY2UsIHsgcHJvdmlkZTogUE9QT1ZFUl9IT1NUX0FOQ0hPUiwgdXNlRXhpc3Rpbmc6IEVsZW1lbnRSZWYgfV0sXG59KVxuZXhwb3J0IGNsYXNzIENsclRvb2x0aXAge31cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbmplY3RvciwgSW5wdXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFBvcG92ZXIgfSBmcm9tICcuLi9jb21tb24vYWJzdHJhY3QtcG9wb3Zlcic7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2NvbW1vbi9wb3BvdmVyJztcbmltcG9ydCB7IFBPUE9WRVJfSE9TVF9BTkNIT1IgfSBmcm9tICcuLi9jb21tb24vcG9wb3Zlci1ob3N0LWFuY2hvci50b2tlbic7XG5cbmNvbnN0IFBPU0lUSU9OUzogc3RyaW5nW10gPSBbJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCcsICd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAncmlnaHQnLCAnbGVmdCddO1xuXG5jb25zdCBTSVpFUzogc3RyaW5nW10gPSBbJ3hzJywgJ3NtJywgJ21kJywgJ2xnJ107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci10b29sdGlwLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgYCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MudG9vbHRpcC1jb250ZW50XSc6ICd0cnVlJyxcbiAgICAvLyBJJ20gZ2l2aW5nIHVwIG9uIGFuaW1hdGlvbiwgdGhleSBkaWQgbm90IHdvcmsgYmVmb3JlIGFuZCB3aWxsIG5vdCB3b3JrIG5vdy5cbiAgICAvLyBUb28gbWFueSBjb25mbGljdHMgd2l0aCBDbGFyaXR5IFVJLlxuICAgICdbc3R5bGUub3BhY2l0eV0nOiAnMScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENsclRvb2x0aXBDb250ZW50IGV4dGVuZHMgQWJzdHJhY3RQb3BvdmVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChQT1BPVkVSX0hPU1RfQU5DSE9SKVxuICAgIHBhcmVudEhvc3Q6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgaWYgKCFwYXJlbnRIb3N0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nsci10b29sdGlwLWNvbnRlbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbHItdG9vbHRpcCcpO1xuICAgIH1cbiAgICBzdXBlcihpbmplY3RvciwgcGFyZW50SG9zdCk7XG4gICAgLy8gRGVmYXVsdHNcbiAgICB0aGlzLnBvc2l0aW9uID0gJ3JpZ2h0JztcbiAgICB0aGlzLnNpemUgPSAnc20nO1xuICB9XG5cbiAgcHJpdmF0ZSBfcG9zaXRpb246IHN0cmluZztcblxuICBnZXQgcG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICB9XG5cbiAgQElucHV0KCdjbHJQb3NpdGlvbicpXG4gIHNldCBwb3NpdGlvbihwb3NpdGlvbjogc3RyaW5nKSB7XG4gICAgLy8gVWdoXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0b29sdGlwLScgKyB0aGlzLnBvc2l0aW9uKTtcbiAgICBpZiAocG9zaXRpb24gJiYgUE9TSVRJT05TLmluZGV4T2YocG9zaXRpb24pID4gLTEpIHtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uID0gcG9zaXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uID0gJ3JpZ2h0JztcbiAgICB9XG4gICAgLy8gVWdoXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0b29sdGlwLScgKyB0aGlzLnBvc2l0aW9uKTtcblxuICAgIC8vIHNldCB0aGUgcG9wb3ZlciB2YWx1ZXMgYmFzZWQgb24gZGlyZWN0aW9uXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LlRPUF9DRU5URVI7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuTEVGVF9CT1RUT007XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuVE9QX0NFTlRFUjtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5SSUdIVF9CT1RUT007XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgdGhpcy5hbmNob3JQb2ludCA9IFBvaW50LkJPVFRPTV9DRU5URVI7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuTEVGVF9UT1A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuQk9UVE9NX0NFTlRFUjtcbiAgICAgICAgdGhpcy5wb3BvdmVyUG9pbnQgPSBQb2ludC5SSUdIVF9UT1A7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuUklHSFRfQ0VOVEVSO1xuICAgICAgICB0aGlzLnBvcG92ZXJQb2ludCA9IFBvaW50LkxFRlRfVE9QO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0aGlzLmFuY2hvclBvaW50ID0gUG9pbnQuTEVGVF9DRU5URVI7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuUklHSFRfVE9QO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuYW5jaG9yUG9pbnQgPSBQb2ludC5SSUdIVF9DRU5URVI7XG4gICAgICAgIHRoaXMucG9wb3ZlclBvaW50ID0gUG9pbnQuTEVGVF9UT1A7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NpemU6IHN0cmluZztcblxuICBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyU2l6ZScpXG4gIHNldCBzaXplKHNpemU6IHN0cmluZykge1xuICAgIC8vIFVnaFxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndG9vbHRpcC0nICsgdGhpcy5zaXplKTtcbiAgICBpZiAoc2l6ZSAmJiBTSVpFUy5pbmRleE9mKHNpemUpID4gLTEpIHtcbiAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zaXplID0gJ3NtJztcbiAgICB9XG4gICAgLy8gVWdoXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0b29sdGlwLScgKyB0aGlzLnNpemUpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWZPcGVuU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmRpdGlvbmFsL2lmLW9wZW4uc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJUb29sdGlwVHJpZ2dlcl0nLCBob3N0OiB7ICdbYXR0ci50YWJpbmRleF0nOiAnMCcsICdbY2xhc3MudG9vbHRpcC10cmlnZ2VyXSc6ICd0cnVlJyB9IH0pXG5leHBvcnQgY2xhc3MgQ2xyVG9vbHRpcFRyaWdnZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlmT3BlblNlcnZpY2U6IElmT3BlblNlcnZpY2UpIHt9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgc2hvd1Rvb2x0aXAoKTogdm9pZCB7XG4gICAgdGhpcy5pZk9wZW5TZXJ2aWNlLm9wZW4gPSB0cnVlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLmlmT3BlblNlcnZpY2Uub3BlbiA9IGZhbHNlO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJJY29uTW9kdWxlIH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb25kaXRpb25hbE1vZHVsZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmRpdGlvbmFsL2NvbmRpdGlvbmFsLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJDb21tb25Qb3BvdmVyTW9kdWxlIH0gZnJvbSAnLi4vY29tbW9uL3BvcG92ZXIubW9kdWxlJztcblxuaW1wb3J0IHsgQ2xyVG9vbHRpcCB9IGZyb20gJy4vdG9vbHRpcCc7XG5pbXBvcnQgeyBDbHJUb29sdGlwQ29udGVudCB9IGZyb20gJy4vdG9vbHRpcC1jb250ZW50JztcbmltcG9ydCB7IENsclRvb2x0aXBUcmlnZ2VyIH0gZnJvbSAnLi90b29sdGlwLXRyaWdnZXInO1xuXG5leHBvcnQgY29uc3QgQ0xSX1RPT0xUSVBfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyVG9vbHRpcCwgQ2xyVG9vbHRpcFRyaWdnZXIsIENsclRvb2x0aXBDb250ZW50XTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2xyQ29tbW9uUG9wb3Zlck1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0NMUl9UT09MVElQX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX1RPT0xUSVBfRElSRUNUSVZFUywgQ2xyQ29uZGl0aW9uYWxNb2R1bGUsIENsckljb25Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJUb29sdGlwTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJEcm9wZG93bk1vZHVsZSB9IGZyb20gJy4vZHJvcGRvd24vZHJvcGRvd24ubW9kdWxlJztcbmltcG9ydCB7IENsclNpZ25wb3N0TW9kdWxlIH0gZnJvbSAnLi9zaWducG9zdC9zaWducG9zdC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyVG9vbHRpcE1vZHVsZSB9IGZyb20gJy4vdG9vbHRpcC90b29sdGlwLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7IGV4cG9ydHM6IFtDbHJEcm9wZG93bk1vZHVsZSwgQ2xyU2lnbnBvc3RNb2R1bGUsIENsclRvb2x0aXBNb2R1bGVdIH0pXG5leHBvcnQgY2xhc3MgQ2xyUG9wb3Zlck1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCdXR0b25IdWJTZXJ2aWNlIHtcbiAgcHVibGljIGJ1dHRvbnNSZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ByZXZpb3VzQnRuQ2xpY2tlZCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHVibGljIGdldCBwcmV2aW91c0J0bkNsaWNrZWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJldmlvdXNCdG5DbGlja2VkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmV4dEJ0bkNsaWNrZWQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHB1YmxpYyBnZXQgbmV4dEJ0bkNsaWNrZWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fbmV4dEJ0bkNsaWNrZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIF9kYW5nZXJCdG5DbGlja2VkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBwdWJsaWMgZ2V0IGRhbmdlckJ0bkNsaWNrZWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFuZ2VyQnRuQ2xpY2tlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbmNlbEJ0bkNsaWNrZWQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHB1YmxpYyBnZXQgY2FuY2VsQnRuQ2xpY2tlZCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5jZWxCdG5DbGlja2VkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluaXNoQnRuQ2xpY2tlZCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHVibGljIGdldCBmaW5pc2hCdG5DbGlja2VkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbmlzaEJ0bkNsaWNrZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIF9jdXN0b21CdG5DbGlja2VkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBwdWJsaWMgZ2V0IGN1c3RvbUJ0bkNsaWNrZWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tQnRuQ2xpY2tlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBidXR0b25DbGlja2VkKGJ1dHRvblR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgncHJldmlvdXMnID09PSBidXR0b25UeXBlKSB7XG4gICAgICB0aGlzLl9wcmV2aW91c0J0bkNsaWNrZWQubmV4dCgpO1xuICAgIH0gZWxzZSBpZiAoJ25leHQnID09PSBidXR0b25UeXBlKSB7XG4gICAgICB0aGlzLl9uZXh0QnRuQ2xpY2tlZC5uZXh0KCk7XG4gICAgfSBlbHNlIGlmICgnZmluaXNoJyA9PT0gYnV0dG9uVHlwZSkge1xuICAgICAgdGhpcy5fZmluaXNoQnRuQ2xpY2tlZC5uZXh0KCk7XG4gICAgfSBlbHNlIGlmICgnZGFuZ2VyJyA9PT0gYnV0dG9uVHlwZSkge1xuICAgICAgdGhpcy5fZGFuZ2VyQnRuQ2xpY2tlZC5uZXh0KCk7XG4gICAgfSBlbHNlIGlmICgnY2FuY2VsJyA9PT0gYnV0dG9uVHlwZSkge1xuICAgICAgdGhpcy5fY2FuY2VsQnRuQ2xpY2tlZC5uZXh0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N1c3RvbUJ0bkNsaWNrZWQubmV4dChidXR0b25UeXBlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENscldpemFyZFBhZ2UgfSBmcm9tICcuLi93aXphcmQtcGFnZSc7XG5cbi8qKlxuICogUGFnZUNvbGxlY3Rpb25TZXJ2aWNlIG1hbmFnZXMgdGhlIGNvbGxlY3Rpb24gb2YgcGFnZXMgYXNzaWduZWQgdG8gdGhlIHdpemFyZCBhbmQgb2ZmZXJzXG4gKiBhIG51bWJlciBvZiBmdW5jdGlvbnMgdXNlZnVsIGFjcm9zcyB0aGUgd2l6YXJkcyBwcm92aWRlcnMgYW5kIHN1YmNvbXBvbmVudHMgLS0gYWxsIHJlbGF0ZWRcbiAqIHRvIGVzc2VudGlhbGx5IGxvb2t1cHMgb24gdGhlIGNvbGxlY3Rpb24gb2YgcGFnZXMuXG4gKlxuICogVGhlIGVhc2llc3Qgd2F5IHRvIGFjY2VzcyBQYWdlQ29sbGVjdGlvblNlcnZpY2UgaXMgdmlhIHRoZSB3aXphcmQuIFRoZVxuICogZm9sbG93aW5nIGV4YW1wbGUgd291bGQgYWxsb3cgeW91IHRvIGFjY2VzcyB5b3VyIGluc3RhbmNlIG9mIHRoZSB3aXphcmQgZnJvbSB5b3VyIGhvc3RcbiAqIGNvbXBvbmVudCBhbmQgdGhlcmVieSBhY2Nlc3MgdGhlIHBhZ2UgY29sbGVjdGlvbiB2aWEgWW91ckhvc3RDb21wb25lbnQud2l6YXJkLnBhZ2VDb2xsZWN0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8Y2xyLXdpemFyZCAjd2l6YXJkIC4uLj5cbiAqXG4gKiBAZXhhbXBsZVxuICogZXhwb3J0IGNsYXNzIFlvdXJIb3N0Q29tcG9uZW50IHtcbiAqICAgQFZpZXdDaGlsZChcIndpemFyZFwiKSB3aXphcmQ6IFdpemFyZDtcbiAqICAgLi4uXG4gKiB9XG4gKlxuICogVGhlIGhlYXJ0IG9mIHRoZSBwYWdlIGNvbGxlY3Rpb24gaXMgdGhlIHF1ZXJ5IGxpc3Qgb2YgcGFnZXMsIHdoaWNoIGl0IGlzIGFzc2lnbmVkIGFzIGFcbiAqIHJlZmVyZW5jZSB0byB0aGUgV2l6YXJkLnBhZ2VzIFF1ZXJ5TGlzdCB3aGVuIHRoZSB3aXphcmQgaXMgY3JlYXRlZC5cbiAqXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQYWdlQ29sbGVjdGlvblNlcnZpY2Uge1xuICAvKipcbiAgICogQSByZWZlcmVuY2UgdG8gdGhlIFdpemFyZC5wYWdlcyBRdWVyeUxpc3QuXG4gICAqXG4gICAqIFBvcHVsYXRlZCB3aGVuIHRoZSB3aXphcmQgaXMgY3JlYXRlZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIHBhZ2VzOiBRdWVyeUxpc3Q8Q2xyV2l6YXJkUGFnZT47XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBQYWdlQ29sbGVjdGlvblNlcnZpY2UucGFnZXMgUXVlcnlMaXN0IHRvIGFuIGFycmF5IGFuZCByZXR1cm5zIGl0LlxuICAgKlxuICAgKiBVc2VmdWwgZm9yIG1hbnkgaW5zdGFuY2VzIHdoZW4geW91IHdvdWxkIHByZWZlciBhIFF1ZXJ5TGlzdCB0byBhY3QgbGlrZSBhbiBhcnJheS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlc0FzQXJyYXkoKTogQ2xyV2l6YXJkUGFnZVtdIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcyA/IHRoaXMucGFnZXMudG9BcnJheSgpIDogW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWdlcyBxdWVyeSBsaXN0LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VzQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcyA/IHRoaXMucGFnZXMubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBuZXh0LXRvLWxhc3QgcGFnZSBpbiB0aGUgcXVlcnkgbGlzdCBvZiBwYWdlcy4gT3BlcmF0ZXMgYXMgYSBnZXR0ZXJcbiAgICogc28gdGhhdCBpdCBpc24ndCB3b3JraW5nIHdpdGggc3RhbGUgZGF0YS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBwZW51bHRpbWF0ZVBhZ2UoKTogQ2xyV2l6YXJkUGFnZSB7XG4gICAgY29uc3QgcGFnZUNvdW50ID0gdGhpcy5wYWdlc0NvdW50O1xuXG4gICAgaWYgKHBhZ2VDb3VudCA8IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYWdlc0FzQXJyYXlbcGFnZUNvdW50IC0gMl07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGFzdCBwYWdlIGluIHRoZSBxdWVyeSBsaXN0IG9mIHBhZ2VzLiBPcGVyYXRlcyBhcyBhIGdldHRlclxuICAgKiBzbyB0aGF0IGl0IGlzbid0IHdvcmtpbmcgd2l0aCBzdGFsZSBkYXRhLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhc3RQYWdlKCk6IENscldpemFyZFBhZ2Uge1xuICAgIGNvbnN0IHBhZ2VDb3VudCA9IHRoaXMucGFnZXNDb3VudDtcblxuICAgIGlmIChwYWdlQ291bnQgPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFnZXNBc0FycmF5W3BhZ2VDb3VudCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IHBhZ2UgaW4gdGhlIHF1ZXJ5IGxpc3Qgb2YgcGFnZXMuIE9wZXJhdGVzIGFzIGEgZ2V0dGVyXG4gICAqIHNvIHRoYXQgaXQgaXNuJ3Qgd29ya2luZyB3aXRoIHN0YWxlIGRhdGEuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQYWdlQ29sbGVjdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RQYWdlKCk6IENscldpemFyZFBhZ2Uge1xuICAgIGlmICghdGhpcy5wYWdlc0NvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFnZXNBc0FycmF5WzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgbW9zdGx5IGludGVybmFsbHksIGJ1dCBhY2NlcHRzIGEgc3RyaW5nIElEIGFuZCByZXR1cm5zIGEgQ2xyV2l6YXJkUGFnZVxuICAgKiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBJRCBwYXNzZWQuIE5vdGUgdGhhdCBJRHMgaGVyZSBzaG91bGQgaW5jbHVkZSB0aGUgcHJlZml4XG4gICAqIFwiY2xyLXdpemFyZC1wYWdlLVwiLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBuZXh0LXRvLWxhc3QgcGFnZSBpbiB0aGUgcXVlcnkgbGlzdCBvZiBwYWdlcy4gT3BlcmF0ZXMgYXMgYSBnZXR0ZXJcbiAgICogc28gdGhhdCBpdCBpc24ndCB3b3JraW5nIHdpdGggc3RhbGUgZGF0YS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VCeUlkKGlkOiBzdHJpbmcpOiBDbHJXaXphcmRQYWdlIHtcbiAgICBjb25zdCBmb3VuZFBhZ2VzOiBDbHJXaXphcmRQYWdlW10gPSB0aGlzLnBhZ2VzLmZpbHRlcigocGFnZTogQ2xyV2l6YXJkUGFnZSkgPT4gaWQgPT09IHBhZ2UuaWQpO1xuICAgIHJldHVybiB0aGlzLmNoZWNrUmVzdWx0cyhmb3VuZFBhZ2VzLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBzIG51bWJlciBhcyBhIHBhcmFtZXRlciBhbmQgdHJlYXRzIHRoYXQgbnVtYmVyIGFzIHRoZSBpbmRleCBvZiB0aGUgcGFnZVxuICAgKiB5b3UncmUgbG9va2luZyBmb3IgaW4gdGhlIGNvbGxlY3Rpb24gb2YgcGFnZXMuIFJldHVybnMgYSAgd2l6YXJkIHBhZ2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZUJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IENscldpemFyZFBhZ2Uge1xuICAgIGNvbnN0IHBhZ2VDb3VudCA9IHRoaXMucGFnZXNDb3VudDtcbiAgICBjb25zdCBwYWdlc0xhc3RJbmRleDogbnVtYmVyID0gcGFnZUNvdW50ID4gMSA/IHBhZ2VDb3VudCAtIDEgOiAwO1xuXG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmV0cmlldmUgcGFnZSB3aXRoIGluZGV4IG9mICcgKyBpbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID4gcGFnZXNMYXN0SW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFnZSBpbmRleCBpcyBncmVhdGVyIHRoYW4gbGVuZ3RoIG9mIHBhZ2VzIGFycmF5LicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhZ2VzQXNBcnJheVtpbmRleF07XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSB3aXphcmQgcGFnZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgaXRzIGluZGV4IGluIHRoZVxuICAgKiBjb2xsZWN0aW9uIG9mIHBhZ2VzLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZUluZGV4KHBhZ2U6IENscldpemFyZFBhZ2UpOiBudW1iZXIge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wYWdlc0FzQXJyYXkuaW5kZXhPZihwYWdlKTtcblxuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdGVkIHBhZ2UgY2Fubm90IGJlIGZvdW5kIGluIGNvbGxlY3Rpb24gb2YgcGFnZXMuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBndWFyZCBsb2dpYyB0aGF0IHByZXZlbnRzIGEgY291cGxlIG9mIHVuZm9ydHVuYXRlIGVkZ2UgY2FzZXMgd2l0aFxuICAgKiBsb29rIHVwcyBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYWdlcy5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1Jlc3VsdHMocmVzdWx0czogQ2xyV2l6YXJkUGFnZVtdLCByZXF1ZXN0ZWRQYWdlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGZvdW5kUGFnZXNDb3VudDogbnVtYmVyID0gcmVzdWx0cy5sZW5ndGggfHwgMDtcblxuICAgIGlmIChmb3VuZFBhZ2VzQ291bnQgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vcmUgdGhhbiBvbmUgcGFnZSBoYXMgdGhlIHJlcXVlc3RlZCBpZCAnICsgcmVxdWVzdGVkUGFnZUlkICsgJy4nKTtcbiAgICB9IGVsc2UgaWYgKGZvdW5kUGFnZXNDb3VudCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcGFnZSBjYW4gYmUgZm91bmQgd2l0aCB0aGUgaWQgJyArIHJlcXVlc3RlZFBhZ2VJZCArICcuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHRzWzBdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHRzIHR3byBudW1lcmljIGluZGV4ZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygd2l6YXJkIHBhZ2Ugb2JqZWN0cyB0aGF0IGluY2x1ZGVcbiAgICogYWxsIHdpemFyZCBwYWdlcyBpbiB0aGUgcGFnZSBjb2xsZWN0aW9uIGZyb20gdGhlIGZpcnN0IGluZGV4IHRvIHRoZSBzZWNvbmQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQYWdlQ29sbGVjdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBwYWdlUmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBDbHJXaXphcmRQYWdlW10ge1xuICAgIGxldCBwYWdlczogQ2xyV2l6YXJkUGFnZVtdID0gW107XG5cbiAgICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPT09IG51bGwgfHwgdHlwZW9mIHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgaXNOYU4oc3RhcnQpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKGVuZCA9PT0gbnVsbCB8fCB0eXBlb2YgZW5kID09PSB1bmRlZmluZWQgfHwgaXNOYU4oZW5kKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmIChlbmQgPiB0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgIGVuZCA9IHRoaXMucGFnZXNDb3VudDtcbiAgICB9XG5cbiAgICBwYWdlcyA9IHRoaXMucGFnZXNBc0FycmF5O1xuXG4gICAgaWYgKGVuZCAtIHN0YXJ0ID09PSAwKSB7XG4gICAgICAvLyBqdXN0IHJldHVybiB0aGUgb25lIHBhZ2UgdGhleSB3YW50XG4gICAgICByZXR1cm4gW3RoaXMuZ2V0UGFnZUJ5SW5kZXgoc3RhcnQpXTtcbiAgICB9XG5cbiAgICAvLyBzbGljZSBlbmQgZG9lcyBub3QgaW5jbHVkZSBpdGVtIHJlZmVyZW5jZWQgYnkgZW5kIGluZGV4LCB3aGljaCBpcyB3ZWlyZCBmb3IgdXNlcnNcbiAgICAvLyBpbmNyZW1lbnRpbmcgZW5kIGluZGV4IGhlcmUgdG8gY29ycmVjdCB0aGF0IHNvIHVzZXJzIGFuZCBvdGhlciBtZXRob2RzXG4gICAgLy8gZG9uJ3QgaGF2ZSB0byB0aGluayBhYm91dCBpdFxuICAgIGVuZCA9IGVuZCArIDE7XG5cbiAgICAvLyBzbGljZSBkb2VzIG5vdCByZXR1cm4gdGhlIGxhc3Qgb25lIGluIHRoZSByYW5nZSBidXQgaXQgZG9lcyBpbmNsdWRlIHRoZSBmaXJzdCBvbmVcbiAgICAvLyBkb2VzIG5vdCBtb2RpZnkgb3JpZ2luYWwgYXJyYXlcbiAgICByZXR1cm4gcGFnZXMuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyB0d28gd2l6YXJkIHBhZ2Ugb2JqZWN0cyBhbmQgcmV0dXJucyB0aG9zZSBwYWdlIG9iamVjdHMgd2l0aCBhbGwgb3RoZXIgcGFnZVxuICAgKiBvYmplY3RzIGJldHdlZW4gdGhlbSBpbiB0aGUgcGFnZSBjb2xsZWN0aW9uLiBJdCBkb2Vzbid0IGNhcmUgd2hpY2ggcGFnZSBpcyBhaGVhZCBvZiB0aGVcbiAgICogb3RoZXIgaW4gdGhlIHBhcmFtZXRlcnMuIEl0IHdpbGwgYmUgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSB0aGF0IG91dCAgb24gaXRzIG93bi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VSYW5nZUZyb21QYWdlcyhwYWdlOiBDbHJXaXphcmRQYWdlLCBvdGhlclBhZ2U6IENscldpemFyZFBhZ2UpOiBDbHJXaXphcmRQYWdlW10ge1xuICAgIGNvbnN0IHBhZ2VJbmRleCA9IHRoaXMuZ2V0UGFnZUluZGV4KHBhZ2UpO1xuICAgIGNvbnN0IG90aGVyUGFnZUluZGV4ID0gdGhpcy5nZXRQYWdlSW5kZXgob3RoZXJQYWdlKTtcbiAgICBsZXQgc3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGxldCBlbmRJbmRleDogbnVtYmVyO1xuXG4gICAgaWYgKHBhZ2VJbmRleCA8PSBvdGhlclBhZ2VJbmRleCkge1xuICAgICAgc3RhcnRJbmRleCA9IHBhZ2VJbmRleDtcbiAgICAgIGVuZEluZGV4ID0gb3RoZXJQYWdlSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0SW5kZXggPSBvdGhlclBhZ2VJbmRleDtcbiAgICAgIGVuZEluZGV4ID0gcGFnZUluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYWdlUmFuZ2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgd2l6YXJkIHBhZ2Ugb2JqZWN0IGFzIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBvYmplY3Qgb2ZcbiAgICogdGhlIHBhZ2UgaW1tZWRpYXRlbHkgYmVmb3JlIGl0IGluIHRoZSBwYWdlIGNvbGxlY3Rpb24uIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpc1xuICAgKiBubyBwYWdlIGJlZm9yZSB0aGUgcGFnZSBpdCBpcyBwYXNzZWQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQYWdlQ29sbGVjdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXRQcmV2aW91c1BhZ2UocGFnZTogQ2xyV2l6YXJkUGFnZSkge1xuICAgIGNvbnN0IG15UGFnZUluZGV4ID0gdGhpcy5nZXRQYWdlSW5kZXgocGFnZSk7XG4gICAgY29uc3QgcHJldmlvdXNQYWdlSW5kZXggPSBteVBhZ2VJbmRleCAtIDE7XG4gICAgaWYgKHByZXZpb3VzUGFnZUluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeUluZGV4KHByZXZpb3VzUGFnZUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHRzIGEgd2l6YXJkIHBhZ2Ugb2JqZWN0IGFzIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgQm9vbGVhbiB0aGF0IHNheXMgaWZcbiAgICogdGhlIHBhZ2UgeW91IHNlbnQgaXQgaXMgY29tcGxldGUuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQYWdlQ29sbGVjdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBwcmV2aW91c1BhZ2VJc0NvbXBsZXRlZChwYWdlOiBDbHJXaXphcmRQYWdlKSB7XG4gICAgbGV0IHByZXZpb3VzUGFnZTogQ2xyV2l6YXJkUGFnZTtcblxuICAgIGlmICghcGFnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByZXZpb3VzUGFnZSA9IHRoaXMuZ2V0UHJldmlvdXNQYWdlKHBhZ2UpO1xuXG4gICAgaWYgKG51bGwgPT09IHByZXZpb3VzUGFnZSkge1xuICAgICAgLy8gcGFnZSBpcyB0aGUgZmlyc3QgcGFnZS4gbm8gcHJldmlvdXMgcGFnZS5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91c1BhZ2UuY29tcGxldGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgd2l6YXJkIHBhZ2Ugb2JqZWN0IGFzIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBvYmplY3Qgb2ZcbiAgICogdGhlIHBhZ2UgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaW4gdGhlIHBhZ2UgY29sbGVjdGlvbi4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzXG4gICAqIG5vIHBhZ2UgYWZ0ZXIgdGhlIHBhZ2UgaXQgaXMgcGFzc2VkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0TmV4dFBhZ2UocGFnZTogQ2xyV2l6YXJkUGFnZSkge1xuICAgIGNvbnN0IG15UGFnZUluZGV4ID0gdGhpcy5nZXRQYWdlSW5kZXgocGFnZSk7XG4gICAgY29uc3QgbmV4dFBhZ2VJbmRleCA9IG15UGFnZUluZGV4ICsgMTtcblxuICAgIGlmIChuZXh0UGFnZUluZGV4ID49IHRoaXMucGFnZXNBc0FycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeUluZGV4KG5leHRQYWdlSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgd2l6YXJkIHBhZ2Ugb2JqZWN0IGFzIGEgcGFyYW1ldGVyIGFuZCBnZW5lcmF0ZXMgYSBzdGVwIGl0ZW0gaWQgZnJvbSB0aGVcbiAgICogcGFnZSBJRC4gUmV0dXJucyB0aGUgZ2VuZXJhdGVkIHN0ZXAgaXRlbSBJRCBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldFN0ZXBJdGVtSWRGb3JQYWdlKHBhZ2U6IENscldpemFyZFBhZ2UpIHtcbiAgICBjb25zdCBwYWdlSWQgPSBwYWdlLmlkO1xuICAgIGNvbnN0IHBhZ2VJZFBhcnRzID0gcGFnZUlkLnNwbGl0KCctJykucmV2ZXJzZSgpO1xuXG4gICAgcGFnZUlkUGFydHNbMV0gPSAnc3RlcCc7XG4gICAgcmV0dXJuIHBhZ2VJZFBhcnRzLnJldmVyc2UoKS5qb2luKCctJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbGx5IG9ubHkgdXNlZCBpbnRlcm5hbGx5IHRvIG1hcmsgdGhhdCBhIHNwZWNpZmljIHBhZ2UgaGFzIGJlZW4gXCJjb21taXR0ZWRcIi5cbiAgICogVGhpcyBpbnZvbHZlcyBtYXJraW5nIHRoZSBwYWdlIGNvbXBsZXRlIGFuZCBmaXJpbmcgdGhlIENscldpemFyZFBhZ2Uub25Db21taXRcbiAgICogKGNscldpemFyZFBhZ2VPbkNvbW1pdCkgb3V0cHV0LiBUYWtlcyB0aGUgd2l6YXJkIHBhZ2Ugb2JqZWN0IHRoYXQgeW91IGludGVuZCB0b1xuICAgKiBtYXJrIGNvbXBsZXRlZCBhcyBhIHBhcmFtZXRlci5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGNvbW1pdFBhZ2UocGFnZTogQ2xyV2l6YXJkUGFnZSkge1xuICAgIGNvbnN0IHBhZ2VIYXNPdmVycmlkZXMgPSBwYWdlLnN0b3BOZXh0IHx8IHBhZ2UucHJldmVudERlZmF1bHQ7XG4gICAgcGFnZS5jb21wbGV0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKCFwYWdlSGFzT3ZlcnJpZGVzKSB7XG4gICAgICAvLyBwcmV2ZW50IGxvb3Agb2YgZXZlbnQgZW1pc3Npb247IGFsdGVybmF0ZSBmbG93cyB3b3JrIG9mZlxuICAgICAgLy8gb2YgZXZlbnQgZW1pdHRlcnMgdGhpcyBpcyBob3cgdGhleSBicmVhayB0aGF0IGN5Y2xlLlxuICAgICAgcGFnZS5vbkNvbW1pdC5lbWl0KHBhZ2UuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVzZWQgYnkgdGhlIG5hdlNlcnZpY2UgdG8gbmF2aWdhdGUgYmFjayB0byBmaXJzdCBwb3NzaWJsZSBzdGVwIGFmdGVyXG4gIC8vIHBhZ2VzIGFyZSByZXNldFxuXG4gIC8qKlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIF9wYWdlc1Jlc2V0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQW4gb2JzZXJ2YWJsZSB0aGF0IHRoZSBuYXZpZ2F0aW9uIHNlcnZpY2UgbGlzdGVucyB0byBpbiBvcmRlciB0byBrbm93IHdoZW5cbiAgICogdGhlIHBhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZWQgc3RhdGVzIGhhdmUgYmVlbiByZXNldCB0byBmYWxzZSBzbyB0aGF0IHdheSBpdFxuICAgKiBjYW4gYWxzbyByZXNldCB0aGUgbmF2aWdhdGlvbiB0byBtYWtlIHRoZSBmaXJzdCBwYWdlIGluIHRoZSBwYWdlIGNvbGxlY3Rpb25cbiAgICogY3VycmVudC9hY3RpdmUuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQYWdlQ29sbGVjdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZXNSZXNldCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZXNSZXNldC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFsbCBjb21wbGV0ZWQgc3RhdGVzIG9mIHRoZSBwYWdlcyBpbiB0aGUgcGFnZSBjb2xsZWN0aW9uIHRvIGZhbHNlIGFuZFxuICAgKiBub3RpZmllcyB0aGUgbmF2aWdhdGlvbiBzZXJ2aWNlIHRvIGxpa2V3aXNlIHJlc2V0IHRoZSBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5wYWdlc0FzQXJyYXkuZm9yRWFjaCgocGFnZTogQ2xyV2l6YXJkUGFnZSkgPT4ge1xuICAgICAgcGFnZS5jb21wbGV0ZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICB0aGlzLl9wYWdlc1Jlc2V0Lm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgdGhyb3VnaCBhbGwgdGhlIHBhZ2VzIGluIHRoZSBwYWdlIGNvbGxlY3Rpb24gdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBub1xuICAgKiBpbmNvbXBsZXRlIHBhZ2VzIHNhbmR3aWNoZWQgYmV0d2VlbiBjb21wbGV0ZWQgcGFnZXMgaW4gdGhlIHdvcmtmbG93LiBJZGVudGlmaWVzXG4gICAqIHRoZSBmaXJzdCBpbmNvbXBsZXRlIHBhZ2UgaW5kZXggYW5kIHNldHMgYWxsIHBhZ2VzIGJlaGluZCBpdCB0byBhIGNvbXBsZXRlZFxuICAgKiBzdGF0ZSBvZiBmYWxzZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFBhZ2VDb2xsZWN0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNvbXBsZXRlZFN0YXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdEluY29tcGxldGVJbmRleCA9IHRoaXMuZmluZEZpcnN0SW5jb21wbGV0ZVBhZ2VJbmRleCgpO1xuXG4gICAgaWYgKGZpcnN0SW5jb21wbGV0ZUluZGV4ID09PSB0aGlzLnBhZ2VzQXNBcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAvLyBhbGwgY29tcGxldGUgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGFnZXNBc0FycmF5LmZvckVhY2goKHBhZ2U6IENscldpemFyZFBhZ2UsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChpbmRleCA+IGZpcnN0SW5jb21wbGV0ZUluZGV4KSB7XG4gICAgICAgIHBhZ2UuY29tcGxldGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaW5jb21wbGV0ZSBwYWdlIGluIHRoZSBwYWdlIGNvbGxlY3Rpb24uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQYWdlQ29sbGVjdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBmaW5kRmlyc3RJbmNvbXBsZXRlUGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgbGV0IHJldHVybkluZGV4OiBudW1iZXIgPSBudWxsO1xuICAgIHRoaXMucGFnZXNBc0FycmF5LmZvckVhY2goKHBhZ2U6IENscldpemFyZFBhZ2UsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChudWxsID09PSByZXR1cm5JbmRleCAmJiBmYWxzZSA9PT0gcGFnZS5jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGZhbGx0aHJvdWdoLCBhbGwgY29tcGxldGVkLCByZXR1cm4gbGFzdCBwYWdlXG4gICAgaWYgKG51bGwgPT09IHJldHVybkluZGV4KSB7XG4gICAgICByZXR1cm5JbmRleCA9IHRoaXMucGFnZXNDb3VudCAtIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVybkluZGV4O1xuICB9XG5cbiAgcHVibGljIGZpbmRGaXJzdEluY29tcGxldGVQYWdlKCk6IENscldpemFyZFBhZ2Uge1xuICAgIGNvbnN0IG15SW5jb21wbGV0ZUluZGV4ID0gdGhpcy5maW5kRmlyc3RJbmNvbXBsZXRlUGFnZUluZGV4KCk7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNBc0FycmF5W215SW5jb21wbGV0ZUluZGV4XTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2xyV2l6YXJkUGFnZSB9IGZyb20gJy4uL3dpemFyZC1wYWdlJztcblxuaW1wb3J0IHsgQnV0dG9uSHViU2VydmljZSB9IGZyb20gJy4vYnV0dG9uLWh1Yi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VDb2xsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vcGFnZS1jb2xsZWN0aW9uLnNlcnZpY2UnO1xuXG4vKipcbiAqIFBlcmZvcm1zIG5hdmlnYXRpb24gZnVuY3Rpb25zIGZvciBhIHdpemFyZCBhbmQgbWFuYWdlcyB0aGUgY3VycmVudCBwYWdlLiBQcmVzZW50ZWQgYXMgYVxuICogc2VwYXJhdGUgc2VydmljZSB0byBlbmNhcHN1bGF0ZSB0aGUgYmVoYXZpb3Igb2YgbmF2aWdhdGluZyBhbmQgY29tcGxldGluZyB0aGUgd2l6YXJkIHNvXG4gKiB0aGF0IGl0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHRoZSB3aXphcmQgYW5kIGl0cyBzdWItY29tcG9uZW50cy5cbiAqXG4gKiBUaGUgZWFzaWVzdCB3YXkgdG8gYWNjZXNzIHRoZSBuYXZpZ2F0aW9uIHNlcnZpY2UgaXMgdGhlcmUgYSByZWZlcmVuY2Ugb24geW91ciB3aXphcmQuIFRoZVxuICogRm9sbG93aW5nIGV4YW1wbGUgd291bGQgYWxsb3cgeW91IHRvIGFjY2VzcyB5b3VyIGluc3RhbmNlIG9mIHRoZSB3aXphcmQgZnJvbSB5b3VyIGhvc3RcbiAqIGNvbXBvbmVudCBhbmQgdGhlcmVieSBhY2Nlc3MgdGhlIG5hdmlnYXRpb24gc2VydmljZSB2aWEgWW91ckhvc3RDb21wb25lbnQud2l6YXJkLm5hdlNlcnZpY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxjbHItd2l6YXJkICN3aXphcmQgLi4uPlxuICpcbiAqIEBleGFtcGxlXG4gKiBleHBvcnQgY2xhc3MgWW91ckhvc3RDb21wb25lbnQge1xuICogICBAVmlld0NoaWxkKFwid2l6YXJkXCIpIHdpemFyZDogV2l6YXJkO1xuICogICAuLi5cbiAqIH1cbiAqXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXaXphcmROYXZpZ2F0aW9uU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBJcyBub3RpZmllZCB3aGVuIGEgcHJldmlvdXMgYnV0dG9uIGlzIGNsaWNrZWQgaW4gdGhlIHdpemFyZC4gUGVyZm9ybXMgY2hlY2tzXG4gICAqIGJlZm9yZSBhbGVydGluZyB0aGUgY3VycmVudCBwYWdlIG9mIHRoZSBidXR0b24gY2xpY2suIEVuYWN0cyBuYXZpZ2F0aW9uIHRvXG4gICAqIHRoZSBwcmV2aW91cyBwYWdlIGlmIG5vdCBvdmVycmlkZGVuIGF0IHRoZSBwYWdlIGxldmVsLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBwcmV2aW91c0J1dHRvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBJcyBub3RpZmllZCB3aGVuIGEgTmV4dCBidXR0b24gaXMgY2xpY2tlZCBpbiB0aGUgd2l6YXJkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBuZXh0QnV0dG9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIElzIG5vdGlmaWVkIHdoZW4gYSBkYW5nZXIgYnV0dG9uIGlzIGNsaWNrZWQgaW4gdGhlIHdpemFyZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZGFuZ2VyQnV0dG9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIElzIG5vdGlmaWVkIHdoZW4gYSAgZmluaXNoIGJ1dHRvbiBpcyBjbGlja2VkIGluIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGZpbmlzaEJ1dHRvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBJcyBub3RpZmllZCB3aGVuIGEgQ3VzdG9tIGJ1dHRvbiBpcyBjbGlja2VkIGluIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGN1c3RvbUJ1dHRvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBJcyBub3RpZmllZCB3aGVuIGEgQ2FuY2VsIGJ1dHRvbiBpcyBjbGlja2VkIGluIHRoZSB3aXphcmQuIE5vdGlmaWVzIHRoZSB3aXphcmQsXG4gICAqIHdoaWNoIGhhbmRsZXMgYWxsIGNhbmNlbCBmdW5jdGlvbmFsaXR5LCBpZiBjYW5jZWwgaXMgbm90IG92ZXJyaWRkZW4gYXQgdGhlIHBhZ2VcbiAgICogbGV2ZWwuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGNhbmNlbEJ1dHRvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBSZXNldHMgbmF2aWdhdGlvbiB0byBtYWtlIHRoZSBmaXJzdCBwYWdlIGN1cnJlbnQgd2hlbiB0aGUgcGFnZSBjb2xsZWN0aW9uIHNlcnZpY2VcbiAgICogZW1pdHMgYW4gZXZlbnQgbm90aWZ5aW5nIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlIHRoYXQgaXQgaGFzIHJlc2V0IGFsbCBwYWdlc1xuICAgKiB0byB0aGVpciBwcmlzdGluZSwgaW5jb21wbGV0ZSBzdGF0ZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgcGFnZXNSZXNldFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlLiBBbHNvIHNldHMgdXAgc3Vic2NyaXB0aW9uc1xuICAgKiB0aGF0IGxpc3RlbiB0byB0aGUgYnV0dG9uIHNlcnZpY2UgdG8gZGV0ZXJtaW5lIHdoZW4gYSBidXR0b24gaGFzIGJlZW4gY2xpY2tlZFxuICAgKiBpbiB0aGUgd2l6YXJkLiBJcyBhbHNvIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgYWN0aW9uIHdoZW4gdGhlIHBhZ2UgY29sbGVjdGlvblxuICAgKiByZXF1ZXN0cyB0aGF0IG5hdmlnYXRpb24gYmUgcmVzZXQgdG8gaXRzIHByaXN0aW5lIHN0YXRlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYWdlQ29sbGVjdGlvbjogUGFnZUNvbGxlY3Rpb25TZXJ2aWNlLCBwdWJsaWMgYnV0dG9uU2VydmljZTogQnV0dG9uSHViU2VydmljZSkge1xuICAgIHRoaXMucHJldmlvdXNCdXR0b25TdWJzY3JpcHRpb24gPSB0aGlzLmJ1dHRvblNlcnZpY2UucHJldmlvdXNCdG5DbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZUlzRmlyc3QgfHwgY3VycmVudFBhZ2UucHJldmlvdXNTdGVwRGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhZ2UucHJldmlvdXNCdXR0b25DbGlja2VkLmVtaXQoY3VycmVudFBhZ2UpO1xuICAgICAgaWYgKCFjdXJyZW50UGFnZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICB0aGlzLnByZXZpb3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm5leHRCdXR0b25TdWJzY3JpcHRpb24gPSB0aGlzLmJ1dHRvblNlcnZpY2UubmV4dEJ0bkNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tBbmRDb21taXRDdXJyZW50UGFnZSgnbmV4dCcpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kYW5nZXJCdXR0b25TdWJzY3JpcHRpb24gPSB0aGlzLmJ1dHRvblNlcnZpY2UuZGFuZ2VyQnRuQ2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jaGVja0FuZENvbW1pdEN1cnJlbnRQYWdlKCdkYW5nZXInKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmluaXNoQnV0dG9uU3Vic2NyaXB0aW9uID0gdGhpcy5idXR0b25TZXJ2aWNlLmZpbmlzaEJ0bkNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tBbmRDb21taXRDdXJyZW50UGFnZSgnZmluaXNoJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmN1c3RvbUJ1dHRvblN1YnNjcmlwdGlvbiA9IHRoaXMuYnV0dG9uU2VydmljZS5jdXN0b21CdG5DbGlja2VkLnN1YnNjcmliZSgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXRoaXMud2l6YXJkU3RvcE5hdmlnYXRpb24pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZS5jdXN0b21CdXR0b25DbGlja2VkLmVtaXQodHlwZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmNhbmNlbEJ1dHRvblN1YnNjcmlwdGlvbiA9IHRoaXMuYnV0dG9uU2VydmljZS5jYW5jZWxCdG5DbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy53aXphcmRTdG9wTmF2aWdhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UucGFnZU9uQ2FuY2VsLmVtaXQodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWdlc1Jlc2V0U3Vic2NyaXB0aW9uID0gdGhpcy5wYWdlQ29sbGVjdGlvbi5wYWdlc1Jlc2V0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldEZpcnN0UGFnZUN1cnJlbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucHJldmlvdXNCdXR0b25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm5leHRCdXR0b25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRhbmdlckJ1dHRvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZmluaXNoQnV0dG9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jdXN0b21CdXR0b25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNhbmNlbEJ1dHRvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGFnZXNSZXNldFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBfY3VycmVudENoYW5nZWQgPSBuZXcgU3ViamVjdDxDbHJXaXphcmRQYWdlPigpO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNlcnZhYmxlIHRoYXQgaXMgcHJlZG9taW5hbnRseSB1c2VkIGFtb25nc3QgdGhlIHN1YmNvbXBvbmVudHMgYW5kIHNlcnZpY2VzXG4gICAqIG9mIHRoZSB3aXphcmQuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdXNlcnMgbGlzdGVuIHRvIHRoZSBDbHJXaXphcmRQYWdlLm9uTG9hZFxuICAgKiAoY2xyV2l6YXJkUGFnZU9uTG9hZCkgb3V0cHV0IGluc3RlYWQgb2YgdGhpcyBPYnNlcnZhYmxlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2VDaGFuZ2VkKCk6IE9ic2VydmFibGU8Q2xyV2l6YXJkUGFnZT4ge1xuICAgIC8vIFRPRE86IE1BS0UgU1VSRSBFWFRFUk5BTCBPVVRQVVRTIFNBWSAnQ0hBTkdFJyBOT1QgJ0NIQU5HRUQnXG4gICAgLy8gQSBCUkVBS0lORyBDSEFOR0UgU08gQVdBSVRJTkcgTUlOT1IgUkVMRUFTRVxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Q2hhbmdlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gZmxhZyB1c2VkIGJ5IHRoZSBDbHJXaXphcmRQYWdlIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlbiBwYWdlcyBhcmVcbiAgICogbG9hZGluZyBhbmQgdGhlcmUgaXMgbm8gY3VycmVudCBwYWdlIGRlZmluZWQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIG5hdlNlcnZpY2VMb2FkZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQSBib29sZWFuIGZsYWcgc2hhcmVkIGFjcm9zcyB0aGUgV2l6YXJkIHN1YmNvbXBvbmVudHMgdGhhdCBmb2xsb3dzIHRoZSB2YWx1ZVxuICAgKiBvZiB0aGUgV2l6YXJkLmZvcmNlRm9yd2FyZCAoY2xyV2l6YXJkRm9yY2VGb3J3YXJkTmF2aWdhdGlvbikgaW5wdXQuIFdoZW4gdHJ1ZSxcbiAgICogbmF2aWdhdGluZyBiYWNrd2FyZHMgaW4gdGhlIHN0ZXBuYXYgbWVudSB3aWxsIHJlc2V0IGFueSBza2lwcGVkIHBhZ2VzJyBjb21wbGV0ZWRcbiAgICogc3RhdGUgdG8gZmFsc2UuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSB3aXphcmQgZXhlY3V0ZXMgdmFsaWRhdGlvbiBvbiBhIHBhZ2UtYnktcGFnZSBiYXNpcyB3aGVuXG4gICAqIHRoZSBuZXh0IGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBmb3JjZUZvcndhcmROYXZpZ2F0aW9uID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UGFnZVRpdGxlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIC8vIHdoZW4gdGhlIHF1ZXJ5bGlzdCBvZiBwYWdlcyBpcyBlbXB0eS4gdGhpcyBpcyB0aGUgZmlyc3QgcGxhY2UgaXQgZmFpbHMuLi5cbiAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZS50aXRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQm9vbGVhbiB0aGF0IHRlbGxzIHlvdSB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdFxuICAgKiBwYWdlIGluIHRoZSBXaXphcmQuXG4gICAqXG4gICAqIFRoaXMgaXMgaGVscGZ1bCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHBhZ2UgaXMgbmF2aWdhYmxlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2VJc0ZpcnN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VDb2xsZWN0aW9uLmZpcnN0UGFnZSA9PT0gdGhpcy5jdXJyZW50UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQm9vbGVhbiB0aGF0IHRlbGxzIHlvdSB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwYWdlIGlzIHRoZVxuICAgKiBsYXN0IHBhZ2UgaW4gdGhlIFdpemFyZC5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBidXR0b25zIHNob3VsZCBkaXNwbGF5IGluIHRoZSB3aXphcmQgZm9vdGVyLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2VJc0xhc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUNvbGxlY3Rpb24ubGFzdFBhZ2UgPT09IHRoaXMuY3VycmVudFBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIF9jdXJyZW50UGFnZTogQ2xyV2l6YXJkUGFnZTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQ2xyV2l6YXJkUGFnZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgcGFnZSBvciBudWxsLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIGdldCBjdXJyZW50UGFnZSgpOiBDbHJXaXphcmRQYWdlIHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnRQYWdlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSBDbHJXaXphcmRQYWdlIG9iamVjdCwgc2luY2UgdGhhdCBvYmplY3QgdG8gYmUgdGhlIGN1cnJlbnQvYWN0aXZlXG4gICAqIHBhZ2UgaW4gdGhlIHdpemFyZCwgYW5kIGVtaXRzIHRoZSBDbHJXaXphcmRQYWdlLm9uTG9hZCAoY2xyV2l6YXJkUGFnZU9uTG9hZClcbiAgICogZXZlbnQgZm9yIHRoYXQgcGFnZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IGFsbCBvZiB0aGlzIHdvcmsgaXMgYnlwYXNzZWQgaWYgdGhlIENscldpemFyZFBhZ2Ugb2JqZWN0IGlzIGFscmVhZHlcbiAgICogdGhlIGN1cnJlbnQgcGFnZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBzZXQgY3VycmVudFBhZ2UocGFnZTogQ2xyV2l6YXJkUGFnZSkge1xuICAgIGlmICh0aGlzLl9jdXJyZW50UGFnZSAhPT0gcGFnZSAmJiAhdGhpcy53aXphcmRTdG9wTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgICAgcGFnZS5vbkxvYWQuZW1pdChwYWdlLmlkKTtcbiAgICAgIHRoaXMuX2N1cnJlbnRDaGFuZ2VkLm5leHQocGFnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBfbW92ZWRUb05leHRQYWdlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQW4gb2JzZXJ2YWJsZSB1c2VkIGludGVybmFsbHkgdG8gYWxlcnQgdGhlIHdpemFyZCB0aGF0IGZvcndhcmQgbmF2aWdhdGlvblxuICAgKiBoYXMgb2NjdXJyZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSB0aGUgV2l6YXJkLm9uTW92ZU5leHRcbiAgICogKGNscldpemFyZE9uTmV4dCkgb3V0cHV0IGluc3RlYWQgb2YgdGhpcyBvbmUuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBtb3ZlZFRvTmV4dFBhZ2UoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX21vdmVkVG9OZXh0UGFnZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgX3dpemFyZEZpbmlzaGVkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQW4gb2JzZXJ2YWJsZSB1c2VkIGludGVybmFsbHkgdG8gYWxlcnQgdGhlIHdpemFyZCB0aGF0IHRoZSBuYXYgc2VydmljZVxuICAgKiBoYXMgYXBwcm92ZWQgY29tcGxldGlvbiBvZiB0aGUgd2l6YXJkLlxuICAgKlxuICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgdGhlIFdpemFyZC53aXphcmRGaW5pc2hlZCAoY2xyV2l6YXJkT25GaW5pc2gpXG4gICAqIG91dHB1dCBpbnN0ZWFkIG9mIHRoaXMgb25lLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgd2l6YXJkRmluaXNoZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dpemFyZEZpbmlzaGVkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBwcm9ncmFtbWF0aWNhbGx5IGFkdmFuY2VcbiAgICogdGhlIHVzZXIgdG8gdGhlIG5leHQgcGFnZS5cbiAgICpcbiAgICogV2hlbiBpbnZva2VkLCB0aGlzIG1ldGhvZCB3aWxsIG1vdmUgdGhlIHdpemFyZCB0byB0aGUgbmV4dCBwYWdlIGFmdGVyXG4gICAqIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGdvZXMgdGhyb3VnaCBhbGwgY2hlY2tzXG4gICAqIGFuZCBldmVudCBlbWlzc2lvbnMgYXMgaWYgV2l6YXJkLm5leHQoZmFsc2UpIGhhZCBiZWVuIGNhbGxlZC5cbiAgICpcbiAgICogSW4gbW9zdCBjYXNlcywgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byB1c2UgV2l6YXJkLm5leHQoZmFsc2UpLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBuZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlSXNMYXN0KSB7XG4gICAgICB0aGlzLmNoZWNrQW5kQ29tbWl0Q3VycmVudFBhZ2UoJ2ZpbmlzaCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2hlY2tBbmRDb21taXRDdXJyZW50UGFnZSgnbmV4dCcpO1xuXG4gICAgaWYgKCF0aGlzLndpemFyZEhhc0FsdE5leHQgJiYgIXRoaXMud2l6YXJkU3RvcE5hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuX21vdmVkVG9OZXh0UGFnZS5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCeXBhc3NlcyBjaGVja3MgYW5kIG1vc3QgZXZlbnQgZW1pc3Npb25zIHRvIGZvcmNlIGEgcGFnZSB0byBuYXZpZ2F0ZSBmb3J3YXJkLlxuICAgKlxuICAgKiBDb21wYXJhYmxlIHRvIGNhbGxpbmcgV2l6YXJkLm5leHQoKSBvciBXaXphcmQuZm9yY2VOZXh0KCkuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGZvcmNlTmV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50UGFnZTogQ2xyV2l6YXJkUGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgY29uc3QgbmV4dFBhZ2U6IENscldpemFyZFBhZ2UgPSB0aGlzLnBhZ2VDb2xsZWN0aW9uLmdldE5leHRQYWdlKGN1cnJlbnRQYWdlKTtcblxuICAgIC8vIGNhdGNoIGVycmFudCBudWxsIG9yIHVuZGVmaW5lZHMgdGhhdCBjcmVlcCBpblxuICAgIGlmICghbmV4dFBhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHdpemFyZCBoYXMgbm8gbmV4dCBwYWdlIHRvIGdvIHRvLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpemFyZFN0b3BOYXZpZ2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjdXJyZW50UGFnZS5jb21wbGV0ZWQpIHtcbiAgICAgIC8vIHRoaXMgaXMgYSBzdGF0ZSB0aGF0IGFsdCBuZXh0IGZsb3dzIGNhbiBnZXQgdGhlbXNlbHZlcyBpbi4uLlxuICAgICAgdGhpcy5wYWdlQ29sbGVjdGlvbi5jb21taXRQYWdlKGN1cnJlbnRQYWdlKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IG5leHRQYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSBidXR0b24vYWN0aW9uIHR5cGUgYXMgYSBwYXJhbWV0ZXIuIEVuY2Fwc3VsYXRlcyBhbGwgbG9naWMgZm9yXG4gICAqIGV2ZW50IGVtaXNzaW9ucywgc3RhdGUgb2YgdGhlIGN1cnJlbnQgcGFnZSwgYW5kIHdpemFyZCBhbmQgcGFnZSBsZXZlbCBvdmVycmlkZXMuXG4gICAqXG4gICAqIEF2b2lkIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBjaGVja0FuZENvbW1pdEN1cnJlbnRQYWdlKGJ1dHRvblR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlOiBDbHJXaXphcmRQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBsZXQgaUFtVGhlTGFzdFBhZ2U6IGJvb2xlYW47XG5cbiAgICBsZXQgaXNOZXh0OiBib29sZWFuO1xuICAgIGxldCBpc0RhbmdlcjogYm9vbGVhbjtcbiAgICBsZXQgaXNEYW5nZXJOZXh0OiBib29sZWFuO1xuICAgIGxldCBpc0RhbmdlckZpbmlzaDogYm9vbGVhbjtcbiAgICBsZXQgaXNGaW5pc2g6IGJvb2xlYW47XG5cbiAgICBpZiAoIWN1cnJlbnRQYWdlLnJlYWR5VG9Db21wbGV0ZSB8fCB0aGlzLndpemFyZFN0b3BOYXZpZ2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaUFtVGhlTGFzdFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlSXNMYXN0O1xuXG4gICAgaXNOZXh0ID0gYnV0dG9uVHlwZSA9PT0gJ25leHQnO1xuICAgIGlzRGFuZ2VyID0gYnV0dG9uVHlwZSA9PT0gJ2Rhbmdlcic7XG4gICAgaXNEYW5nZXJOZXh0ID0gaXNEYW5nZXIgJiYgIWlBbVRoZUxhc3RQYWdlO1xuICAgIGlzRGFuZ2VyRmluaXNoID0gaXNEYW5nZXIgJiYgaUFtVGhlTGFzdFBhZ2U7XG4gICAgaXNGaW5pc2ggPSBidXR0b25UeXBlID09PSAnZmluaXNoJyB8fCBpc0RhbmdlckZpbmlzaDtcblxuICAgIGlmIChpc0ZpbmlzaCAmJiAhaUFtVGhlTGFzdFBhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50UGFnZS5wcmltYXJ5QnV0dG9uQ2xpY2tlZC5lbWl0KGJ1dHRvblR5cGUpO1xuXG4gICAgaWYgKGlzRmluaXNoKSB7XG4gICAgICBjdXJyZW50UGFnZS5maW5pc2hCdXR0b25DbGlja2VkLmVtaXQoY3VycmVudFBhZ2UpO1xuICAgIH0gZWxzZSBpZiAoaXNEYW5nZXIpIHtcbiAgICAgIGN1cnJlbnRQYWdlLmRhbmdlckJ1dHRvbkNsaWNrZWQuZW1pdCgpO1xuICAgIH0gZWxzZSBpZiAoaXNOZXh0KSB7XG4gICAgICBjdXJyZW50UGFnZS5uZXh0QnV0dG9uQ2xpY2tlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRQYWdlLnN0b3BOZXh0IHx8IGN1cnJlbnRQYWdlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICBjdXJyZW50UGFnZS5vbkNvbW1pdC5lbWl0KGN1cnJlbnRQYWdlLmlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBvcmRlciBpcyB2ZXJ5IGltcG9ydGFudCB3aXRoIHRoZXNlIGVtaXR0ZXJzIVxuICAgIGlmIChpc0ZpbmlzaCkge1xuICAgICAgLy8gbWFyayBwYWdlIGFzIGNvbXBsZXRlXG4gICAgICBpZiAoIXRoaXMud2l6YXJkSGFzQWx0TmV4dCkge1xuICAgICAgICB0aGlzLnBhZ2VDb2xsZWN0aW9uLmNvbW1pdFBhZ2UoY3VycmVudFBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5fd2l6YXJkRmluaXNoZWQubmV4dCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpemFyZEhhc0FsdE5leHQpIHtcbiAgICAgIHRoaXMucGFnZUNvbGxlY3Rpb24uY29tbWl0UGFnZShjdXJyZW50UGFnZSk7XG5cbiAgICAgIGlmIChpc05leHQgfHwgaXNEYW5nZXJOZXh0KSB7XG4gICAgICAgIHRoaXMuX21vdmVkVG9OZXh0UGFnZS5uZXh0KHRydWUpO1xuICAgICAgfVxuICAgICAgLy8ganVtcCBvdXQgaGVyZSwgbm8gbWF0dGVyIHdoYXQgdHlwZSB3ZSdyZSBsb29raW5nIGF0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTmV4dCB8fCBpc0Rhbmdlck5leHQpIHtcbiAgICAgIHRoaXMuZm9yY2VOZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBwcm9ncmFtbWF0aWNhbGx5IGNvbmNsdWRlXG4gICAqIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIFdoZW4gaW52b2tlZCwgdGhpcyBtZXRob2Qgd2lsbCAgaW5pdGlhdGUgdGhlIHdvcmsgaW52b2x2ZWQgd2l0aCBmaW5hbGl6aW5nXG4gICAqIGFuZCBmaW5pc2hpbmcgdGhlIHdpemFyZCB3b3JrZmxvdy4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGdvZXMgdGhyb3VnaCBhbGxcbiAgICogY2hlY2tzIGFuZCBldmVudCBlbWlzc2lvbnMgYXMgaWYgV2l6YXJkLmZpbmlzaChmYWxzZSkgaGFkIGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJbiBtb3N0IGNhc2VzLCBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIHVzZSBXaXphcmQuZmluaXNoKGZhbHNlKS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tBbmRDb21taXRDdXJyZW50UGFnZSgnZmluaXNoJyk7XG4gIH1cblxuICAvKipcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIF9tb3ZlZFRvUHJldmlvdXNQYWdlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIHdpemFyZCB3aGVuIGJhY2t3YXJkcyBuYXZpZ2F0aW9uIGhhcyBvY2N1cnJlZCB2aWEgdGhlXG4gICAqIHByZXZpb3VzIGJ1dHRvbi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1vdmVkVG9QcmV2aW91c1BhZ2UoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX21vdmVkVG9QcmV2aW91c1BhZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSBtb3ZlcyB0aGUgd2l6YXJkIHRvIHRoZSBwYWdlIGJlZm9yZSB0aGUgY3VycmVudCBwYWdlLlxuICAgKlxuICAgKiBJbiBtb3N0IGluc3RhbmNlcywgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBjYWxsIFdpemFyZC5wcmV2aW91cygpXG4gICAqIHdoaWNoIGRvZXMgdGhlIHNhbWUgdGhpbmcuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIHByZXZpb3VzKCk6IHZvaWQge1xuICAgIGxldCBwcmV2aW91c1BhZ2U6IENscldpemFyZFBhZ2U7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZUlzRmlyc3QgfHwgdGhpcy53aXphcmRTdG9wTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByZXZpb3VzUGFnZSA9IHRoaXMucGFnZUNvbGxlY3Rpb24uZ2V0UHJldmlvdXNQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuXG4gICAgaWYgKCFwcmV2aW91c1BhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tb3ZlZFRvUHJldmlvdXNQYWdlLm5leHQodHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5mb3JjZUZvcndhcmROYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLmNvbXBsZXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwcmV2aW91c1BhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIF9jYW5jZWxXaXphcmQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIHRoZSB3aXphcmQgdGhhdCBhIHVzZXIgaXMgdHJ5aW5nIHRvIGNhbmNlbCBpdC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vdGlmeVdpemFyZENhbmNlbCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5jZWxXaXphcmQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgaG9vayBpbnRvIHRoZSBjYW5jZWwgd29ya2Zsb3cgb2YgdGhlIHdpemFyZCBmcm9tIHRoZSBuYXYgc2VydmljZS4gTm90ZSB0aGF0XG4gICAqIHRoaXMgcm91dGUgZ29lcyB0aHJvdWdoIGFsbCBjaGVja3MgYW5kIGV2ZW50IGVtaXNzaW9ucyBhcyBpZiBhIGNhbmNlbCBidXR0b24gaGFkXG4gICAqIGJlZW4gY2xpY2tlZC5cbiAgICpcbiAgICogSW4gbW9zdCBjYXNlcywgdXNlcnMgbG9va2luZyBmb3IgYSBob29rIGludG8gdGhlIGNhbmNlbCByb3V0aW5lIGFyZSBhY3R1YWxseSBsb29raW5nXG4gICAqIGZvciBhIHdheSB0byBjbG9zZSB0aGUgd2l6YXJkIGZyb20gdGhlaXIgaG9zdCBjb21wb25lbnQgYmVjYXVzZSB0aGV5IGhhdmUgcHJldmVudGVkXG4gICAqIHRoZSBkZWZhdWx0IGNhbmNlbCBhY3Rpb24uXG4gICAqXG4gICAqIEluIHRoaXMgaW5zdGFuY2UsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSBXaXphcmQuY2xvc2UoKSB0byBhdm9pZCBhbnkgZXZlbnRcbiAgICogZW1pc3Npb24gbG9vcCByZXN1bHRpbmcgZnJvbSBhbiBldmVudCBoYW5kbGVyIGNhbGxpbmcgYmFjayBpbnRvIHJvdXRpbmUgdGhhdCB3aWxsXG4gICAqIGFnYWluIGV2b2tlIHRoZSBldmVudHMgaXQgaGFuZGxlcy5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbmNlbFdpemFyZC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogQSBib29sZWFuIGZsYWcgc2hhcmVkIGFjcm9zcyB0aGUgV2l6YXJkIHN1YmNvbXBvbmVudHMgdGhhdCBmb2xsb3dzIHRoZSB2YWx1ZVxuICAgKiBvZiB0aGUgV2l6YXJkLnN0b3BDYW5jZWwgKGNscldpemFyZFByZXZlbnREZWZhdWx0Q2FuY2VsKSBpbnB1dC4gV2hlbiB0cnVlLCB0aGUgY2FuY2VsXG4gICAqIHJvdXRpbmUgaXMgc3VidmVydGVkIGFuZCBtdXN0IGJlIHJlaW5zdGF0ZWQgaW4gdGhlIGhvc3QgY29tcG9uZW50IGNhbGxpbmcgV2l6YXJkLmNsb3NlKClcbiAgICogYXQgc29tZSBwb2ludC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgd2l6YXJkSGFzQWx0Q2FuY2VsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBmbGFnIHNoYXJlZCBhY3Jvc3MgdGhlIFdpemFyZCBzdWJjb21wb25lbnRzIHRoYXQgZm9sbG93cyB0aGUgdmFsdWVcbiAgICogb2YgdGhlIFdpemFyZC5zdG9wTmV4dCAoY2xyV2l6YXJkUHJldmVudERlZmF1bHROZXh0KSBpbnB1dC4gV2hlbiB0cnVlLCB0aGUgbmV4dCBhbmQgZmluaXNoXG4gICAqIHJvdXRpbmVzIGFyZSBzdWJ2ZXJ0ZWQgYW5kIG11c3QgYmUgcmVpbnN0YXRlZCBpbiB0aGUgaG9zdCBjb21wb25lbnQgY2FsbGluZyBXaXphcmQubmV4dCgpLFxuICAgKiBXaXphcmQuZm9yY2VOZXh0KCksIFdpemFyZC5maW5pc2goKSwgb3IgV2l6YXJkLmZvcmNlRmluaXNoKCkuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIHdpemFyZEhhc0FsdE5leHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQSBib29sZWFuIGZsYWcgc2hhcmVkIGFjcm9zcyB0aGUgV2l6YXJkIHN1YmNvbXBvbmVudHMgdGhhdCBmb2xsb3dzIHRoZSB2YWx1ZVxuICAgKiBvZiB0aGUgV2l6YXJkLnN0b3BOYXZpZ2F0aW9uIChjbHJXaXphcmRQcmV2ZW50TmF2aWdhdGlvbikgaW5wdXQuIFdoZW4gdHJ1ZSwgYWxsXG4gICAqIG5hdmlnYXRpb25hbCBlbGVtZW50cyBpbiB0aGUgd2l6YXJkIGFyZSBkaXNhYmxlZC5cbiAgICpcbiAgICogVGhpcyBpcyBpbnRlbmRlZCB0byBmcmVlemUgdGhlIHdpemFyZCBpbiBwbGFjZS4gRXZlbnRzIGFyZSBub3QgZmlyZWQgc28gdGhpcyBpc1xuICAgKiBub3QgYSB3YXkgdG8gaW1wbGVtZW50IGFsdGVybmF0ZSBmdW5jdGlvbmFsaXR5IGZvciBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyB3aXphcmRTdG9wTmF2aWdhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZmxhZyBzaGFyZWQgd2l0aCB0aGUgc3RlcG5hdiBpdGVtcyB0aGF0IHByZXZlbnRzIHVzZXIgY2xpY2tzIG9uXG4gICAqIHN0ZXBuYXYgaXRlbXMgZnJvbSBuYXZpZ2F0aW5nIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIHdpemFyZERpc2FibGVTdGVwbmF2OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFsbCByZXF1aXJlZCBjaGVja3MgdG8gZGV0ZXJtaW5lIGlmIGEgdXNlciBjYW4gbmF2aWdhdGUgdG8gYSBwYWdlLiBDaGVja2luZyBhdCBlYWNoXG4gICAqIHBvaW50IGlmIGEgcGFnZSBpcyBuYXZpZ2FibGUgLS0gY29tcGxldGVkIHdoZXJlIHRoZSBwYWdlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlZFxuICAgKiBwYWdlLlxuICAgKlxuICAgKiBUYWtlcyB0d28gcGFyYW1ldGVycy4gVGhlIGZpcnN0IG9uZSBtdXN0IGJlIGVpdGhlciB0aGUgQ2xyV2l6YXJkUGFnZSBvYmplY3Qgb3IgdGhlIElEIG9mIHRoZVxuICAgKiBDbHJXaXphcmRQYWdlIG9iamVjdCB0aGF0IHlvdSB3YW50IHRvIG1ha2UgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICpcbiAgICogVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgYW5kIGlzIGEgQm9vbGVhbiBmbGFnIGZvciBcImxhenkgY29tcGxldGlvblwiLiBXaGF0IHRoaXMgbWVhbnNcbiAgICogaXMgdGhlIFdpemFyZCB3aWxsIG1hcmsgYWxsIHBhZ2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgcGFnZSBhbmQgdGhlIHBhZ2UgeW91IHdhbnQgdG8gbmF2aWdhdGVcbiAgICogdG8gYXMgY29tcGxldGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5mb3JtYXRpb25hbCB3aXphcmRzIHRoYXQgZG8gbm90IHJlcXVpcmUgdXNlciBhY3Rpb24sXG4gICAqIGFsbG93aW5nIGFuIGVhc3kgbWVhbnMgZm9yIHVzZXJzIHRvIGp1bXAgYWhlYWQuXG4gICAqXG4gICAqIFRvIGF2b2lkIGNoZWNrcyBvbiBuYXZpZ2F0aW9uLCB1c2UgQ2xyV2l6YXJkUGFnZS5tYWtlQ3VycmVudCgpIGluc3RlYWQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdvVG8ocGFnZVRvR29Ub09ySWQ6IGFueSwgbGF6eUNvbXBsZXRlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBsZXQgcGFnZVRvR29UbzogQ2xyV2l6YXJkUGFnZTtcbiAgICBsZXQgY3VycmVudFBhZ2U6IENscldpemFyZFBhZ2U7XG4gICAgbGV0IG15UGFnZXM6IFBhZ2VDb2xsZWN0aW9uU2VydmljZTtcbiAgICBsZXQgcGFnZXNUb0NoZWNrOiBDbHJXaXphcmRQYWdlW107XG4gICAgbGV0IG9rYXlUb01vdmU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGxldCBnb2luZ0ZvcndhcmQ6IGJvb2xlYW47XG4gICAgbGV0IGN1cnJlbnRQYWdlSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgZ29Ub1BhZ2VJbmRleDogbnVtYmVyO1xuXG4gICAgbXlQYWdlcyA9IHRoaXMucGFnZUNvbGxlY3Rpb247XG4gICAgcGFnZVRvR29UbyA9IHR5cGVvZiBwYWdlVG9Hb1RvT3JJZCA9PT0gJ3N0cmluZycgPyBteVBhZ2VzLmdldFBhZ2VCeUlkKHBhZ2VUb0dvVG9PcklkKSA6IHBhZ2VUb0dvVG9PcklkO1xuICAgIGN1cnJlbnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcblxuICAgIC8vIG5vIHBvaW50IGluIGdvaW5nIHRvIHRoZSBjdXJyZW50IHBhZ2UuIHlvdSdyZSB0aGVyZSBhbHJlYWR5IVxuICAgIC8vIGFsc28gaGFyZCBibG9jayBvbiBhbnkgbmF2aWdhdGlvbiB3aGVuIHN0b3BOYXZpZ2F0aW9uIGlzIHRydWVcbiAgICBpZiAocGFnZVRvR29UbyA9PT0gY3VycmVudFBhZ2UgfHwgdGhpcy53aXphcmRTdG9wTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN1cnJlbnRQYWdlSW5kZXggPSBteVBhZ2VzLmdldFBhZ2VJbmRleChjdXJyZW50UGFnZSk7XG4gICAgZ29Ub1BhZ2VJbmRleCA9IG15UGFnZXMuZ2V0UGFnZUluZGV4KHBhZ2VUb0dvVG8pO1xuICAgIGdvaW5nRm9yd2FyZCA9IGdvVG9QYWdlSW5kZXggPiBjdXJyZW50UGFnZUluZGV4O1xuICAgIHBhZ2VzVG9DaGVjayA9IG15UGFnZXMuZ2V0UGFnZVJhbmdlRnJvbVBhZ2VzKHRoaXMuY3VycmVudFBhZ2UsIHBhZ2VUb0dvVG8pO1xuXG4gICAgb2theVRvTW92ZSA9IGxhenlDb21wbGV0ZSB8fCB0aGlzLmNhbkdvVG8ocGFnZXNUb0NoZWNrKTtcblxuICAgIGlmICghb2theVRvTW92ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChnb2luZ0ZvcndhcmQgJiYgbGF6eUNvbXBsZXRlKSB7XG4gICAgICBwYWdlc1RvQ2hlY2suZm9yRWFjaCgocGFnZTogQ2xyV2l6YXJkUGFnZSkgPT4ge1xuICAgICAgICBpZiAocGFnZSAhPT0gcGFnZVRvR29Ubykge1xuICAgICAgICAgIHBhZ2UuY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghZ29pbmdGb3J3YXJkICYmIHRoaXMuZm9yY2VGb3J3YXJkTmF2aWdhdGlvbikge1xuICAgICAgcGFnZXNUb0NoZWNrLmZvckVhY2goKHBhZ2U6IENscldpemFyZFBhZ2UpID0+IHtcbiAgICAgICAgcGFnZS5jb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlVG9Hb1RvO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSByYW5nZSBvZiBDbHJXaXphcmRQYWdlIG9iamVjdHMgYXMgYSBwYXJhbWV0ZXIuIFBlcmZvcm1zIHRoZSB3b3JrIG9mIGNoZWNraW5nXG4gICAqIHRob3NlIG9iamVjdHMgdG8gZGV0ZXJtaW5lIGlmIG5hdmlnYXRpb24gY2FuIGJlIGFjY29tcGxpc2hlZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgY2FuR29UbyhwYWdlc1RvQ2hlY2s6IENscldpemFyZFBhZ2VbXSk6IGJvb2xlYW4ge1xuICAgIGxldCBva2F5VG9Nb3ZlID0gdHJ1ZTtcbiAgICBjb25zdCBteVBhZ2VzID0gdGhpcy5wYWdlQ29sbGVjdGlvbjtcblxuICAgIC8vIHByZXZpb3VzIHBhZ2UgY2FuIGJlIGltcG9ydGFudCB3aGVuIG1vdmluZyBiZWNhdXNlIGlmIGl0J3MgY29tcGxldGVkIGl0XG4gICAgLy8gYWxsb3dzIHVzIHRvIG1vdmUgdG8gdGhlIHBhZ2UgZXZlbiBpZiBpdCdzIGluY29tcGxldGUuLi5cbiAgICBsZXQgcHJldmlvdXNQYWdlUGFzc2VzOiBib29sZWFuO1xuXG4gICAgaWYgKCFwYWdlc1RvQ2hlY2sgfHwgcGFnZXNUb0NoZWNrLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwYWdlc1RvQ2hlY2suZm9yRWFjaCgocGFnZTogQ2xyV2l6YXJkUGFnZSkgPT4ge1xuICAgICAgbGV0IHByZXZpb3VzUGFnZTogQ2xyV2l6YXJkUGFnZTtcblxuICAgICAgaWYgKCFva2F5VG9Nb3ZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZ2UuY29tcGxldGVkKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgaXMgdHJ1ZS4ganVzdCBqdW1wIG91dCBpbnN0ZWFkIG9mIGNvbXBsaWNhdGluZyBpdC5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBzbyB3ZSBrbm93IG91ciBwYWdlIGlzIG5vdCBjb21wbGV0ZWQuLi5cbiAgICAgIHByZXZpb3VzUGFnZSA9IG15UGFnZXMuZ2V0UGFnZUluZGV4KHBhZ2UpID4gMCA/IG15UGFnZXMuZ2V0UHJldmlvdXNQYWdlKHBhZ2UpIDogbnVsbDtcbiAgICAgIHByZXZpb3VzUGFnZVBhc3NlcyA9IHByZXZpb3VzUGFnZSA9PT0gbnVsbCB8fCBwcmV2aW91c1BhZ2UuY29tcGxldGVkID09PSB0cnVlO1xuXG4gICAgICAvLyB3ZSBhcmUgZmFsc2UgaWYgbm90IHRoZSBjdXJyZW50IHBhZ2UgQU5EIHByZXZpb3VzIHBhZ2UgaXMgbm90IGNvbXBsZXRlZFxuICAgICAgLy8gKGJ1dCBtdXN0IGhhdmUgYSBwcmV2aW91cyBwYWdlKVxuICAgICAgaWYgKCFwYWdlLmN1cnJlbnQgJiYgIXByZXZpb3VzUGFnZVBhc3Nlcykge1xuICAgICAgICBva2F5VG9Nb3ZlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBmYWxscyB0aHJvdWdoIHRvIHRydWUgYXMgZGVmYXVsdFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9rYXlUb01vdmU7XG4gIH1cblxuICAvKipcbiAgICogTG9va3MgdGhyb3VnaCB0aGUgY29sbGVjdGlvbiBvZiBwYWdlcyB0byBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBpbmNvbXBsZXRlXG4gICAqIGFuZCBtYWtlcyB0aGF0IHBhZ2UgdGhlIGN1cnJlbnQvYWN0aXZlIHBhZ2UuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmROYXZpZ2F0aW9uU2VydmljZVxuICAgKi9cbiAgcHVibGljIHNldExhc3RFbmFibGVkUGFnZUN1cnJlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsUGFnZXM6IENscldpemFyZFBhZ2VbXSA9IHRoaXMucGFnZUNvbGxlY3Rpb24ucGFnZXNBc0FycmF5O1xuICAgIGxldCBsYXN0Q29tcGxldGVkUGFnZUluZGV4OiBudW1iZXIgPSBudWxsO1xuXG4gICAgYWxsUGFnZXMuZm9yRWFjaCgocGFnZTogQ2xyV2l6YXJkUGFnZSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHBhZ2UuY29tcGxldGVkKSB7XG4gICAgICAgIGxhc3RDb21wbGV0ZWRQYWdlSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChsYXN0Q29tcGxldGVkUGFnZUluZGV4ID09PSBudWxsKSB7XG4gICAgICAvLyBhbHdheXMgaXMgYXQgbGVhc3QgdGhlIGZpcnN0IGl0ZW0uLi5cbiAgICAgIGxhc3RDb21wbGV0ZWRQYWdlSW5kZXggPSAwO1xuICAgIH0gZWxzZSBpZiAobGFzdENvbXBsZXRlZFBhZ2VJbmRleCArIDEgPCBhbGxQYWdlcy5sZW5ndGgpIHtcbiAgICAgIGxhc3RDb21wbGV0ZWRQYWdlSW5kZXggPSBsYXN0Q29tcGxldGVkUGFnZUluZGV4ICsgMTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gYWxsUGFnZXNbbGFzdENvbXBsZXRlZFBhZ2VJbmRleF07XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGZpcnN0IHBhZ2UgaW4gdGhlIGNvbGxlY3Rpb24gb2YgcGFnZXMgYW5kIG1ha2VzIHRoYXQgcGFnZSB0aGVcbiAgICogY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgc2V0Rmlyc3RQYWdlQ3VycmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlQ29sbGVjdGlvbi5wYWdlc0FzQXJyYXlbMF07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3RlcG5hdiBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSB3aXphcmQgd2hlbiBwYWdlcyBhcmUgZHluYW1pY2FsbHlcbiAgICogYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIHBhZ2VzLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVOYXZpZ2F0aW9uKCk6IHZvaWQge1xuICAgIGxldCB0b1NldEN1cnJlbnQ6IENscldpemFyZFBhZ2U7XG4gICAgbGV0IGN1cnJlbnRQYWdlUmVtb3ZlZDogYm9vbGVhbjtcblxuICAgIHRoaXMucGFnZUNvbGxlY3Rpb24udXBkYXRlQ29tcGxldGVkU3RhdGVzKCk7XG5cbiAgICBjdXJyZW50UGFnZVJlbW92ZWQgPSB0aGlzLnBhZ2VDb2xsZWN0aW9uLnBhZ2VzQXNBcnJheS5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpIDwgMDtcbiAgICBpZiAoY3VycmVudFBhZ2VSZW1vdmVkKSB7XG4gICAgICB0b1NldEN1cnJlbnQgPSB0aGlzLnBhZ2VDb2xsZWN0aW9uLmZpbmRGaXJzdEluY29tcGxldGVQYWdlKCk7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdG9TZXRDdXJyZW50O1xuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENscldpemFyZEhlYWRlckFjdGlvbiB9IGZyb20gJy4uL3dpemFyZC1oZWFkZXItYWN0aW9uJztcbmltcG9ydCB7IFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi93aXphcmQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEhlYWRlckFjdGlvblNlcnZpY2Uge1xuICAvLyB0aGlzIHNlcnZpY2UgY29tbXVuaWNhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmVzZW5jZS9kaXNwbGF5IG9mIGhlYWRlciBhY3Rpb25zXG4gIC8vIGFjcm9zcyB0aGUgd2l6YXJkXG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hdlNlcnZpY2U6IFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlKSB7fVxuXG4gIHB1YmxpYyB3aXphcmRIZWFkZXJBY3Rpb25zOiBRdWVyeUxpc3Q8Q2xyV2l6YXJkSGVhZGVyQWN0aW9uPjtcblxuICBwdWJsaWMgZ2V0IHdpemFyZEhhc0hlYWRlckFjdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgd2l6YXJkSGRyQWN0aW9ucyA9IHRoaXMud2l6YXJkSGVhZGVyQWN0aW9ucztcbiAgICBpZiAoIXdpemFyZEhkckFjdGlvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHdpemFyZEhkckFjdGlvbnMudG9BcnJheSgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYWdlSGFzSGVhZGVyQWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYXZTZXJ2aWNlLmN1cnJlbnRQYWdlID8gdGhpcy5uYXZTZXJ2aWNlLmN1cnJlbnRQYWdlLmhhc0hlYWRlckFjdGlvbnMgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd1dpemFyZEhlYWRlckFjdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmN1cnJlbnRQYWdlSGFzSGVhZGVyQWN0aW9ucyAmJiB0aGlzLndpemFyZEhhc0hlYWRlckFjdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc3BsYXlIZWFkZXJBY3Rpb25zV3JhcHBlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZUhhc0hlYWRlckFjdGlvbnMgfHwgdGhpcy53aXphcmRIYXNIZWFkZXJBY3Rpb25zO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmxldCB3aXphcmRIZWFkZXJBY3Rpb25JbmRleCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci13aXphcmQtaGVhZGVyLWFjdGlvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGNsci13aXphcmQtaGVhZGVyLWFjdGlvbiBidG4tbGlua1wiXG4gICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGljaygpXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJ0aXRsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2J1dHRvbj5cbiAgICBgLFxuICBob3N0OiB7IGNsYXNzOiAnY2xyLXdpemFyZC1oZWFkZXItYWN0aW9uLXdyYXBwZXInIH0sXG59KVxuZXhwb3J0IGNsYXNzIENscldpemFyZEhlYWRlckFjdGlvbiB7XG4gIC8vIHRpdGxlIGlzIGV4cGxhbmF0b3J5IHRleHQgYWRkZWQgdG8gdGhlIGhlYWRlciBhY3Rpb25cbiAgQElucHV0KCd0aXRsZScpIHRpdGxlOiBzdHJpbmcgPSAnJztcblxuICAvLyBJZiBvdXIgaG9zdCBoYXMgYW4gSUQgYXR0cmlidXRlLCB3ZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIG91ciBpbmRleC5cbiAgQElucHV0KCdpZCcpIF9pZDogc3RyaW5nID0gKHdpemFyZEhlYWRlckFjdGlvbkluZGV4KyspLnRvU3RyaW5nKCk7XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgY2xyLXdpemFyZC1oZWFkZXItYWN0aW9uLSR7dGhpcy5faWR9YDtcbiAgfVxuXG4gIEBJbnB1dCgnY2xyV2l6YXJkSGVhZGVyQWN0aW9uRGlzYWJsZWQnKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCdhY3Rpb25DbGlja2VkJykgaGVhZGVyQWN0aW9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcblxuICBjbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHBhc3NpbmcgdGhlIGhlYWRlciBhY3Rpb24gaWQgYWxsb3dzIHVzZXJzIHRvIGhhdmUgb25lIG1ldGhvZCB0aGF0XG4gICAgLy8gcm91dGVzIHRvIG1hbnkgZGlmZmVyZW50IGFjdGlvbnMgYmFzZWQgb24gdGhlIHR5cGUgb2YgaGVhZGVyIGFjdGlvblxuICAgIC8vIGNsaWNrZWQuIHRoaXMgaXMgZnVydGhlciBhaWRlZCBieSB1c2VycyBiZWluZyBhYmxlIHRvIHNwZWNpZnkgaWRzXG4gICAgLy8gZm9yIHRoZWlyIGhlYWRlciBhY3Rpb25zLlxuICAgIHRoaXMuaGVhZGVyQWN0aW9uQ2xpY2tlZC5lbWl0KHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJQYWdlQnV0dG9uc10nIH0pXG5leHBvcnQgY2xhc3MgQ2xyV2l6YXJkUGFnZUJ1dHRvbnMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFnZUJ1dHRvbnNUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge31cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbY2xyUGFnZUhlYWRlckFjdGlvbnNdJyB9KVxuZXhwb3J0IGNsYXNzIENscldpemFyZFBhZ2VIZWFkZXJBY3Rpb25zIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhZ2VIZWFkZXJBY3Rpb25zVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2NsclBhZ2VOYXZUaXRsZV0nIH0pXG5leHBvcnQgY2xhc3MgQ2xyV2l6YXJkUGFnZU5hdlRpdGxlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhZ2VOYXZUaXRsZVRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjbHJQYWdlVGl0bGVdJyB9KVxuZXhwb3J0IGNsYXNzIENscldpemFyZFBhZ2VUaXRsZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYWdlVGl0bGVUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge31cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCdXR0b25IdWJTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvYnV0dG9uLWh1Yi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VDb2xsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL3BhZ2UtY29sbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvd2l6YXJkLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDbHJXaXphcmRQYWdlQnV0dG9ucyB9IGZyb20gJy4vd2l6YXJkLXBhZ2UtYnV0dG9ucyc7XG5pbXBvcnQgeyBDbHJXaXphcmRQYWdlSGVhZGVyQWN0aW9ucyB9IGZyb20gJy4vd2l6YXJkLXBhZ2UtaGVhZGVyLWFjdGlvbnMnO1xuaW1wb3J0IHsgQ2xyV2l6YXJkUGFnZU5hdlRpdGxlIH0gZnJvbSAnLi93aXphcmQtcGFnZS1uYXZ0aXRsZSc7XG5pbXBvcnQgeyBDbHJXaXphcmRQYWdlVGl0bGUgfSBmcm9tICcuL3dpemFyZC1wYWdlLXRpdGxlJztcblxubGV0IHdpemFyZFBhZ2VJbmRleCA9IDA7XG5cbi8qKlxuICogVGhlIENscldpemFyZFBhZ2UgY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwbGF5aW5nIHRoZSBjb250ZW50IG9mIGVhY2ggc3RlcFxuICogaW4gdGhlIHdpemFyZCB3b3JrZmxvdy5cbiAqXG4gKiBDbHJXaXphcmRQYWdlIGNvbXBvbmVudCBoYXMgaG9va3MgaW50byB0aGUgbmF2aWdhdGlvbiBzZXJ2aWNlIChDbHJXaXphcmRQYWdlLm5hdlNlcnZpY2UpLFxuICogcGFnZSBjb2xsZWN0aW9uIChDbHJXaXphcmRQYWdlLnBhZ2VDb2xsZWN0aW9uKSwgYW5kIGJ1dHRvbiBzZXJ2aWNlXG4gKiAoQ2xyV2l6YXJkUGFnZS5idXR0b25TZXJ2aWNlKS4gVGhlc2UgdGhyZWUgcHJvdmlkZXJzIGFyZSBzaGFyZWQgYWNyb3NzIHRoZSBjb21wb25lbnRzXG4gKiB3aXRoaW4gZWFjaCBpbnN0YW5jZSBvZiBhIFdpemFyZC5cbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci13aXphcmQtcGFnZScsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG4gIGhvc3Q6IHtcbiAgICAnW2lkXSc6ICdpZCcsXG4gICAgcm9sZTogJ3RhYnBhbmVsJyxcbiAgICAnW2F0dHIuYXJpYS1oaWRkZW5dJzogJyFjdXJyZW50JyxcbiAgICAnW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XSc6ICdzdGVwSXRlbUlkJyxcbiAgICAnW2NsYXNzLmFjdGl2ZV0nOiAnY3VycmVudCcsXG4gICAgJ1tjbGFzcy5jbHItd2l6YXJkLXBhZ2VdJzogJ3RydWUnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJXaXphcmRQYWdlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ2xyV2l6YXJkUGFnZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmF2U2VydmljZTogV2l6YXJkTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgcHVibGljIHBhZ2VDb2xsZWN0aW9uOiBQYWdlQ29sbGVjdGlvblNlcnZpY2UsXG4gICAgcHVibGljIGJ1dHRvblNlcnZpY2U6IEJ1dHRvbkh1YlNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgcGFnZSB0aXRsZSB3aGljaCBpcyB1c2VkIGZvciBhIG51bWJlclxuICAgKiBvZiBkaWZmZXJlbnQgdGFza3MgZm9yIGRpc3BsYXkgaW4gdGhlIHdpemFyZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBDb250ZW50Q2hpbGQoQ2xyV2l6YXJkUGFnZVRpdGxlKSBwdWJsaWMgcGFnZVRpdGxlOiBDbHJXaXphcmRQYWdlVGl0bGU7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBkZXNpcmVkIHRpdGxlIGZvciB0aGUgcGFnZSdzIHN0ZXAgaW4gdGhlXG4gICAqIG5hdmlnYXRpb24gb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgd2l6YXJkLiBDYW4gYmUgcHJvamVjdGVkIHRvIGNoYW5nZSB0aGVcbiAgICogbmF2aWdhdGlvbiBsaW5rJ3MgdGV4dC5cbiAgICpcbiAgICogSWYgbm90IGRlZmluZWQsIHRoZW4gQ2xyV2l6YXJkUGFnZS5wYWdlVGl0bGUgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHN0ZXBuYXYuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBAQ29udGVudENoaWxkKENscldpemFyZFBhZ2VOYXZUaXRsZSkgcHVibGljIHBhZ2VOYXZUaXRsZTogQ2xyV2l6YXJkUGFnZU5hdlRpdGxlO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYnV0dG9ucyBkZWZpbmVkIHdpdGhpbiB0aGUgcGFnZS4gSWYgbm90IGRlZmluZWQsXG4gICAqIHRoZSB3aXphcmQgZGVmYXVsdHMgdG8gdGhlIHNldCBvZiBidXR0b25zIGRlZmluZWQgYXMgYSBkaXJlY3QgY2hpbGQgb2YgdGhlXG4gICAqIHdpemFyZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBDb250ZW50Q2hpbGQoQ2xyV2l6YXJkUGFnZUJ1dHRvbnMpIHB1YmxpYyBfYnV0dG9uczogQ2xyV2l6YXJkUGFnZUJ1dHRvbnM7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBoZWFkZXIgYWN0aW9ucyBkZWZpbmVkIHdpdGhpbiB0aGUgcGFnZS4gSWYgbm90IGRlZmluZWQsXG4gICAqIHRoZSB3aXphcmQgZGVmYXVsdHMgdG8gdGhlIHNldCBvZiBoZWFkZXIgYWN0aW9ucyBkZWZpbmVkIGFzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZVxuICAgKiB3aXphcmQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBAQ29udGVudENoaWxkKENscldpemFyZFBhZ2VIZWFkZXJBY3Rpb25zKSBwdWJsaWMgX2hlYWRlckFjdGlvbnM6IENscldpemFyZFBhZ2VIZWFkZXJBY3Rpb25zO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBfbmV4dFN0ZXBEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBIGdldHRlciB0aGF0IHRlbGxzIHdoZXRoZXIgb3Igbm90IHRoZSB3aXphcmQgc2hvdWxkIGJlIGFsbG93ZWRcbiAgICogdG8gbW92ZSB0byB0aGUgbmV4dCBwYWdlLlxuICAgKlxuICAgKiBVc2VmdWwgZm9yIGluLXBhZ2UgdmFsaWRhdGlvbiBiZWNhdXNlIGl0IHByZXZlbnRzIGZvcndhcmQgbmF2aWdhdGlvblxuICAgKiBhbmQgdmlzaWJseSBkaXNhYmxlcyB0aGUgbmV4dCBidXR0b24uXG4gICAqXG4gICAqIERvZXMgbm90IHJlcXVpcmUgdGhhdCB5b3UgcmUtaW1wbGVtZW50IG5hdmlnYXRpb24gcm91dGluZXMgbGlrZSB5b3VcbiAgICogd291bGQgaWYgeW91IHdlcmUgdXNpbmcgQ2xyV2l6YXJkUGFnZS5wcmV2ZW50RGVmYXVsdCBvclxuICAgKiBXaXphcmQucHJldmVudERlZmF1bHQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5leHRTdGVwRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX25leHRTdGVwRGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwYWdlIHNob3VsZCBhbGxvdyBmb3J3YXJkIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ2NscldpemFyZFBhZ2VOZXh0RGlzYWJsZWQnKVxuICBwdWJsaWMgc2V0IG5leHRTdGVwRGlzYWJsZWQodmFsOiBib29sZWFuKSB7XG4gICAgY29uc3QgdmFsQm9vbCA9ICEhdmFsO1xuICAgIGlmICh2YWxCb29sICE9PSB0aGlzLl9uZXh0U3RlcERpc2FibGVkKSB7XG4gICAgICB0aGlzLl9uZXh0U3RlcERpc2FibGVkID0gdmFsQm9vbDtcbiAgICAgIHRoaXMubmV4dFN0ZXBEaXNhYmxlZENoYW5nZS5lbWl0KHZhbEJvb2wpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB2YWx1ZSBvZiBDbHJXaXphcmRQYWdlLm5leHRTdGVwRGlzYWJsZWQgY2hhbmdlcy5cbiAgICogU2hvdWxkIGVtaXQgdGhlIG5ldyB2YWx1ZSBvZiBuZXh0U3RlcERpc2FibGVkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgQE91dHB1dCgnY2xyV2l6YXJkUGFnZU5leHREaXNhYmxlZENoYW5nZScpIG5leHRTdGVwRGlzYWJsZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHByaXZhdGUgX3ByZXZpb3VzU3RlcERpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyIHRoYXQgdGVsbHMgd2hldGhlciBvciBub3QgdGhlIHdpemFyZCBzaG91bGQgYmUgYWxsb3dlZFxuICAgKiB0byBtb3ZlIHRvIHRoZSBwcmV2aW91cyBwYWdlLlxuICAgKlxuICAgKiBVc2VmdWwgZm9yIGluLXBhZ2UgdmFsaWRhdGlvbiBiZWNhdXNlIGl0IHByZXZlbnRzIGJhY2t3YXJkIG5hdmlnYXRpb25cbiAgICogYW5kIHZpc2libHkgZGlzYWJsZXMgdGhlIHByZXZpb3VzIGJ1dHRvbi5cbiAgICpcbiAgICogRG9lcyBub3QgcmVxdWlyZSB0aGF0IHlvdSByZS1pbXBsZW1lbnQgbmF2aWdhdGlvbiByb3V0aW5lcyBsaWtlIHlvdVxuICAgKiB3b3VsZCBpZiB5b3Ugd2VyZSB1c2luZyBDbHJXaXphcmRQYWdlLnByZXZlbnREZWZhdWx0IG9yXG4gICAqIFdpemFyZC5wcmV2ZW50RGVmYXVsdC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJldmlvdXNTdGVwRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzU3RlcERpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcGFnZSBzaG91bGQgYWxsb3cgYmFja3dhcmQgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBJbnB1dCgnY2xyV2l6YXJkUGFnZVByZXZpb3VzRGlzYWJsZWQnKVxuICBwdWJsaWMgc2V0IHByZXZpb3VzU3RlcERpc2FibGVkKHZhbDogYm9vbGVhbikge1xuICAgIGNvbnN0IHZhbEJvb2wgPSAhIXZhbDtcbiAgICBpZiAodmFsQm9vbCAhPT0gdGhpcy5fcHJldmlvdXNTdGVwRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3ByZXZpb3VzU3RlcERpc2FibGVkID0gdmFsQm9vbDtcbiAgICAgIHRoaXMucHJldmlvdXNTdGVwRGlzYWJsZWRDaGFuZ2UuZW1pdCh2YWxCb29sKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdmFsdWUgb2YgQ2xyV2l6YXJkUGFnZS5wcmV2aW91c1N0ZXBEaXNhYmxlZCBjaGFuZ2VzLlxuICAgKiBTaG91bGQgZW1pdCB0aGUgbmV3IHZhbHVlIG9mIHByZXZpb3VzU3RlcERpc2FibGVkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgQE91dHB1dCgnY2xyV2l6YXJkUGFnZVByZXZpb3VzRGlzYWJsZWRDaGFuZ2UnKVxuICBwdWJsaWMgcHJldmlvdXNTdGVwRGlzYWJsZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIGFsbCBhY3Rpb25zIGZyb20gdGhlIHBhZ2UgbGV2ZWwsIHNvIHlvdSBjYW4gdXNlIGFuIGFsdGVybmF0ZSBmdW5jdGlvbiBmb3JcbiAgICogdmFsaWRhdGlvbiBvciBkYXRhLW11bmdpbmcgd2l0aCBhIENscldpemFyZFBhZ2Uub25Db21taXQgKGNscldpemFyZFBhZ2VPbkNvbW1pdCBvdXRwdXQpLFxuICAgKiBDbHJXaXphcmRQYWdlLm9uQ2FuY2VsIChjbHJXaXphcmRQYWdlT25DYW5jZWwgb3V0cHV0KSwgb3Igb25lXG4gICAqIG9mIHRoZSBncmFudWxhciBwYWdlLWxldmVsIGJ1dHRvbiBjbGljayBldmVudCBlbWl0dGVycy5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBJbnB1dCgnY2xyV2l6YXJkUGFnZVByZXZlbnREZWZhdWx0JykgcHVibGljIHByZXZlbnREZWZhdWx0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwcml2YXRlIF9zdG9wQ2FuY2VsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyIHRoYXQgcmV0cmlldmVzIHdoZXRoZXIgdGhlIHBhZ2UgaXMgcHJldmVudGluZyB0aGUgY2FuY2VsIGFjdGlvbi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RvcENhbmNlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcENhbmNlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGNhbmNlbCBhY3Rpb24gZnJvbSB0aGUgcGFnZSBsZXZlbC4gQWxsb3dzIHlvdSB0byB1c2UgYW5cbiAgICogYWx0ZXJuYXRlIGZ1bmN0aW9uIGZvciB2YWxpZGF0aW9uIG9yIGRhdGEtbXVuZ2luZyBiZWZvcmUgY2FuY2VsbGluZyB0aGVcbiAgICogd2l6YXJkIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgQ2xyV2l6YXJkUGFnZS5vbkNhbmNlbFxuICAgKiAodGhlIGNscldpemFyZFBhZ2VPbkNhbmNlbCBvdXRwdXQpLlxuICAgKlxuICAgKiBSZXF1aXJlcyB0aGF0IHlvdSBtYW51YWxseSBjbG9zZSB0aGUgd2l6YXJkIGZyb20geW91ciBob3N0IGNvbXBvbmVudCxcbiAgICogdXN1YWxseSB3aXRoIGEgY2FsbCB0byBXaXphcmQuZm9yY2VOZXh0KCkgb3Igd2l6YXJkLm5leHQoKTtcbiAgICpcbiAgICogQG1lbWJlcm9mIENscldpemFyZFBhZ2VcbiAgICovXG4gIEBJbnB1dCgnY2xyV2l6YXJkUGFnZVByZXZlbnREZWZhdWx0Q2FuY2VsJylcbiAgcHVibGljIHNldCBzdG9wQ2FuY2VsKHZhbDogYm9vbGVhbikge1xuICAgIGNvbnN0IHZhbEJvb2wgPSAhIXZhbDtcbiAgICBpZiAodmFsQm9vbCAhPT0gdGhpcy5fc3RvcENhbmNlbCkge1xuICAgICAgdGhpcy5fc3RvcENhbmNlbCA9IHZhbEJvb2w7XG4gICAgICB0aGlzLnN0b3BDYW5jZWxDaGFuZ2UuZW1pdCh2YWxCb29sKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZFBhZ2VQcmV2ZW50RGVmYXVsdENhbmNlbENoYW5nZScpIHN0b3BDYW5jZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHByaXZhdGUgX3N0b3BOZXh0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgZ2V0dGVyIHRoYXQgdGVsbHMgeW91IHdoZXRoZXIgdGhlIHBhZ2UgaXMgcHJldmVudGluZyB0aGUgbmV4dCBhY3Rpb24uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3BOZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdG9wTmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgZm9yd2FyZCBuYXZpZ2F0aW9uIGZyb20gdGhlIHBhZ2UgbGV2ZWwuIEFsbG93cyB5b3UgdG8gdXNlIGFuXG4gICAqIGFsdGVybmF0ZSBmdW5jdGlvbiBmb3IgdmFsaWRhdGlvbiBvciBkYXRhLW11bmdpbmcgYmVmb3JlIG1vdmluZyB0aGVcbiAgICogd2l6YXJkIHRvIHRoZSBuZXh0IHBhZ2V3aGVuIGNvbWJpbmVkIHdpdGggdGhlIENscldpemFyZFBhZ2Uub25Db21taXRcbiAgICogKGNscldpemFyZFBhZ2VPbkNvbW1pdCkgb3IgQ2xyV2l6YXJkUGFnZS5uZXh0QnV0dG9uQ2xpY2tlZFxuICAgKiAoY2xyV2l6YXJkUGFnZU5leHQpIG91dHB1dHMuXG4gICAqXG4gICAqIFJlcXVpcmVzIHRoYXQgeW91IG1hbnVhbGx5IHRlbGwgdGhlIHdpemFyZCB0byBuYXZpZ2F0ZSBmb3J3YXJkIGZyb21cbiAgICogdGhlIGhvc3RDb21wb25lbnQsIHVzdWFsbHkgd2l0aCBhIGNhbGwgdG8gV2l6YXJkLmZvcmNlTmV4dCgpIG9yXG4gICAqIHdpemFyZC5uZXh0KCk7XG4gICAqXG4gICAqIEBtZW1iZXJvZiBDbHJXaXphcmRQYWdlXG4gICAqL1xuICBASW5wdXQoJ2NscldpemFyZFBhZ2VQcmV2ZW50RGVmYXVsdE5leHQnKVxuICBwdWJsaWMgc2V0IHN0b3BOZXh0KHZhbDogYm9vbGVhbikge1xuICAgIGNvbnN0IHZhbEJvb2wgPSAhIXZhbDtcbiAgICBpZiAodmFsQm9vbCAhPT0gdGhpcy5fc3RvcE5leHQpIHtcbiAgICAgIHRoaXMuX3N0b3BOZXh0ID0gdmFsQm9vbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQW4gZXZlbnQgZW1pdHRlciBjYXJyaWVkIG92ZXIgZnJvbSBhIGxlZ2FjeSB2ZXJzaW9uIG9mIENscldpemFyZFBhZ2UuXG4gICAqIEZpcmVzIGFuIGV2ZW50IG9uIENscldpemFyZFBhZ2Ugd2hlbmV2ZXIgdGhlIG5leHQgb3IgZmluaXNoIGJ1dHRvbnNcbiAgICogYXJlIGNsaWNrZWQgYW5kIHRoZSBwYWdlIGlzIHRoZSBjdXJyZW50IHBhZ2Ugb2YgdGhlIFdpemFyZC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXV0b21hdGljYWxseSBlbWl0IGFuIGV2ZW50IHdoZW4gYSBjdXN0b21cbiAgICogYnV0dG9uIGlzIHVzZWQgaW4gcGxhY2Ugb2YgYSBuZXh0IG9yIGZpbmlzaCBidXR0b24uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBAT3V0cHV0KCdjbHJXaXphcmRQYWdlT25Db21taXQnKSBvbkNvbW1pdDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIENscldpemFyZFBhZ2UgYmVjb21lcyB0aGUgY3VycmVudCBwYWdlIG9mIHRoZVxuICAgKiBXaXphcmQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBAT3V0cHV0KCdjbHJXaXphcmRQYWdlT25Mb2FkJykgb25Mb2FkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgQ2xyV2l6YXJkUGFnZSBpbnZva2VzIHRoZSBjYW5jZWwgcm91dGluZSBmb3IgdGhlIHdpemFyZC5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ2xyV2l6YXJkUGFnZS5zdG9wQ2FuY2VsXG4gICAqIChjbHJXaXphcmRQYWdlUHJldmVudERlZmF1bHRDYW5jZWwpIG9yIENscldpemFyZFBhZ2UucHJldmVudERlZmF1bHRcbiAgICogKGNscldpemFyZFBhZ2VQYWdlUHJldmVudERlZmF1bHQpIGlucHV0cyB0byBpbXBsZW1lbnQgY3VzdG9tIGNhbmNlbFxuICAgKiBmdW5jdGlvbmFsaXR5IGF0IHRoZSBwYWdlIGxldmVsLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSB0byBkb1xuICAgKiB2YWxpZGF0aW9uLCBzYXZlIGRhdGEsIG9yIHdhcm4gdXNlcnMgYmVmb3JlIGNhbmNlbGxpbmcgdGhlIHdpemFyZC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgeW91IHRvIGNhbGwgV2l6YXJkLmNsb3NlKCkgZnJvbSB0aGUgaG9zdCBjb21wb25lbnQuXG4gICAqIFRoaXMgY29uc3RpdHVlcyBhIGZ1bGwgcmVwbGFjZW1lbnQgb2YgdGhlIGNhbmNlbCBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgQE91dHB1dCgnY2xyV2l6YXJkUGFnZU9uQ2FuY2VsJykgcGFnZU9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8Q2xyV2l6YXJkUGFnZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGZpbmlzaCBidXR0b24gaXMgY2xpY2tlZCBhbmQgdGhlIENscldpemFyZFBhZ2UgaXNcbiAgICogdGhlIHdpemFyZCdzIGN1cnJlbnQgcGFnZS5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ2xyV2l6YXJkUGFnZS5wcmV2ZW50RGVmYXVsdFxuICAgKiAoY2xyV2l6YXJkUGFnZVBhZ2VQcmV2ZW50RGVmYXVsdCkgaW5wdXQgdG8gaW1wbGVtZW50IGN1c3RvbSBmaW5pc2hcbiAgICogZnVuY3Rpb25hbGl0eSBhdCB0aGUgcGFnZSBsZXZlbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdvdWxkIGxpa2UgdG8gZG9cbiAgICogdmFsaWRhdGlvbiwgc2F2ZSBkYXRhLCBvciB3YXJuIHVzZXJzIGJlZm9yZSBhbGxvd2luZyB0aGVtIHRvIGNvbXBsZXRlXG4gICAqIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHlvdSB0byBjYWxsIFdpemFyZC5maW5pc2goKSBvciBXaXphcmQuZm9yY2VGaW5pc2goKVxuICAgKiBmcm9tIHRoZSBob3N0IGNvbXBvbmVudC4gVGhpcyBjb21iaW5hdGlvbiBjcmVhdGVzIGEgZnVsbCByZXBsYWNlbWVudCBvZlxuICAgKiB0aGUgZmluaXNoIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBAT3V0cHV0KCdjbHJXaXphcmRQYWdlRmluaXNoJykgZmluaXNoQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPENscldpemFyZFBhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBwcmV2aW91cyBidXR0b24gaXMgY2xpY2tlZCBhbmQgdGhlIENscldpemFyZFBhZ2UgaXNcbiAgICogdGhlIHdpemFyZCdzIGN1cnJlbnQgcGFnZS5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ2xyV2l6YXJkUGFnZS5wcmV2ZW50RGVmYXVsdFxuICAgKiAoY2xyV2l6YXJkUGFnZVBhZ2VQcmV2ZW50RGVmYXVsdCkgaW5wdXQgdG8gaW1wbGVtZW50IGN1c3RvbSBiYWNrd2FyZHNcbiAgICogbmF2aWdhdGlvbiBhdCB0aGUgcGFnZSBsZXZlbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdvdWxkIGxpa2UgdG8gZG9cbiAgICogdmFsaWRhdGlvbiwgc2F2ZSBkYXRhLCBvciB3YXJuIHVzZXJzIGJlZm9yZSBhbGxvd2luZyB0aGVtIHRvIGdvXG4gICAqIGJhY2t3YXJkcyBpbiB0aGUgd2l6YXJkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB5b3UgdG8gY2FsbCBXaXphcmQucHJldmlvdXMoKVxuICAgKiBmcm9tIHRoZSBob3N0IGNvbXBvbmVudC4gVGhpcyBjb21iaW5hdGlvbiBjcmVhdGVzIGEgZnVsbCByZXBsYWNlbWVudCBvZlxuICAgKiB0aGUgYmFja3dhcmRzIG5hdmlnYXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZFBhZ2VQcmV2aW91cycpIHByZXZpb3VzQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPENscldpemFyZFBhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBuZXh0IGJ1dHRvbiBpcyBjbGlja2VkIGFuZCB0aGUgQ2xyV2l6YXJkUGFnZSBpc1xuICAgKiB0aGUgd2l6YXJkJ3MgY3VycmVudCBwYWdlLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBDbHJXaXphcmRQYWdlLnByZXZlbnREZWZhdWx0XG4gICAqIChjbHJXaXphcmRQYWdlUGFnZVByZXZlbnREZWZhdWx0KSBpbnB1dCB0byBpbXBsZW1lbnQgY3VzdG9tIGZvcndhcmRzXG4gICAqIG5hdmlnYXRpb24gYXQgdGhlIHBhZ2UgbGV2ZWwuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGRvXG4gICAqIHZhbGlkYXRpb24sIHNhdmUgZGF0YSwgb3Igd2FybiB1c2VycyBiZWZvcmUgYWxsb3dpbmcgdGhlbSB0byBnb1xuICAgKiB0byB0aGUgbmV4dCBwYWdlIGluIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHlvdSB0byBjYWxsIFdpemFyZC5mb3JjZU5leHQoKSBvciBXaXphcmQubmV4dCgpXG4gICAqIGZyb20gdGhlIGhvc3QgY29tcG9uZW50LiBUaGlzIGNvbWJpbmF0aW9uIGNyZWF0ZXMgYSBmdWxsIHJlcGxhY2VtZW50IG9mXG4gICAqIHRoZSBmb3J3YXJkIG5hdmlnYXRpb24gZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZFBhZ2VOZXh0JykgbmV4dEJ1dHRvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxDbHJXaXphcmRQYWdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGRhbmdlciBidXR0b24gaXMgY2xpY2tlZCBhbmQgdGhlIENscldpemFyZFBhZ2UgaXNcbiAgICogdGhlIHdpemFyZCdzIGN1cnJlbnQgcGFnZS4gQnkgZGVmYXVsdCwgYSBkYW5nZXIgYnV0dG9uIHdpbGwgYWN0IGFzXG4gICAqIGVpdGhlciBhIFwibmV4dFwiIG9yIFwiZmluaXNoXCIgYnV0dG9uIGRlcGVuZGluZyBvbiBpZiB0aGUgQ2xyV2l6YXJkUGFnZSBpcyB0aGVcbiAgICogbGFzdCBwYWdlIG9yIG5vdC5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ2xyV2l6YXJkUGFnZS5wcmV2ZW50RGVmYXVsdFxuICAgKiAoY2xyV2l6YXJkUGFnZVBhZ2VQcmV2ZW50RGVmYXVsdCkgaW5wdXQgdG8gaW1wbGVtZW50IGN1c3RvbSBmb3J3YXJkc1xuICAgKiBvciBmaW5pc2ggbmF2aWdhdGlvbiBhdCB0aGUgcGFnZSBsZXZlbCB3aGVuIHRoZSBkYW5nZXIgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGRvIHZhbGlkYXRpb24sIHNhdmUgZGF0YSwgb3Igd2FyblxuICAgKiB1c2VycyBiZWZvcmUgYWxsb3dpbmcgdGhlbSB0byBnbyB0byB0aGUgbmV4dCBwYWdlIGluIHRoZSB3aXphcmQgb3JcbiAgICogZmluaXNoIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHlvdSB0byBjYWxsIFdpemFyZC5maW5pc2goKSwgV2l6YXJkLmZvcmNlRmluaXNoKCksXG4gICAqIFdpemFyZC5mb3JjZU5leHQoKSBvciBXaXphcmQubmV4dCgpIGZyb20gdGhlIGhvc3QgY29tcG9uZW50LiBUaGlzXG4gICAqIGNvbWJpbmF0aW9uIGNyZWF0ZXMgYSBmdWxsIHJlcGxhY2VtZW50IG9mIHRoZSBmb3J3YXJkIG5hdmlnYXRpb24gYW5kXG4gICAqIGZpbmlzaCBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgQE91dHB1dCgnY2xyV2l6YXJkUGFnZURhbmdlcicpIGRhbmdlckJ1dHRvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxDbHJXaXphcmRQYWdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIG5leHQsIGZpbmlzaCwgb3IgZGFuZ2VyIGJ1dHRvbiBpcyBjbGlja2VkIGFuZCB0aGVcbiAgICogQ2xyV2l6YXJkUGFnZSBpcyB0aGUgd2l6YXJkJ3MgY3VycmVudCBwYWdlLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBDbHJXaXphcmRQYWdlLnByZXZlbnREZWZhdWx0XG4gICAqIChjbHJXaXphcmRQYWdlUGFnZVByZXZlbnREZWZhdWx0KSBpbnB1dCB0byBpbXBsZW1lbnQgY3VzdG9tIGZvcndhcmRzXG4gICAqIG9yIGZpbmlzaCBuYXZpZ2F0aW9uIGF0IHRoZSBwYWdlIGxldmVsLCByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mXG4gICAqIHByaW1hcnkgYnV0dG9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSB0byBkbyB2YWxpZGF0aW9uLCBzYXZlIGRhdGEsIG9yIHdhcm5cbiAgICogdXNlcnMgYmVmb3JlIGFsbG93aW5nIHRoZW0gdG8gZ28gdG8gdGhlIG5leHQgcGFnZSBpbiB0aGUgd2l6YXJkIG9yXG4gICAqIGZpbmlzaCB0aGUgd2l6YXJkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB5b3UgdG8gY2FsbCBXaXphcmQuZmluaXNoKCksIFdpemFyZC5mb3JjZUZpbmlzaCgpLFxuICAgKiBXaXphcmQuZm9yY2VOZXh0KCkgb3IgV2l6YXJkLm5leHQoKSBmcm9tIHRoZSBob3N0IGNvbXBvbmVudC4gVGhpc1xuICAgKiBjb21iaW5hdGlvbiBjcmVhdGVzIGEgZnVsbCByZXBsYWNlbWVudCBvZiB0aGUgZm9yd2FyZCBuYXZpZ2F0aW9uIGFuZFxuICAgKiBmaW5pc2ggZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZFBhZ2VQcmltYXJ5JykgcHJpbWFyeUJ1dHRvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoJ2NscldpemFyZFBhZ2VDdXN0b21CdXR0b24nKSBjdXN0b21CdXR0b25DbGlja2VkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdmFsdWUgdGhhdCBpcyB1c2VkIGludGVybmFsbHkgdG8gZ2VuZXJhdGUgdGhlIENscldpemFyZFBhZ2UgSUQgYXNcbiAgICogd2VsbCBhcyB0aGUgc3RlcCBuYXYgaXRlbSBJRC5cbiAgICpcbiAgICogVHlwZWQgYXMgYW55IGJlY2F1c2UgaXQgc2hvdWxkIGJlIGFibGUgdG8gYWNjZXB0IG51bWJlcnMgYXMgd2VsbCBhc1xuICAgKiBzdHJpbmdzLiBQYXNzaW5nIGFuIGluZGV4IGZvciB3aXphcmQgd2hvc2UgcGFnZXMgYXJlIGNyZWF0ZWQgd2l0aCBhblxuICAgKiBuZ0ZvciBsb29wIGlzIGEgY29tbW9uIHVzZSBjYXNlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgQElucHV0KCdpZCcpIF9pZDogYW55ID0gKHdpemFyZFBhZ2VJbmRleCsrKS50b1N0cmluZygpO1xuXG4gIC8qKlxuICAgKiBBIHJlYWQtb25seSBnZXR0ZXIgdGhhdCBnZW5lcmF0ZXMgYW4gSUQgc3RyaW5nIGZvciB0aGUgd2l6YXJkIHBhZ2UgZnJvbVxuICAgKiBlaXRoZXIgdGhlIHZhbHVlIHBhc3NlZCB0byB0aGUgQ2xyV2l6YXJkUGFnZSBcImlkXCIgaW5wdXQgb3IgYSB3aXphcmQgcGFnZVxuICAgKiBjb3VudGVyIHNoYXJlZCBhY3Jvc3MgYWxsIHdpemFyZCBwYWdlcyBpbiB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgdmFsdWUgcGFzc2VkIGludG8gdGhlIElEIGlucHV0IFdpbGwgYmUgcHJlZml4ZWQgd2l0aFxuICAgKiBcImNsci13aXphcmQtcGFnZS1cIi5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBDbHJXaXphcmRQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIC8vIGNvdmVycyB0aGluZ3MgbGlrZSBudWxsLCB1bmRlZmluZWQsIGZhbHNlLCBhbmQgZW1wdHkgc3RyaW5nXG4gICAgLy8gd2hpbGUgYWxsb3dpbmcgemVybyB0byBwYXNzXG4gICAgY29uc3QgaWRJc05vblplcm9GYWxzeSA9ICF0aGlzLl9pZCAmJiB0aGlzLl9pZCAhPT0gMDtcblxuICAgIC8vIGluIGFkZGl0aW9uIHRvIG5vbi16ZXJvIGZhbHN5IHdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgX2lkIGlzIG5vdCBhIG5lZ2F0aXZlXG4gICAgLy8gbnVtYmVyLlxuICAgIGlmIChpZElzTm9uWmVyb0ZhbHN5IHx8IHRoaXMuX2lkIDwgMCkge1xuICAgICAgLy8gZ3VhcmQgaGVyZSBpbiB0aGUgZXZlbnQgdGhhdCBpbnB1dCBiZWNvbWVzIHVuZGVmaW5lZCBvciBudWxsIGJ5IGFjY2lkZW50XG4gICAgICB0aGlzLl9pZCA9ICh3aXphcmRQYWdlSW5kZXgrKykudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGBjbHItd2l6YXJkLXBhZ2UtJHt0aGlzLl9pZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcmVhZC1vbmx5IGdldHRlciB0aGF0IHNlcnZlcyBhcyBhIGNvbnZlbmllbmNlIGZvciB0aG9zZSB3aG8gd291bGQgcmF0aGVyXG4gICAqIG5vdCB0aGluayBpbiB0aGUgdGVybXMgb2YgIUNscldpemFyZFBhZ2UubmV4dFN0ZXBEaXNhYmxlZC4gRm9yIHNvbWUgdXNlIGNhc2VzLFxuICAgKiBDbHJXaXphcmRQYWdlLnJlYWR5VG9Db21wbGV0ZSBpcyBtb3JlIGxvZ2ljYWwgYW5kIGRlY2xhcmF0aXZlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldCByZWFkeVRvQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLm5leHRTdGVwRGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHByaXZhdGUgX2NvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcGFnZSBpcyBtYXJrZWQgYXMgY29tcGxldGVkIGlmIGl0IGlzIGJvdGggcmVhZHlUb0NvbXBsZXRlIGFuZCBjb21wbGV0ZWQsXG4gICAqIGFzIGluIHRoZSBuZXh0IG9yIGZpbmlzaCBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQgd2hpbGUgdGhpcyBwYWdlIHdhcyBjdXJyZW50LlxuICAgKlxuICAgKiBOb3RlIHRoZXJlIGlzIGFuZCBvcGVuIHF1ZXN0aW9uIGFib3V0IGhvdyB0byBoYW5kbGUgcGFnZXMgdGhhdCBhcmUgbWFya2VkXG4gICAqIGNvbXBsZXRlIGJ1dCB3aG8gYXJlIG5vIGxvbmdlciByZWFkeVRvQ29tcGxldGUuIFRoaXMgbWlnaHQgaW5kaWNhdGUgYW4gZXJyb3JcbiAgICogc3RhdGUgZm9yIHRoZSBDbHJXaXphcmRQYWdlLiBDdXJyZW50bHksIHRoZSB3aXphcmQgZG9lcyBub3QgYWNrbm93bGVkZ2UgdGhpcyBzdGF0ZVxuICAgKiBhbmQgb25seSByZXR1cm5zIHRoYXQgdGhlIHBhZ2UgaXMgaW5jb21wbGV0ZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jb21wbGV0ZSAmJiB0aGlzLnJlYWR5VG9Db21wbGV0ZTtcblxuICAgIC8vIEZPUiBWMjogVU5XSU5EIENPTVBMRVRFRCwgUkVBRFlUT0NPTVBMRVRFLCBBTkQgRVJST1JTXG4gICAgLy8gU1VDSCBUSEFUIEVSUk9SUyBJUyBJVFMgT1dOIElOUFVULiBJRiBBIFNURVAgSVNcbiAgICAvLyBJTkNPTVBMRVRFIEFORCBFUlJPUkVELCBFUlJPUkVEIFdJTEwgTk9UIFNIT1cuXG4gICAgLy8gRklSU1QgUVVFU1RJT046IEFNIEkgR1JFWSBPUiBDT0xPUkVEP1xuICAgIC8vIFNFQ09ORCBRVUVTVElPTjogQU0gSSBHUkVFTiBPUiBSRUQ/XG4gIH1cblxuICAvKipcbiAgICogQSBDbHJXaXphcmRQYWdlIGNhbiBiZSBtYW51YWxseSBzZXQgdG8gY29tcGxldGVkIHVzaW5nIHRoaXMgYm9vbGVhbiBzZXR0ZXIuXG4gICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdXNlcnMgcmVseSBvbiB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIGluIHRoZSB3aXphcmRcbiAgICogYW5kIG5hdmlnYXRpb24gc2VydmljZSBpbnN0ZWFkIG9mIG1hbnVhbGx5IHNldHRpbmcgcGFnZXPDosKAwpkgY29tcGxldGlvbiBzdGF0ZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIENscldpemFyZFBhZ2VcbiAgICovXG4gIHB1YmxpYyBzZXQgY29tcGxldGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY29tcGxldGUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2l0aCB0aGUgbmF2aWdhdGlvbiBzZXJ2aWNlIHRvIHNlZSBpZiBpdCBpcyB0aGUgY3VycmVudCBwYWdlLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hdlNlcnZpY2UuY3VycmVudFBhZ2UgPT09IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcmVhZC1vbmx5IGdldHRlciB0aGF0IHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHBhZ2UgaXMgbmF2aWdhYmxlXG4gICAqIGluIHRoZSB3aXphcmQuIEEgd2l6YXJkIHBhZ2UgY2FuIGJlIG5hdmlnYXRlZCB0byBpZiBpdCBpcyBjb21wbGV0ZWRcbiAgICogb3IgdGhlIHBhZ2UgYmVmb3JlIGl0IGlzIGNvbXBsZXRlZC5cbiAgICpcbiAgICogVGhpcyBnZXR0ZXIgaGFuZGxlcyB0aGUgbG9naWMgZm9yIGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGUgbGlua3MgaW5cbiAgICogdGhlIHN0ZXAgbmF2IG9uIHRoZSBsZWZ0IFNpZGUgb2YgdGhlIHdpemFyZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50IHx8IHRoaXMuY29tcGxldGVkIHx8IHRoaXMucHJldmlvdXNDb21wbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQSByZWFkLW9ubHkgZ2V0dGVyIHRoYXQgcmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGFnZSBiZWZvcmUgdGhpc1xuICAgKiBDbHJXaXphcmRQYWdlIGlzIGNvbXBsZXRlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90XG4gICAqIGEgcGFnZSBpcyBuYXZpZ2FibGUgaWYgaXQgaXMgbm90IGN1cnJlbnQgb3IgYWxyZWFkeSBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByZXZpb3VzQ29tcGxldGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZpb3VzUGFnZSA9IHRoaXMucGFnZUNvbGxlY3Rpb24uZ2V0UHJldmlvdXNQYWdlKHRoaXMpO1xuXG4gICAgaWYgKCFwcmV2aW91c1BhZ2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91c1BhZ2UuY29tcGxldGVkO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VUaXRsZS5wYWdlVGl0bGVUZW1wbGF0ZVJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldCBuYXZUaXRsZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICBpZiAodGhpcy5wYWdlTmF2VGl0bGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2VOYXZUaXRsZS5wYWdlTmF2VGl0bGVUZW1wbGF0ZVJlZjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFnZVRpdGxlLnBhZ2VUaXRsZVRlbXBsYXRlUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhlYWRlckFjdGlvbnMoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgaWYgKCF0aGlzLl9oZWFkZXJBY3Rpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oZWFkZXJBY3Rpb25zLnBhZ2VIZWFkZXJBY3Rpb25zVGVtcGxhdGVSZWY7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzSGVhZGVyQWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9oZWFkZXJBY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGJ1dHRvbnMoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgaWYgKCF0aGlzLl9idXR0b25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9idXR0b25zLnBhZ2VCdXR0b25zVGVtcGxhdGVSZWY7XG4gIH1cblxuICAvKipcbiAgICogQSByZWFkLW9ubHkgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIGJvb2xlYW4gdGhhdCBzYXlzIHdoZXRoZXIgb3JcbiAgICogbm90IHRoZSBDbHJXaXphcmRQYWdlIGluY2x1ZGVzIGJ1dHRvbnMuIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZVxuICAgKiBXaXphcmQgc2hvdWxkIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJ1dHRvbiBzZXQgZGVmaW5lZCBhc1xuICAgKiBpdHMgZGlyZWN0IGNoaWxkcmVuLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkUGFnZVxuICAgKlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX2J1dHRvbnM7XG4gIH1cblxuICAvKipcbiAgICogVXNlcyB0aGUgbmF2IHNlcnZpY2UgdG8gbWFrZSB0aGUgQ2xyV2l6YXJkUGFnZSB0aGUgY3VycmVudCBwYWdlIGluIHRoZVxuICAgKiB3aXphcmQuIEJ5cGFzc2VzIGFsbCBjaGVja3MgYnV0IHN0aWxsIGVtaXRzIHRoZSBDbHJXaXphcmRQYWdlLm9uTG9hZFxuICAgKiAoY2xyV2l6YXJkUGFnZU9uTG9hZCkgb3V0cHV0LlxuICAgKlxuICAgKiBJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSBkZWZhdWx0IG5hdmlnYXRpb24gZnVuY3Rpb25zXG4gICAqIGluIFdpemFyZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHB1YmxpYyBtYWtlQ3VycmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLm5hdlNlcnZpY2UuY3VycmVudFBhZ2UgPSB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmtzIHRoZSBuYXYgc2VydmljZSBhbmQgZXN0YWJsaXNoZXMgdGhlIGN1cnJlbnQgcGFnZSBpZiBvbmUgaXMgbm90IGRlZmluZWQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRQYWdlXG4gICAqXG4gICAqL1xuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgbmF2U2VydmljZSA9IHRoaXMubmF2U2VydmljZTtcbiAgICBpZiAoIW5hdlNlcnZpY2UuY3VycmVudFBhZ2UgJiYgIW5hdlNlcnZpY2UubmF2U2VydmljZUxvYWRlZCkge1xuICAgICAgdGhpcy5tYWtlQ3VycmVudCgpO1xuICAgICAgdGhpcy5uYXZTZXJ2aWNlLm5hdlNlcnZpY2VMb2FkZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHJlYWQtb25seSBnZXR0ZXIgdGhhdCByZXR1cm5zIHRoZSBpZCB1c2VkIGJ5IHRoZSBzdGVwIG5hdiBpdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFnZS5cbiAgICpcbiAgICogQ2xyV2l6YXJkUGFnZSBuZWVkcyB0aGlzIElEIHN0cmluZyBmb3IgYXJpYSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFBhZ2VcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RlcEl0ZW1JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhZ2VDb2xsZWN0aW9uLmdldFN0ZXBJdGVtSWRGb3JQYWdlKHRoaXMpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEb0NoZWNrLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQnV0dG9uSHViU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2J1dHRvbi1odWIuc2VydmljZSc7XG5pbXBvcnQgeyBIZWFkZXJBY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvaGVhZGVyLWFjdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBQYWdlQ29sbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy9wYWdlLWNvbGxlY3Rpb24uc2VydmljZSc7XG4vLyBwcm92aWRlcnNcbmltcG9ydCB7IFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvd2l6YXJkLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDbHJXaXphcmRIZWFkZXJBY3Rpb24gfSBmcm9tICcuL3dpemFyZC1oZWFkZXItYWN0aW9uJztcbmltcG9ydCB7IENscldpemFyZFBhZ2UgfSBmcm9tICcuL3dpemFyZC1wYWdlJztcblxuLyoqXG4gKlxuICogVGhlIFdpemFyZCBjb21wb25lbnRcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci13aXphcmQnLFxuICBwcm92aWRlcnM6IFtXaXphcmROYXZpZ2F0aW9uU2VydmljZSwgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlLCBCdXR0b25IdWJTZXJ2aWNlLCBIZWFkZXJBY3Rpb25TZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpemFyZC5odG1sJyxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY2xyLXdpemFyZF0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy53aXphcmQtbWRdJzogXCJzaXplID09ICdtZCdcIixcbiAgICAnW2NsYXNzLndpemFyZC1sZ10nOiBcInNpemUgPT0gJ2xnJ1wiLFxuICAgICdbY2xhc3Mud2l6YXJkLXhsXSc6IFwic2l6ZSA9PSAneGwnXCIsXG4gICAgJ1tjbGFzcy5sYXN0UGFnZV0nOiAnbmF2U2VydmljZS5jdXJyZW50UGFnZUlzTGFzdCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENscldpemFyZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0LCBEb0NoZWNrIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgV2l6YXJkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmF2U2VydmljZTogV2l6YXJkTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgcHVibGljIHBhZ2VDb2xsZWN0aW9uOiBQYWdlQ29sbGVjdGlvblNlcnZpY2UsXG4gICAgcHVibGljIGJ1dHRvblNlcnZpY2U6IEJ1dHRvbkh1YlNlcnZpY2UsXG4gICAgcHVibGljIGhlYWRlckFjdGlvblNlcnZpY2U6IEhlYWRlckFjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVyc1xuICApIHtcbiAgICB0aGlzLmdvTmV4dFN1YnNjcmlwdGlvbiA9IHRoaXMubmF2U2VydmljZS5tb3ZlZFRvTmV4dFBhZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMub25Nb3ZlTmV4dC5lbWl0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmdvUHJldmlvdXNTdWJzY3JpcHRpb24gPSB0aGlzLm5hdlNlcnZpY2UubW92ZWRUb1ByZXZpb3VzUGFnZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5vbk1vdmVQcmV2aW91cy5lbWl0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNhbmNlbFN1YnNjcmlwdGlvbiA9IHRoaXMubmF2U2VydmljZS5ub3RpZnlXaXphcmRDYW5jZWwuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tBbmRDYW5jZWwoKTtcbiAgICB9KTtcblxuICAgIHRoaXMud2l6YXJkRmluaXNoZWRTdWJzY3JpcHRpb24gPSB0aGlzLm5hdlNlcnZpY2Uud2l6YXJkRmluaXNoZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdG9wTmV4dCkge1xuICAgICAgICB0aGlzLmZvcmNlRmluaXNoKCk7XG4gICAgICB9XG4gICAgICB0aGlzLndpemFyZEZpbmlzaGVkLmVtaXQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGlmZmVyID0gZGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBmb3IgbWFya2luZyB3aGVuIHRoZSBjb2xsZWN0aW9uIG9mIHdpemFyZCBwYWdlcyBoYXMgYmVlbiBhZGRlZCB0byBvciBkZWxldGVkIGZyb21cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgZGlmZmVyOiBhbnk7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIHRoZSBzaXplIGRlZmluZWQgYnkgdGhlIGNscldpemFyZFNpemUgaW5wdXRcbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdjbHJXaXphcmRTaXplJykgc2l6ZTogc3RyaW5nID0gJ3hsJztcblxuICAvKipcbiAgICogUmVzZXRzIHBhZ2UgY29tcGxldGVkIHN0YXRlcyB3aGVuIG5hdmlnYXRpbmcgYmFja3dhcmRzLiBDYW4gYmUgc2V0IHVzaW5nXG4gICAqIHRoZSBjbHJXaXphcmRGb3JjZUZvcndhcmROYXZpZ2F0aW9uIGlucHV0LlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ2NscldpemFyZEZvcmNlRm9yd2FyZE5hdmlnYXRpb24nKVxuICBzZXQgZm9yY2VGb3J3YXJkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZm9yY2VGb3J3YXJkID0gISF2YWx1ZTtcbiAgICB0aGlzLm5hdlNlcnZpY2UuZm9yY2VGb3J3YXJkTmF2aWdhdGlvbiA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2ZvcmNlRm9yd2FyZDogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXQgZm9yY2VGb3J3YXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mb3JjZUZvcndhcmQ7XG4gIH1cblxuICAvKipcbiAgICogVGVsbHMgdGhlIG1vZGFsIHBhcnQgb2YgdGhlIHdpemFyZCB3aGV0aGVyIGl0IHNob3VsZCBoYXZlIGEgY2xvc2UgXCJYXCJcbiAgICogaW4gdGhlIHRvcCByaWdodCBjb3JuZXIuIFNldCB3aXRoIHRoZSBjbHJXaXphcmRDbG9zYWJsZSBpbnB1dC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdjbHJXaXphcmRDbG9zYWJsZScpIGNsb3NhYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVG9nZ2xlcyBvcGVuL2Nsb3NlIG9mIHRoZSB3aXphcmQgY29tcG9uZW50LiBTZXQgdXNpbmcgdGhlIGNscldpemFyZE9wZW5cbiAgICogaW5wdXQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRcbiAgICpcbiAgICovXG4gIHB1YmxpYyBfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoJ2NscldpemFyZE9wZW4nKVxuICBzZXQgY2xyV2l6YXJkT3BlbihvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMuYnV0dG9uU2VydmljZS5idXR0b25zUmVhZHkgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9vcGVuID0gb3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB3aXphcmQgaXMgb3BlbmVkIG9yIGNsb3NlZC4gRW1pdHMgdGhyb3VnaCB0aGVcbiAgICogY2xyV2l6YXJkT3BlbkNoYW5nZSBvdXRwdXQuIFdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlXG4gICAqIGNscldpemFyZE9wZW4gYmluZGluZyBzbyB5b3UgY2FuIHVzZS4uLlxuICAgKlxuICAgKiA8Y2xyLXdpemFyZCBbKGNscldpemFyZE9wZW4pXT1cImJsYWhcIlxuICAgKiAuLi5vci4uLlxuICAgKiA8Y2xyLXdpemFyZCBbY2xyV2l6YXJkT3Blbl09XCJzb21ldGhpbmdcIiAoY2xyV2l6YXJkT3BlbkNoYW5nZSk9XCJkb1NvbWV0aGlnbigkZXZlbnQpXCI+XG4gICAqXG4gICAqIC4uLmZvciB0d28td2F5IGJpbmRpbmcuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZE9wZW5DaGFuZ2UnKSBfb3BlbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB3aXphcmQgaXMgY2FuY2VsZWQuIENhbiBiZSBvYnNlcnZlZCB0aHJvdWdoIHRoZSBjbHJXaXphcmRPbkNhbmNlbFxuICAgKiBvdXRwdXQuXG4gICAqXG4gICAqIENhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBjbHJXaXphcmRQcmV2ZW50RGVmYXVsdENhbmNlbCBpbnB1dCB0byBjcmVhdGVcbiAgICogd2l6YXJkLWxldmVsIGN1c3RvbSBjYW5jZWwgcm91dGluZXMuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZE9uQ2FuY2VsJykgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KGZhbHNlKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgd2l6YXJkIGlzIGNvbXBsZXRlZC4gQ2FuIGJlIG9ic2VydmVkIHRocm91Z2ggdGhlIGNscldpemFyZE9uRmluaXNoXG4gICAqIG91dHB1dC5cbiAgICpcbiAgICogQ2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIGNscldpemFyZFByZXZlbnREZWZhdWx0TmV4dCBpbnB1dCB0byBjcmVhdGVcbiAgICogd2l6YXJkLWxldmVsIGN1c3RvbSBjb21wbGV0aW9uIHJvdXRpbmVzLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBAT3V0cHV0KCdjbHJXaXphcmRPbkZpbmlzaCcpIHdpemFyZEZpbmlzaGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHdpemFyZCBpcyByZXNldC4gU2VlIC5yZXNldCgpLiBDYW4gYmUgb2JzZXJ2ZWQgdGhyb3VnaFxuICAgKiB0aGUgY2xyV2l6YXJkT25SZXNldCBvdXRwdXQuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZE9uUmVzZXQnKSBvblJlc2V0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIEEgUXVlcnlMaXN0IG9mIHRoZSBwYWdlcyBpbiB0aGUgd2l6YXJkLiBOb3RlIHRoYXQgYSBRdWVyeUxpc3QgaXMgc29ydCBvZlxuICAgKiBsaWtlIGFuIEFycmF5IGJ1dCBub3QgcmVhbGx5LiBOb3RlIGFsc28gdGhhdCBwYWdlcyBkb2VzIG5vdCBjb250YWluXG4gICAqIFdpemFyZFBhZ2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgd2l0aCBhbiBuZ0lmLlxuICAgKlxuICAgKiBNb3N0IGludGVyYWN0aW9ucyB3aXRoIGEgQ2xyV2l6YXJkJ3MgcGFnZXMgYXJlIG1vcmUgZWFzaWx5IGRvbmUgdXNpbmcgdGhlXG4gICAqIGhlbHBlciBmdW5jdGlvbiBpbiB0aGUgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlLCBhY2Nlc3NpYmxlIGZyb20gdGhlXG4gICAqIENscldpemFyZCB0aHJvdWdoIENscldpemFyZC5wYWdlQ29sbGVjdGlvbi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihDbHJXaXphcmRQYWdlKSBwdWJsaWMgcGFnZXM6IFF1ZXJ5TGlzdDxDbHJXaXphcmRQYWdlPjtcblxuICAvKipcbiAgICogQSBRdWVyeUxpc3Qgb2YgdGhlIGhlYWRlciBhY3Rpb25zIGRlZmluZWQgYXQgdGhlIENscldpemFyZCBsZXZlbC4gRG9lcyBub3RcbiAgICogY29udGFpbiBoZWFkZXIgYWN0aW9ucyBkZWZpbmVkIGF0IHRoZSBwYWdlIGxldmVsLiBNb3N0bHkgdXNlZCBieSBvdGhlciBmdW5jdGlvbmFsaXR5XG4gICAqIHRoYXQgbmVlZHMgdG8gZWl0aGVyIGtub3cgaWYgdGhlIENscldpemFyZCBoYXMgaGVhZGVyIGFjdGlvbnMgb3IgbmVlZHMgdG8gc3RhbXAgdGhlbVxuICAgKiBzb21ld2hlcmUuXG4gICAqXG4gICAqIENvdWxkIGJlIHVzZWZ1bCBpZiB5b3UgbmVlZGVkIHRvIGxvY2F0ZSBhbmQgcHJvZ3JhbW1hdGljYWxseSBhY3RpdmF0ZSBhIHNwZWNpZmljXG4gICAqIGhlYWRlciBhY3Rpb24uIEJ1dCB0aGlzIGlzIHByb2JhYmx5IGVhc2llciB0byBkbyBieSBpbnZva2luZyB0aGUgaGVhZGVyIGFjdGlvbidzXG4gICAqIGV2ZW50IGhhbmRsZXIgaW4geW91ciBob3N0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihDbHJXaXphcmRIZWFkZXJBY3Rpb24pIHB1YmxpYyBoZWFkZXJBY3Rpb25zOiBRdWVyeUxpc3Q8Q2xyV2l6YXJkSGVhZGVyQWN0aW9uPjtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgY3VycmVudCBwYWdlIGhhcyBjaGFuZ2VkLiBDYW4gYmUgb2JzZXJ2ZWQgdGhyb3VnaCB0aGUgY2xyV2l6YXJkQ3VycmVudFBhZ2VDaGFuZ2VkXG4gICAqIG91dHB1dC4gVGhpcyBjYW4gaGFwcGVuIG9uIC5uZXh0KCkgb3IgLnByZXZpb3VzKCkuXG4gICAqIFVzZWZ1bCBmb3Igbm9uLWJsb2NraW5nIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRcbiAgICpcbiAgICovXG4gIEBPdXRwdXQoJ2NscldpemFyZEN1cnJlbnRQYWdlQ2hhbmdlZCcpIGN1cnJlbnRQYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB3aXphcmQgbW92ZXMgdG8gdGhlIG5leHQgcGFnZS4gQ2FuIGJlIG9ic2VydmVkIHRocm91Z2ggdGhlIGNscldpemFyZE9uTmV4dFxuICAgKiBvdXRwdXQuXG4gICAqXG4gICAqIENhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBjbHJXaXphcmRQcmV2ZW50RGVmYXVsdE5leHQgaW5wdXQgdG8gY3JlYXRlXG4gICAqIHdpemFyZC1sZXZlbCBjdXN0b20gbmF2aWdhdGlvbiByb3V0aW5lcywgd2hpY2ggYXJlIHVzZWZ1bCBmb3IgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQE91dHB1dCgnY2xyV2l6YXJkT25OZXh0Jykgb25Nb3ZlTmV4dDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB3aXphcmQgbW92ZXMgdG8gdGhlIHByZXZpb3VzIHBhZ2UuIENhbiBiZSBvYnNlcnZlZCB0aHJvdWdoIHRoZVxuICAgKiBjbHJXaXphcmRPblByZXZpb3VzIG91dHB1dC5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWZ1bCBmb3IgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQE91dHB1dCgnY2xyV2l6YXJkT25QcmV2aW91cycpIG9uTW92ZVByZXZpb3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PihmYWxzZSk7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIENscldpemFyZCBmcm9tIG1vdmluZyB0byB0aGUgbmV4dCBwYWdlIG9yIGNsb3NpbmcgaXRzZWxmIG9uIGZpbmlzaGluZy5cbiAgICogU2V0IHVzaW5nIHRoZSBjbHJXaXphcmRQcmV2ZW50RGVmYXVsdE5leHQgaW5wdXQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB1c2luZyBzdG9wTmV4dCB3aWxsIHJlcXVpcmUgeW91IHRvIGNyZWF0ZSB5b3VyIG93biBjYWxscyB0b1xuICAgKiAubmV4dCgpIGFuZCAuZmluaXNoKCkgaW4geW91ciBob3N0IGNvbXBvbmVudCB0byBtYWtlIHRoZSBDbHJXaXphcmQgd29yayBhc1xuICAgKiBleHBlY3RlZC5cbiAgICpcbiAgICogUHJpbWFyaWx5IHVzZWQgZm9yIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBtZW1iZXJvZiBXaXphcmRcbiAgICpcbiAgICovXG4gIEBJbnB1dCgnY2xyV2l6YXJkUHJldmVudERlZmF1bHROZXh0JylcbiAgc2V0IHN0b3BOZXh0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc3RvcE5leHQgPSAhIXZhbHVlO1xuICAgIHRoaXMubmF2U2VydmljZS53aXphcmRIYXNBbHROZXh0ID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfc3RvcE5leHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZ2V0IHN0b3BOZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdG9wTmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50cyBDbHJXaXphcmQgZnJvbSBjbG9zaW5nIHdoZW4gdGhlIGNhbmNlbCBidXR0b24gb3IgY2xvc2UgXCJYXCIgaXMgY2xpY2tlZC5cbiAgICogU2V0IHVzaW5nIHRoZSBjbHJXaXphcmRQcmV2ZW50RGVmYXVsdENhbmNlbCBpbnB1dC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHVzaW5nIHN0b3BDYW5jZWwgd2lsbCByZXF1aXJlIHlvdSB0byBjcmVhdGUgeW91ciBvd24gY2FsbHMgdG9cbiAgICogLmNsb3NlKCkgaW4geW91ciBob3N0IGNvbXBvbmVudCB0byBtYWtlIHRoZSBDbHJXaXphcmQgd29yayBhcyBleHBlY3RlZC5cbiAgICpcbiAgICogVXNlZnVsIGZvciBkb2luZyBjaGVja3Mgb3IgcHJvbXB0cyBiZWZvcmUgY2xvc2luZyBhIENscldpemFyZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdjbHJXaXphcmRQcmV2ZW50RGVmYXVsdENhbmNlbCcpXG4gIHNldCBzdG9wQ2FuY2VsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc3RvcENhbmNlbCA9ICEhdmFsdWU7XG4gICAgdGhpcy5uYXZTZXJ2aWNlLndpemFyZEhhc0FsdENhbmNlbCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX3N0b3BDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZ2V0IHN0b3BDYW5jZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3BDYW5jZWw7XG4gIH1cblxuICAvKipcbiAgICogUHJldmVudHMgQ2xyV2l6YXJkIGZyb20gcGVyZm9ybWluZyBhbnkgZm9ybSBvZiBuYXZpZ2F0aW9uIGF3YXkgZnJvbSB0aGUgY3VycmVudFxuICAgKiBwYWdlLiBTZXQgdXNpbmcgdGhlIGNscldpemFyZFByZXZlbnROYXZpZ2F0aW9uIGlucHV0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgc3RvcE5hdmlnYXRpb24gaXMgbWVhbnQgdG8gZnJlZXplIHRoZSB3aXphcmQgaW4gcGxhY2UsIHR5cGljYWxseVxuICAgKiBkdXJpbmcgYSBsb25nIHZhbGlkYXRpb24gb3IgYmFja2dyb3VuZCBhY3Rpb24gd2hlcmUgeW91IHdhbnQgdGhlIHdpemFyZCB0b1xuICAgKiBkaXNwbGF5IGxvYWRpbmcgY29udGVudCBidXQgbm90IGFsbG93IHRoZSB1c2VyIHRvIGV4ZWN1dGUgbmF2aWdhdGlvbiBpblxuICAgKiB0aGUgc3RlcG5hdiwgY2xvc2UgWCwgb3IgdGhlICBiYWNrLCBmaW5pc2gsIG9yIG5leHQgYnV0dG9ucy5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdjbHJXaXphcmRQcmV2ZW50TmF2aWdhdGlvbicpXG4gIHNldCBzdG9wTmF2aWdhdGlvbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3N0b3BOYXZpZ2F0aW9uID0gISF2YWx1ZTtcbiAgICB0aGlzLm5hdlNlcnZpY2Uud2l6YXJkU3RvcE5hdmlnYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9zdG9wTmF2aWdhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXQgc3RvcE5hdmlnYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3BOYXZpZ2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGNsaWNrcyBvbiB0aGUgbGlua3MgaW4gdGhlIHN0ZXBuYXYgZnJvbSB3b3JraW5nLlxuICAgKlxuICAgKiBBIG1vcmUgZ3JhbnVsYXIgYnlwYXNzaW5nIG9mIG5hdmlnYXRpb24gd2hpY2ggY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdXJcbiAgICogQ2xyV2l6YXJkIGlzIGluIGEgc3RhdGUgb2YgY29tcGxldGlvbiBhbmQgeW91IGRvbid0IHdhbnQgdXNlcnMgdG8gYmVcbiAgICogYWJsZSB0byBqdW1wIGJhY2t3YXJkcyBhbmQgY2hhbmdlIHRoaW5ncy5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdjbHJXaXphcmREaXNhYmxlU3RlcG5hdicpXG4gIHNldCBkaXNhYmxlU3RlcG5hdih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVTdGVwbmF2ID0gISF2YWx1ZTtcbiAgICB0aGlzLm5hdlNlcnZpY2Uud2l6YXJkRGlzYWJsZVN0ZXBuYXYgPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9kaXNhYmxlU3RlcG5hdjogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXQgZGlzYWJsZVN0ZXBuYXYoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVTdGVwbmF2O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgb25seSB0byBjb21tdW5pY2F0ZSB0byB0aGUgdW5kZXJseWluZyBtb2RhbCB0aGF0IGFuaW1hdGlvbnMgYXJlIG5vdFxuICAgKiB3YW50ZWQuIFByaW1hcnkgdXNlIGlzIGZvciB0aGUgZGlzcGxheSBvZiBzdGF0aWMvaW5saW5lIHdpemFyZHMuXG4gICAqXG4gICAqIFNldCB1c2luZyBjbHJXaXphcmRQcmV2ZW50TW9kYWxBbmltYXRpb24gaW5wdXQuIEJ1dCB5b3Ugc2hvdWxkIG5ldmVyIHNldCBpdC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgQElucHV0KCdjbHJXaXphcmRQcmV2ZW50TW9kYWxBbmltYXRpb24nKSBfc3RvcE1vZGFsQW5pbWF0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IHN0b3BNb2RhbEFuaW1hdGlvbnMoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fc3RvcE1vZGFsQW5pbWF0aW9ucykge1xuICAgICAgcmV0dXJuICd0cnVlJztcbiAgICB9XG4gICAgcmV0dXJuICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGFnZVN1YnNjcmlwdGlvbiA9IHRoaXMubmF2U2VydmljZS5jdXJyZW50UGFnZUNoYW5nZWQuc3Vic2NyaWJlKChwYWdlOiBDbHJXaXphcmRQYWdlKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlQ2hhbmdlZC5lbWl0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdvTmV4dFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGdvUHJldmlvdXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjYW5jZWxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHdpemFyZEZpbmlzaGVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZ29OZXh0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmdvTmV4dFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nb1ByZXZpb3VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmdvUHJldmlvdXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FuY2VsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNhbmNlbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy53aXphcmRGaW5pc2hlZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy53aXphcmRGaW5pc2hlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHJlZmVyZW5jZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBwcm92aWRlcnMuXG4gICAqXG4gICAqIEBuYW1lIG5nQWZ0ZXJDb250ZW50SW5pdFxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMucGFnZUNvbGxlY3Rpb24ucGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgIHRoaXMuaGVhZGVyQWN0aW9uU2VydmljZS53aXphcmRIZWFkZXJBY3Rpb25zID0gdGhpcy5oZWFkZXJBY3Rpb25zO1xuXG4gICAgLy8gT25seSB0cmlnZ2VyIGJ1dHRvbnMgcmVhZHkgaWYgZGVmYXVsdCBpcyBvcGVuIChpbmxpbmVkKVxuICAgIGlmICh0aGlzLl9vcGVuKSB7XG4gICAgICB0aGlzLmJ1dHRvblNlcnZpY2UuYnV0dG9uc1JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBmb3Iga2VlcGluZyB0cmFjayBvZiB3aGVuIHBhZ2VzIGFyZSBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhpcy5wYWdlc1xuICAgKlxuICAgKiBAbmFtZSBuZ0RvQ2hlY2tcbiAgICogQG1lbWJlcm9mIFdpemFyZFxuICAgKlxuICAgKi9cbiAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5kaWZmZXIuZGlmZih0aGlzLnBhZ2VzKTtcbiAgICBpZiAoY2hhbmdlcykge1xuICAgICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLnVwZGF0ZU5hdmlnYXRpb24oKTtcbiAgICAgIH0pO1xuICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm5hdlNlcnZpY2UudXBkYXRlTmF2aWdhdGlvbigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbnQgcHJvcGVydHkgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgYSB3aXphcmQgaXMgc3RhdGljL2luLWxpbmUgb3Igbm90LlxuICAgKlxuICAgKiBAbmFtZSBpc1N0YXRpY1xuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU3RhdGljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsci13aXphcmQtLWlubGluZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzIGEgZ2V0dGVyLCBjdXJyZW50IHBhZ2UgaXMgYSBjb252ZW5pZW50IHdheSB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBwYWdlIGZyb21cbiAgICogdGhlIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlLlxuICAgKlxuICAgKiBBcyBhIHNldHRlciwgY3VycmVudCBwYWdlIGFjY2VwdHMgYSBDbHJXaXphcmRQYWdlIGFuZCBwYXNzZXMgaXQgdG8gV2l6YXJkTmF2aWdhdGlvblNlcnZpY2VcbiAgICogdG8gYmUgbWFkZSB0aGUgY3VycmVudCBwYWdlLiBjdXJyZW50UGFnZSBwZXJmb3JtcyBjaGVja3MgdG8gbWFrZSBzdXJlIGl0IGNhbiBuYXZpZ2F0ZVxuICAgKiB0byB0aGUgZGVzaWduYXRlZCBwYWdlLlxuICAgKlxuICAgKiBAbmFtZSBjdXJyZW50UGFnZVxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYWdlKCk6IENscldpemFyZFBhZ2Uge1xuICAgIHJldHVybiB0aGlzLm5hdlNlcnZpY2UuY3VycmVudFBhZ2U7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50UGFnZShwYWdlOiBDbHJXaXphcmRQYWdlKSB7XG4gICAgdGhpcy5uYXZTZXJ2aWNlLmdvVG8ocGFnZSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVudCBwcm9wZXJ0eSBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBwYWdlIG9mXG4gICAqIHRoZSB3aXphcmQuXG4gICAqXG4gICAqIEBuYW1lIGlzTGFzdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTGFzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYXZTZXJ2aWNlLmN1cnJlbnRQYWdlSXNMYXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbnQgcHJvcGVydHkgZm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGZpcnN0IHBhZ2Ugb2ZcbiAgICogdGhlIHdpemFyZC5cbiAgICpcbiAgICogQG5hbWUgaXNGaXJzdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgV2l6YXJkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRmlyc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmF2U2VydmljZS5jdXJyZW50UGFnZUlzRmlyc3Q7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgdGhlIGFjdGlvbnMgbmVlZGVkIHRvIG9wZW4gdGhlIHdpemFyZC4gSWYgdGhlcmUgaXMgbm8gY3VycmVudFxuICAgKiBwYWdlIGRlZmluZWQsIHNldHMgdGhlIGZpcnN0IHBhZ2UgaW4gdGhlIHdpemFyZCB0byBiZSBjdXJyZW50LlxuICAgKlxuICAgKiBAbmFtZSBvcGVuXG4gICAqIEBtZW1iZXJvZiBDbHJXaXphcmRcbiAgICovXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW4gPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLm5hdlNlcnZpY2Uuc2V0Rmlyc3RQYWdlQ3VycmVudCgpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgcmVuZGVyIGJ1dHRvbnMgd2hlbiB3aXphcmQgaXMgb3BlbmVkLCB0byBhdm9pZCBjaG9jb2xhdGUgZXJyb3JzXG4gICAgdGhpcy5idXR0b25TZXJ2aWNlLmJ1dHRvbnNSZWFkeSA9IHRydWU7XG5cbiAgICB0aGlzLl9vcGVuQ2hhbmdlZC5lbWl0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgdGhlIHdvcmsgaW52b2x2ZWQgd2l0aCBjbG9zaW5nIHRoZSB3aXphcmQuIENhbGwgdGhpcyBkaXJlY3RseSBpbnN0ZWFkXG4gICAqIG9mIGNhbmNlbCgpIHRvIGltcGxlbWVudCBhbHRlcm5hdGl2ZSBjYW5jZWwgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQG5hbWUgY2xvc2VcbiAgICogQG1lbWJlcm9mIENscldpemFyZFxuICAgKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0b3BOYXZpZ2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuX29wZW5DaGFuZ2VkLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbnQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBvcGVuIGFuZCBjbG9zZSB0aGUgd2l6YXJkLiBJdCBvcGVyYXRlc1xuICAgKiBieSBjaGVja2luZyBhIEJvb2xlYW4gcGFyYW1ldGVyLiBJZiB0cnVlLCB0aGUgd2l6YXJkIGlzIG9wZW5lZC4gSWYgZmFsc2UsXG4gICAqIGl0IGlzIGNsb3NlZC5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIsIHNvIGJ5IGRlZmF1bHQgdGhlIHdpemFyZCB3aWxsXG4gICAqIGNsb3NlIGlmIGludm9rZWQgd2l0aCBubyBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBuYW1lIHRvZ2dsZVxuICAgKlxuICAgKiBAbWVtYmVyb2YgQ2xyV2l6YXJkXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgd2l6YXJkIHRvIHRoZSBwcmV2aW91cyBwYWdlLlxuICAgKlxuICAgKiBAbmFtZSBwcmV2aW91c1xuICAgKiBAbWVtYmVyb2YgQ2xyV2l6YXJkXG4gICAqL1xuICBwdWJsaWMgcHJldmlvdXMoKTogdm9pZCB7XG4gICAgdGhpcy5uYXZTZXJ2aWNlLnByZXZpb3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5jbHVkZXMgYSBCb29sZWFuIHBhcmFtZXRlciB0aGF0IHdpbGwgc2tpcCBjaGVja3MgYW5kIGV2ZW50IGVtaXNzaW9ucy5cbiAgICogSWYgdHJ1ZSwgdGhlIHdpemFyZCB3aWxsIG1vdmUgdG8gdGhlIG5leHQgcGFnZSByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZlxuICAgKiBpdHMgY3VycmVudCBwYWdlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYWx0ZXJuYXRpdmUgbmF2aWdhdGlvbiB3aGVyZSBldmVudFxuICAgKiBlbWlzc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSBhbmQgZmlyaW5nIHRoZW0gYWdhaW4gbWF5IGNhdXNlIGFuIGV2ZW50IGxvb3AuXG4gICAqXG4gICAqIEdlbmVyYWxseSwgd2l0aCBhbHRlcm5hdGl2ZSBuYXZpZ2F0aW9uLCB1c2VycyBhcmUgc3VwcGx5aW5nIHRoZWlyIG93biBjaGVja3NcbiAgICogYW5kIHZhbGlkYXRpb24uIFNvIHRoZXJlIGlzIG5vIHBvaW50IGluIHN1cGVyc2VkaW5nIHRoZWlyIGJ1c2luZXNzIGxvZ2ljXG4gICAqIHdpdGggb3VyIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAqXG4gICAqIElmIGZhbHNlLCB0aGUgd2l6YXJkIHdpbGwgZXhlY3V0ZSBkZWZhdWx0IGNoZWNrcyBhbmQgZW1pdCBldmVudHMgYXMgbm9ybWFsLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3VzdG9tIGJ1dHRvbnMgb3IgcHJvZ3JhbW1hdGljIHdvcmtmbG93cyB0aGF0IGFyZSBub3RcbiAgICogZXhlY3V0aW5nIHRoZSB3aXphcmRzIGRlZmF1bHQgY2hlY2tzIGFuZCBlbWlzc2lvbnMuIEl0IGlzIGFub3RoZXIgd2F5IHRvXG4gICAqIG5hdmlnYXRlIHdpdGhvdXQgaGF2aW5nIHRvIHJld3JpdGUgdGhlIHdpemFyZMOiwoDCmXMgZGVmYXVsdCBmdW5jdGlvbmFsaXR5XG4gICAqIGZyb20gc2NyYXRjaC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbmV4dCgpIGRvZXMgbm90IGV4ZWN1dGUgZXZlbnQgZW1pc3Npb25zIG9yIGNoZWNrcyBiZWNhdXNlIHRoZVxuICAgKiA4MCUgY2FzZSBpcyB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFzIHBhcnQgb2YgYW4gYWx0ZXJuYXRpdmVcbiAgICogbmF2aWdhdGlvbiB3aXRoIGNscldpemFyZFByZXZlbnREZWZhdWx0TmV4dC5cbiAgICpcbiAgICogQG5hbWUgbmV4dFxuICAgKiBAbWVtYmVyb2YgQ2xyV2l6YXJkXG4gICAqL1xuICBwdWJsaWMgbmV4dChza2lwQ2hlY2tzQW5kRW1pdHM6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHNraXBDaGVja3NBbmRFbWl0cykge1xuICAgICAgdGhpcy5mb3JjZU5leHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXZTZXJ2aWNlLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5jbHVkZXMgYSBCb29sZWFuIHBhcmFtZXRlciB0aGF0IHdpbGwgc2tpcCBjaGVja3MgYW5kIGV2ZW50IGVtaXNzaW9ucy5cbiAgICogSWYgdHJ1ZSwgdGhlIHdpemFyZCB3aWxsICBjb21wbGV0ZSBhbmQgY2xvc2UgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2ZcbiAgICogaXRzIGN1cnJlbnQgcGFnZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGFsdGVybmF0aXZlIG5hdmlnYXRpb24gd2hlcmUgZXZlbnRcbiAgICogZW1pc3Npb25zIGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUgYW5kIGZpcmluZyB0aGVtIGFnYWluIG1heSBjYXVzZSBhbiBldmVudCBsb29wLlxuICAgKlxuICAgKiBJZiBmYWxzZSwgdGhlIHdpemFyZCB3aWxsIGV4ZWN1dGUgZGVmYXVsdCBjaGVja3MgYW5kIGVtaXQgZXZlbnRzIGJlZm9yZVxuICAgKiBjb21wbGV0aW5nIGFuZCBjbG9zaW5nLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBmaW5pc2goKSBkb2VzIG5vdCBleGVjdXRlIGV2ZW50IGVtaXNzaW9ucyBvciBjaGVja3MgYmVjYXVzZSB0aGVcbiAgICogODAlIGNhc2UgaXMgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIGFuIGFsdGVybmF0aXZlXG4gICAqIG5hdmlnYXRpb24gd2l0aCBjbHJXaXphcmRQcmV2ZW50RGVmYXVsdE5leHQuXG4gICAqXG4gICAqIEBuYW1lIGZpbmlzaFxuICAgKiBAbWVtYmVyb2YgQ2xyV2l6YXJkXG4gICAqL1xuICBwdWJsaWMgZmluaXNoKHNraXBDaGVja3NBbmRFbWl0czogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoc2tpcENoZWNrc0FuZEVtaXRzKSB7XG4gICAgICB0aGlzLmZvcmNlRmluaXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmF2U2VydmljZS5maW5pc2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyB0aGUgd29yayBvZiBmaW5pc2hpbmcgdXAgdGhlIHdpemFyZCBhbmQgY2xvc2luZyBpdCBidXQgZG9lc24ndCBkbyB0aGVcbiAgICogY2hlY2tzIGFuZCBlbWlzc2lvbnMgdGhhdCBvdGhlciBwYXRocyBkby4gR29vZCBmb3IgYSBsYXN0IHN0ZXAgaW4gYW5cbiAgICogYWx0ZXJuYXRlIHdvcmtmbG93LlxuICAgKlxuICAgKiBEb2VzIHRoZSBzYW1lIHRoaW5nIGFzIGNhbGxpbmcgQ2xyV2l6YXJkLmZpbmlzaCh0cnVlKSBvciBDbHJXaXphcmQuZmluaXNoKClcbiAgICogd2l0aG91dCBhIHBhcmFtZXRlci5cbiAgICpcbiAgICogQG5hbWUgZm9yY2VGaW5pc2hcbiAgICogQG1lbWJlcm9mIENscldpemFyZFxuICAgKi9cbiAgcHVibGljIGZvcmNlRmluaXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0b3BOYXZpZ2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgdGhlIHdvcmsgb2YgbW92aW5nIHRoZSB3aXphcmQgdG8gdGhlIG5leHQgcGFnZSB3aXRob3V0IHRoZVxuICAgKiBjaGVja3MgYW5kIGVtaXNzaW9ucyB0aGF0IG90aGVyIHBhdGhzIGRvLiBHb29kIGZvciBhIGxhc3Qgc3RlcCBpbiBhblxuICAgKiBhbHRlcm5hdGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgY2FsbGluZyBDbHJXaXphcmQubmV4dCh0cnVlKSBvciBDbHJXaXphcmQubmV4dCgpXG4gICAqIHdpdGhvdXQgYSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBuYW1lIGZvcmNlTmV4dFxuICAgKiBAbWVtYmVyb2YgQ2xyV2l6YXJkXG4gICAqL1xuICBwdWJsaWMgZm9yY2VOZXh0KCk6IHZvaWQge1xuICAgIHRoaXMubmF2U2VydmljZS5mb3JjZU5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW5jZWxzIGFuZCBjbG9zZXMgdGhlIHdpemFyZC5cbiAgICpcbiAgICogRG8gbm90IHVzZSB0aGlzIGZvciBhbiBvdmVycmlkZSBvZiB0aGUgY2FuY2VsIHRoZSBmdW5jdGlvbmFsaXR5XG4gICAqIHdpdGggY2xyV2l6YXJkUHJldmVudERlZmF1bHRDYW5jZWwsIGNscldpemFyZFByZXZlbnRQYWdlRGVmYXVsdENhbmNlbCxcbiAgICogb3IgY2xyV2l6YXJkUGFnZVByZXZlbnREZWZhdWx0IGJlY2F1c2UgaXQgd2lsbCBpbml0aWF0ZSB0aGUgc2FtZSBjaGVja3NcbiAgICogYW5kIGV2ZW50IGVtaXNzaW9ucyB0aGF0IGludm9rZWQgeW91ciBldmVudCBoYW5kbGVyLlxuICAgKlxuICAgKiBVc2UgQ2xyV2l6YXJkLmNsb3NlKCkgaW5zdGVhZC5cbiAgICpcbiAgICogQG5hbWUgY2FuY2VsXG4gICAqIEBtZW1iZXJvZiBDbHJXaXphcmRcbiAgICovXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5uYXZTZXJ2aWNlLmNhbmNlbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBiZWhhdmlvciBvZiB0aGUgdW5kZXJseWluZyBtb2RhbCB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGhcbiAgICogYWx0ZXJuYXRpdmUgY2FuY2VsIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEluIG1vc3QgY2FzZXMsIHVzZSBDbHJXaXphcmQuY2FuY2VsKCkgaW5zdGVhZC5cbiAgICpcbiAgICogQG5hbWUgbW9kYWxDYW5jZWxcbiAgICogQG1lbWJlcm9mIENscldpemFyZFxuICAgKi9cbiAgcHVibGljIG1vZGFsQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tBbmRDYW5jZWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIGFsdGVybmF0aXZlIGNhbmNlbCBmbG93cyBkZWZpbmVkIGF0IHRoZSBjdXJyZW50IHBhZ2Ugb3JcbiAgICogd2l6YXJkIGxldmVsLiBQZXJmb3JtcyBhIGNhbmNlbGVkIGlmIG5vdC4gRW1pdHMgZXZlbnRzIHRoYXQgaW5pdGlhdGVcbiAgICogdGhlIGFsdGVybmF0aXZlIGNhbmNlbCBvdXRwdXRzIChjbHJXaXphcmRQYWdlT25DYW5jZWwgYW5kXG4gICAqIGNscldpemFyZE9uQ2FuY2VsKSBpZiBzby5cbiAgICpcbiAgICogQG5hbWUgY2hlY2tBbmRDYW5jZWxcbiAgICogQG1lbWJlcm9mIENscldpemFyZFxuICAgKi9cbiAgcHVibGljIGNoZWNrQW5kQ2FuY2VsKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBjb25zdCBjdXJyZW50UGFnZUhhc092ZXJyaWRlcyA9IGN1cnJlbnRQYWdlLnN0b3BDYW5jZWwgfHwgY3VycmVudFBhZ2UucHJldmVudERlZmF1bHQ7XG5cbiAgICBpZiAodGhpcy5zdG9wTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN1cnJlbnRQYWdlLnBhZ2VPbkNhbmNlbC5lbWl0KCk7XG4gICAgaWYgKCFjdXJyZW50UGFnZUhhc092ZXJyaWRlcykge1xuICAgICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0b3BDYW5jZWwgJiYgIWN1cnJlbnRQYWdlSGFzT3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgdGhlIHdpemFyZCBJRCBhcyBhIHN0cmluZyBwYXJhbWV0ZXIgYW5kIGNhbGxzIHRvIFdpemFyZE5hdmlnYXRpb25TZXJ2aWNlXG4gICAqIHRvIG5hdmlnYXRlIHRvIHRoZSBwYWdlIHdpdGggdGhhdCBJRC4gTmF2aWdhdGlvbiB3aWxsIGludm9rZSB0aGUgd2l6YXJkw6LCgMKZcyBkZWZhdWx0XG4gICAqIGNoZWNrcyBhbmQgZXZlbnQgZW1pc3Npb25zLlxuICAgKlxuICAgKiBQcm9iYWJseSBsZXNzIHVzZWZ1bCB0aGFuIGNhbGxpbmcgZGlyZWN0bHkgdG8gQ2xyV2l6YXJkLm5hdlNlcnZpY2UuZ29UbygpIGJlY2F1c2UgdGhlXG4gICAqIG5hdiBzZXJ2aWNlIG1ldGhvZCBjYW4gYWNjZXB0IGVpdGhlciBhIHN0cmluZyBJRCBvciBhIHBhZ2Ugb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBleHBlY3RlZCBJRCBwYXJhbWV0ZXIgY2FuIGJlIGZvdW5kIGluIHRoZSByZXR1cm4gb2YgdGhlXG4gICAqIENscldpemFyZFBhZ2UuaWQgZ2V0dGVyLCB1c3VhbGx5IHByZWZpeGVkIHdpdGggw6LCgMKcY2xyLXdpemFyZC1wYWdlLcOiwoDCnCBhbmQgdGhlbiBlaXRoZXIgYVxuICAgKiBudW1lcmljIElEIG9yIHRoZSBJRCBzcGVjaWZpZWQgZm9yIHRoZSBDbHJXaXphcmRQYWdlIGNvbXBvbmVudMOiwoDCmXMgw6LCgMKcaWTDosKAwp0gaW5wdXQuXG4gICAqXG4gICAqIEBuYW1lIGdvVG9cbiAgICpcbiAgICogQG1lbWJlcm9mIENscldpemFyZFxuICAgKi9cbiAgcHVibGljIGdvVG8ocGFnZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXBhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubmF2U2VydmljZS5nb1RvKHBhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRvIFBhZ2VDb2xsZWN0aW9uU2VydmljZS5yZXNldCgpIGFuZCBlbWl0cyB0aGVcbiAgICogQ2xyV2l6YXJkLm9uUmVzZXQgZXZlbnQuXG4gICAqXG4gICAqIFJlc2V0IHNldHMgYWxsIFdpemFyZFBhZ2VzIHRvIGluY29tcGxldGUgYW5kIHNldHMgdGhlIGZpcnN0IHBhZ2UgaW4gdGhlIENscldpemFyZCB0b1xuICAgKiBiZSB0aGUgY3VycmVudCBwYWdlLCBlc3NlbnRpYWxseSByZXNldHRpbmcgdGhlIHdpemFyZCBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBVc2VycyB3b3VsZCB0aGVuIHVzZSB0aGUgb25SZXNldCBldmVudCB0byByZXNldCB0aGUgZGF0YSBvciBtb2RlbCBpbiB0aGVpclxuICAgKiBob3N0IGNvbXBvbmVudC5cbiAgICpcbiAgICogSXQgY291bGQgYmUgdXNlZnVsIHRvIGNhbGwgYSByZXNldCB3aXRob3V0IGZpcmluZyB0aGUgb25SZXNldCBldmVudC4gVG8gZG8gdGhpcyxcbiAgICoganVzdCBjYWxsIENscldpemFyZC5wYWdlQ29sbGVjdGlvbi5yZXNldCgpIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAbmFtZSByZXNldFxuICAgKiBAbWVtYmVyb2YgQ2xyV2l6YXJkXG4gICAqL1xuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5wYWdlQ29sbGVjdGlvbi5yZXNldCgpO1xuICAgIHRoaXMub25SZXNldC5uZXh0KCk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQnV0dG9uSHViU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2J1dHRvbi1odWIuc2VydmljZSc7XG5pbXBvcnQgeyBXaXphcmROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL3dpemFyZC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9CVVRUT05fVFlQRVM6IGFueSA9IHtcbiAgY2FuY2VsOiAnY2FuY2VsJyxcbiAgcHJldmlvdXM6ICdwcmV2aW91cycsXG4gIG5leHQ6ICduZXh0JyxcbiAgZmluaXNoOiAnZmluaXNoJyxcbiAgZGFuZ2VyOiAnZGFuZ2VyJyxcbn07XG5cbmV4cG9ydCBjb25zdCBDVVNUT01fQlVUVE9OX1RZUEVTOiBhbnkgPSB7XG4gIGNhbmNlbDogJ2N1c3RvbS1jYW5jZWwnLFxuICBwcmV2aW91czogJ2N1c3RvbS1wcmV2aW91cycsXG4gIG5leHQ6ICdjdXN0b20tbmV4dCcsXG4gIGZpbmlzaDogJ2N1c3RvbS1maW5pc2gnLFxuICBkYW5nZXI6ICdjdXN0b20tZGFuZ2VyJyxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci13aXphcmQtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBjbHItd2l6YXJkLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYnRuLWxpbmtdPVwiaXNDYW5jZWxcIlxuICAgICAgICAgICAgW2NsYXNzLmNsci13aXphcmQtYnRuLS10ZXJ0aWFyeV09XCJpc0NhbmNlbFwiXG4gICAgICAgICAgICBbY2xhc3MuYnRuLW91dGxpbmVdPVwiaXNQcmV2aW91c1wiXG4gICAgICAgICAgICBbY2xhc3MuY2xyLXdpemFyZC1idG4tLXNlY29uZGFyeV09XCJpc1ByZXZpb3VzXCJcbiAgICAgICAgICAgIFtjbGFzcy5idG4tcHJpbWFyeV09XCJpc1ByaW1hcnlBY3Rpb25cIlxuICAgICAgICAgICAgW2NsYXNzLmNsci13aXphcmQtYnRuLS1wcmltYXJ5XT1cImlzUHJpbWFyeUFjdGlvblwiXG4gICAgICAgICAgICBbY2xhc3MuYnRuLXN1Y2Nlc3NdPVwiaXNGaW5pc2hcIlxuICAgICAgICAgICAgW2NsYXNzLmJ0bi1kYW5nZXJdPVwiaXNEYW5nZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiX2Rpc2FibGVkQXR0cmlidXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGljaygpXCI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIGAsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjbHItd2l6YXJkLWJ0bi13cmFwcGVyJywgJ1thdHRyLmFyaWEtaGlkZGVuXSc6ICdpc0hpZGRlbicgfSxcbiAgc3R5bGVzOiBbJ1thcmlhLWhpZGRlbj1cInRydWVcIl0geyBkaXNwbGF5OiBub25lOyB9J10sXG59KVxuZXhwb3J0IGNsYXNzIENscldpemFyZEJ1dHRvbiB7XG4gIEBJbnB1dCgndHlwZScpIHB1YmxpYyB0eXBlOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoJ2NscldpemFyZEJ1dHRvbkRpc2FibGVkJykgcHVibGljIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCdjbHJXaXphcmRCdXR0b25IaWRkZW4nKSBwdWJsaWMgaGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRXZlbnRFbWl0dGVyIHdoaWNoIGlzIGVtaXR0ZWQgd2hlbiBhIGJ1dHRvbiBpcyBjbGlja2VkLlxuICBAT3V0cHV0KCdjbHJXaXphcmRCdXR0b25DbGlja2VkJykgd2FzQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYXZTZXJ2aWNlOiBXaXphcmROYXZpZ2F0aW9uU2VydmljZSwgcHVibGljIGJ1dHRvblNlcnZpY2U6IEJ1dHRvbkh1YlNlcnZpY2UpIHt9XG5cbiAgcHJpdmF0ZSBjaGVja0RlZmF1bHRBbmRDdXN0b21UeXBlKHZhbHVlVG9DaGVjazogc3RyaW5nID0gJycsIHR5cGVUb0xvb2tVcDogc3RyaW5nKSB7XG4gICAgaWYgKERFRkFVTFRfQlVUVE9OX1RZUEVTW3R5cGVUb0xvb2tVcF0gPT09IHZhbHVlVG9DaGVjaykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDVVNUT01fQlVUVE9OX1RZUEVTW3R5cGVUb0xvb2tVcF0gPT09IHZhbHVlVG9DaGVjaykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDYW5jZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tEZWZhdWx0QW5kQ3VzdG9tVHlwZSh0aGlzLnR5cGUsICdjYW5jZWwnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNOZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrRGVmYXVsdEFuZEN1c3RvbVR5cGUodGhpcy50eXBlLCAnbmV4dCcpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXZpb3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrRGVmYXVsdEFuZEN1c3RvbVR5cGUodGhpcy50eXBlLCAncHJldmlvdXMnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGaW5pc2goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tEZWZhdWx0QW5kQ3VzdG9tVHlwZSh0aGlzLnR5cGUsICdmaW5pc2gnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNEYW5nZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tEZWZhdWx0QW5kQ3VzdG9tVHlwZSh0aGlzLnR5cGUsICdkYW5nZXInKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmltYXJ5QWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTmV4dCB8fCB0aGlzLmlzRGFuZ2VyIHx8IHRoaXMuaXNGaW5pc2g7XG4gIH1cblxuICBwdWJsaWMgZ2V0IF9kaXNhYmxlZEF0dHJpYnV0ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIGRlYWxpbmcgd2l0aCBuZWdhdGl2ZXMgaGVyZS4gY29nbml0aXZlbHkgZWFzaWVyIHRvIHRoaW5rIG9mIGl0IGxpa2UgdGhpcy4uLlxuICAgIGNvbnN0IGRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBuYXYgPSB0aGlzLm5hdlNlcnZpY2U7XG4gICAgY29uc3QgcGFnZSA9IHRoaXMubmF2U2VydmljZS5jdXJyZW50UGFnZTtcblxuICAgIC8vIEVuc3VyZSB3ZSBkb24ndCBjaGFuZ2UgdGhlIHJlc3BvbnNlIHVudGlsIGJ1dHRvbnMgYXJlIHJlYWR5IHRvIGF2b2lkIGNob2NvbGF0ZVxuICAgIGlmICghdGhpcy5idXR0b25TZXJ2aWNlLmJ1dHRvbnNSZWFkeSkge1xuICAgICAgcmV0dXJuICFkaXNhYmxlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBuYXYud2l6YXJkU3RvcE5hdmlnYXRpb24gfHwgIXBhZ2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2FuY2VsKSB7XG4gICAgICByZXR1cm4gIWRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUHJldmlvdXMgJiYgKG5hdi5jdXJyZW50UGFnZUlzRmlyc3QgfHwgcGFnZS5wcmV2aW91c1N0ZXBEaXNhYmxlZCkpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0RhbmdlciAmJiAhcGFnZS5yZWFkeVRvQ29tcGxldGUpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05leHQgJiYgKG5hdi5jdXJyZW50UGFnZUlzTGFzdCB8fCAhcGFnZS5yZWFkeVRvQ29tcGxldGUpKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNGaW5pc2ggJiYgKCFuYXYuY3VycmVudFBhZ2VJc0xhc3QgfHwgIXBhZ2UucmVhZHlUb0NvbXBsZXRlKSkge1xuICAgICAgcmV0dXJuIGRpc2FibGVkO1xuICAgIH1cblxuICAgIHJldHVybiAhZGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIC8vIGRlYWxpbmcgd2l0aCBuZWdhdGl2ZXMgaGVyZS4gY29nbml0aXZlbHkgZWFzaWVyIHRvIHRoaW5rIG9mIGl0IGxpa2UgdGhpcy4uLlxuICAgIGNvbnN0IGhpZGRlbiA9IHRydWU7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZTZXJ2aWNlO1xuXG4gICAgLy8gRW5zdXJlIHdlIGRvbid0IGNoYW5nZSB0aGUgcmVzcG9uc2UgdW50aWwgYnV0dG9ucyBhcmUgcmVhZHkgdG8gYXZvaWQgY2hvY29sYXRlXG4gICAgaWYgKCF0aGlzLmJ1dHRvblNlcnZpY2UuYnV0dG9uc1JlYWR5KSB7XG4gICAgICByZXR1cm4gIWhpZGRlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRkZW4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2FuY2VsKSB7XG4gICAgICByZXR1cm4gIWhpZGRlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1ByZXZpb3VzICYmIG5hdi5jdXJyZW50UGFnZUlzRmlyc3QpIHtcbiAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXh0ICYmIG5hdi5jdXJyZW50UGFnZUlzTGFzdCkge1xuICAgICAgcmV0dXJuIGhpZGRlbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZpbmlzaCAmJiAhbmF2LmN1cnJlbnRQYWdlSXNMYXN0KSB7XG4gICAgICByZXR1cm4gaGlkZGVuO1xuICAgIH1cblxuICAgIHJldHVybiAhaGlkZGVuO1xuICB9XG5cbiAgY2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMud2FzQ2xpY2tlZC5lbWl0KHRoaXMudHlwZSk7XG4gICAgdGhpcy5idXR0b25TZXJ2aWNlLmJ1dHRvbkNsaWNrZWQodGhpcy50eXBlKTtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnY2xyLXdpemFyZC10aXRsZSwgY2xyLXdpemFyZC1wYWdldGl0bGUnIH0pXG5leHBvcnQgY2xhc3MgQ2xyV2l6YXJkQ3VzdG9tVGFncyB7XG4gIC8vIE5vIGJlaGF2aW9yXG4gIC8vIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gXCJkZWNsYXJlXCIgdGhlIHRhZyBpbiBBbmd1bGFyXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvcGFnZS1jb2xsZWN0aW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbHItd2l6YXJkLXN0ZXBuYXYnLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgICA8b2wgY2xhc3M9XCJjbHItd2l6YXJkLXN0ZXBuYXYtbGlzdFwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZVNlcnZpY2UucGFnZXNcIiBjbHItd2l6YXJkLXN0ZXBuYXYtaXRlbSBcbiAgICAgICAgICAgIFtwYWdlXT1cInBhZ2VcIiBjbGFzcz1cImNsci13aXphcmQtc3RlcG5hdi1pdGVtXCI+PC9saT5cbiAgICAgICAgPC9vbD5cbiAgICBgLFxuICBob3N0OiB7IGNsYXNzOiAnY2xyLXdpemFyZC1zdGVwbmF2JyB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJXaXphcmRTdGVwbmF2IHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhZ2VTZXJ2aWNlOiBQYWdlQ29sbGVjdGlvblNlcnZpY2UpIHt9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUGFnZUNvbGxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvcGFnZS1jb2xsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2l6YXJkTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Byb3ZpZGVycy93aXphcmQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENscldpemFyZFBhZ2UgfSBmcm9tICcuL3dpemFyZC1wYWdlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW2Nsci13aXphcmQtc3RlcG5hdi1pdGVtXScsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGNsci13aXphcmQtc3RlcG5hdi1saW5rXCIgKGNsaWNrKT1cImNsaWNrKClcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJwYWdlLm5hdlRpdGxlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgYCxcbiAgaG9zdDoge1xuICAgICdbaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIuYXJpYS1zZWxlY3RlZF0nOiAnaXNDdXJyZW50JyxcbiAgICAnW2F0dHIuYXJpYS1jb250cm9sc10nOiAnaWQnLFxuICAgIHJvbGU6ICd0YWInLFxuICAgICdbY2xhc3MuY2xyLW5hdi1saW5rXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLm5hdi1pdGVtXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmFjdGl2ZV0nOiAnaXNDdXJyZW50JyxcbiAgICAnW2NsYXNzLmRpc2FibGVkXSc6ICdpc0Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLm5vLWNsaWNrXSc6ICchY2FuTmF2aWdhdGUnLFxuICAgICdbY2xhc3MuY29tcGxldGVdJzogJ2lzQ29tcGxldGUnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDbHJXaXphcmRTdGVwbmF2SXRlbSB7XG4gIEBJbnB1dCgncGFnZScpIHB1YmxpYyBwYWdlOiBDbHJXaXphcmRQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYXZTZXJ2aWNlOiBXaXphcmROYXZpZ2F0aW9uU2VydmljZSwgcHVibGljIHBhZ2VDb2xsZWN0aW9uOiBQYWdlQ29sbGVjdGlvblNlcnZpY2UpIHt9XG5cbiAgcHJpdmF0ZSBwYWdlR3VhcmQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2l6YXJkIHN0ZXBuYXYgaXRlbSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgd2l6YXJkIHBhZ2UuJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHRoaXMucGFnZUd1YXJkKCk7XG4gICAgcmV0dXJuIHRoaXMucGFnZUNvbGxlY3Rpb24uZ2V0U3RlcEl0ZW1JZEZvclBhZ2UodGhpcy5wYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLnBhZ2VHdWFyZCgpO1xuICAgIHJldHVybiB0aGlzLnBhZ2UuZGlzYWJsZWQgfHwgdGhpcy5uYXZTZXJ2aWNlLndpemFyZFN0b3BOYXZpZ2F0aW9uIHx8IHRoaXMubmF2U2VydmljZS53aXphcmREaXNhYmxlU3RlcG5hdjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucGFnZUd1YXJkKCk7XG4gICAgcmV0dXJuIHRoaXMucGFnZS5jdXJyZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucGFnZUd1YXJkKCk7XG4gICAgcmV0dXJuIHRoaXMucGFnZS5jb21wbGV0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhbk5hdmlnYXRlKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucGFnZUd1YXJkKCk7XG4gICAgcmV0dXJuIHRoaXMucGFnZUNvbGxlY3Rpb24ucHJldmlvdXNQYWdlSXNDb21wbGV0ZWQodGhpcy5wYWdlKTtcbiAgfVxuXG4gIGNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMucGFnZUd1YXJkKCk7XG5cbiAgICAvLyBpZiB3ZSBjbGljayBvbiBvdXIgb3duIHN0ZXBuYXYgb3IgYSBkaXNhYmxlZCBzdGVwbmF2LCB3ZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCB8fCB0aGlzLmlzQ3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubmF2U2VydmljZS5nb1RvKHRoaXMucGFnZSk7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCBWTXdhcmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckFsZXJ0TW9kdWxlIH0gZnJvbSAnLi4vZW1waGFzaXMvYWxlcnQvYWxlcnQubW9kdWxlJztcbmltcG9ydCB7IENsck1vZGFsTW9kdWxlIH0gZnJvbSAnLi4vbW9kYWwvbW9kYWwubW9kdWxlJztcblxuaW1wb3J0IHsgQ2xyV2l6YXJkIH0gZnJvbSAnLi93aXphcmQnO1xuaW1wb3J0IHsgQ2xyV2l6YXJkQnV0dG9uIH0gZnJvbSAnLi93aXphcmQtYnV0dG9uJztcbmltcG9ydCB7IENscldpemFyZEN1c3RvbVRhZ3MgfSBmcm9tICcuL3dpemFyZC1jdXN0b20tdGFncyc7XG5pbXBvcnQgeyBDbHJXaXphcmRIZWFkZXJBY3Rpb24gfSBmcm9tICcuL3dpemFyZC1oZWFkZXItYWN0aW9uJztcbmltcG9ydCB7IENscldpemFyZFBhZ2UgfSBmcm9tICcuL3dpemFyZC1wYWdlJztcbmltcG9ydCB7IENscldpemFyZFBhZ2VCdXR0b25zIH0gZnJvbSAnLi93aXphcmQtcGFnZS1idXR0b25zJztcbmltcG9ydCB7IENscldpemFyZFBhZ2VIZWFkZXJBY3Rpb25zIH0gZnJvbSAnLi93aXphcmQtcGFnZS1oZWFkZXItYWN0aW9ucyc7XG5pbXBvcnQgeyBDbHJXaXphcmRQYWdlTmF2VGl0bGUgfSBmcm9tICcuL3dpemFyZC1wYWdlLW5hdnRpdGxlJztcbmltcG9ydCB7IENscldpemFyZFBhZ2VUaXRsZSB9IGZyb20gJy4vd2l6YXJkLXBhZ2UtdGl0bGUnO1xuaW1wb3J0IHsgQ2xyV2l6YXJkU3RlcG5hdiB9IGZyb20gJy4vd2l6YXJkLXN0ZXBuYXYnO1xuaW1wb3J0IHsgQ2xyV2l6YXJkU3RlcG5hdkl0ZW0gfSBmcm9tICcuL3dpemFyZC1zdGVwbmF2LWl0ZW0nO1xuXG5leHBvcnQgY29uc3QgQ0xSX1dJWkFSRF9ESVJFQ1RJVkVTOiBhbnlbXSA9IFtcbiAgQ2xyV2l6YXJkLFxuICBDbHJXaXphcmRQYWdlLFxuICBDbHJXaXphcmRTdGVwbmF2LFxuICBDbHJXaXphcmRTdGVwbmF2SXRlbSxcbiAgQ2xyV2l6YXJkQnV0dG9uLFxuICBDbHJXaXphcmRIZWFkZXJBY3Rpb24sXG4gIENscldpemFyZEN1c3RvbVRhZ3MsXG4gIENscldpemFyZFBhZ2VUaXRsZSxcbiAgQ2xyV2l6YXJkUGFnZU5hdlRpdGxlLFxuICBDbHJXaXphcmRQYWdlQnV0dG9ucyxcbiAgQ2xyV2l6YXJkUGFnZUhlYWRlckFjdGlvbnMsXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDbHJNb2RhbE1vZHVsZSwgQ2xyQWxlcnRNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtDTFJfV0laQVJEX0RJUkVDVElWRVNdLFxuICBleHBvcnRzOiBbQ0xSX1dJWkFSRF9ESVJFQ1RJVkVTXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyV2l6YXJkTW9kdWxlIHt9XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDbHJCdXR0b25Nb2R1bGUgfSBmcm9tICcuL2J1dHRvbi9idXR0b24ubW9kdWxlJztcbmltcG9ydCB7IENsckRhdGFNb2R1bGUgfSBmcm9tICcuL2RhdGEvZGF0YS5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyRHJhZ0FuZERyb3BNb2R1bGUgfSBmcm9tICcuL3V0aWxzL2RyYWctYW5kLWRyb3AvZHJhZy1hbmQtZHJvcC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyRW1waGFzaXNNb2R1bGUgfSBmcm9tICcuL2VtcGhhc2lzL2VtcGhhc2lzLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJGb3Jtc01vZHVsZSB9IGZyb20gJy4vZm9ybXMvZm9ybXMubW9kdWxlJztcbmltcG9ydCB7IENsckljb25Nb2R1bGUgfSBmcm9tICcuL2ljb24vaWNvbi5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyTGF5b3V0TW9kdWxlIH0gZnJvbSAnLi9sYXlvdXQvbGF5b3V0Lm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJNb2RhbE1vZHVsZSB9IGZyb20gJy4vbW9kYWwvbW9kYWwubW9kdWxlJztcbmltcG9ydCB7IENsclBvcG92ZXJNb2R1bGUgfSBmcm9tICcuL3BvcG92ZXIvcG9wb3Zlci5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyQ29uZGl0aW9uYWxNb2R1bGUgfSBmcm9tICcuL3V0aWxzL2NvbmRpdGlvbmFsL2NvbmRpdGlvbmFsLm1vZHVsZSc7XG5pbXBvcnQgeyBDbHJJZkV4cGFuZE1vZHVsZSB9IGZyb20gJy4vdXRpbHMvZXhwYW5kL2lmLWV4cGFuZC5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyRm9jdXNUcmFwTW9kdWxlIH0gZnJvbSAnLi91dGlscy9mb2N1cy10cmFwL2ZvY3VzLXRyYXAubW9kdWxlJztcbmltcG9ydCB7IENsckxvYWRpbmdNb2R1bGUgfSBmcm9tICcuL3V0aWxzL2xvYWRpbmcvbG9hZGluZy5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyV2l6YXJkTW9kdWxlIH0gZnJvbSAnLi93aXphcmQvd2l6YXJkLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtcbiAgICBDbHJFbXBoYXNpc01vZHVsZSxcbiAgICBDbHJEYXRhTW9kdWxlLFxuICAgIENsckljb25Nb2R1bGUsXG4gICAgQ2xyTW9kYWxNb2R1bGUsXG4gICAgQ2xyTG9hZGluZ01vZHVsZSxcbiAgICBDbHJJZkV4cGFuZE1vZHVsZSxcbiAgICBDbHJDb25kaXRpb25hbE1vZHVsZSxcbiAgICBDbHJGb2N1c1RyYXBNb2R1bGUsXG4gICAgQ2xyQnV0dG9uTW9kdWxlLFxuICAgIENsckZvcm1zTW9kdWxlLFxuICAgIENsckxheW91dE1vZHVsZSxcbiAgICBDbHJQb3BvdmVyTW9kdWxlLFxuICAgIENscldpemFyZE1vZHVsZSxcbiAgICBDbHJEcmFnQW5kRHJvcE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xhcml0eU1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuLyoqXG4gKiBQcml2YXRlIGNvdW50ZXIgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcyBmb3IgdGhlIGNoZWNrYm94ZXMsIHRvIGJpbmQgdGhlIGxhYmVscyB0byB0aGVtLlxuICovXG5sZXQgbGF0ZXN0SWQgPSAwO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIENsckNoZWNrYm94IHdpbGwgYmUgcmVuYW1lZCB0byBDbHJDaGVja2JveERlcHJlY2F0ZWQgaW4gMC4xMiwgYW5kIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIG5ld1xuICogaW1wbGVtZW50YXRpb24gaW4gMC4xMywgc28gaWYgeW91IGltcG9ydCBpdCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB5b3VyIHJlZmVyZW5jZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1jaGVja2JveCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgICAgIDwhLS1cbiAgICAgICAgICAgIEZJWE1FOiBXZSBhcmUgbm90IHN1YnNjcmliZWQgdG8gdGhlIGNoYW5nZSBldmVudCBidXQgdGhlIGNsaWNrIGV2ZW50IGhlcmUuXG4gICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGF0IGlzIGJlY2F1c2UgY2hlY2tib3hlcyBiZWhhdmUgZGlmZmVyZW50bHkgb24gSUUgJiBFZGdlLlxuICAgICAgICAgICAgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5NDQ3OTM5XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFRvIGZpeCB0aGF0LCB3ZSBsaXN0ZW4gdG8gZXZlcnkgY2xpY2sgZXZlbnQgYW5kIHRoZW4gdG9nZ2xlIHRoZSBjaGVja2JveCBtYW51YWxseVxuICAgICAgICAgICAgdG8gbWFrZSBpdCBiZWhhdmUgdGhlIHNhbWUgd2F5IGFjcm9zcyB0aGUgYnJvd3NlcnMgd2Ugc3VwcG9ydC5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgVGhpcyB3b3JrcyBmb3IgY2FzZXMgd2hlbiB1c2VycyB0b2dnbGUgdGhlIGNoZWNrYm94IHVzaW5nIHRoZSBrZXlib2FyZCB0b286XG4gICAgICAgICAgICBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNzg3ODk0MC9zcGFjZWJhci10cmlnZ2VyaW5nLWNsaWNrLWV2ZW50LW9uLWNoZWNrYm94XG4gICAgICAgIC0tPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImNsckFyaWFMYWJlbGVkQnlcIlxuICAgICAgICAgICAgICAgW2lkXT1cImlkXCIgW25hbWVdPVwibmFtZVwiIFtjaGVja2VkXT1cImNoZWNrZWRcIlxuICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaW5kZXRlcm1pbmF0ZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAoYmx1cik9XCJ0b3VjaCgpXCIgKGNsaWNrKT1cImNoZWNrSW5kZXRlcm1pbmF0ZVN0YXRlKClcIj5cbiAgICAgICAgPGxhYmVsIFthdHRyLmZvcl09XCJpZFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2xhYmVsPlxuICAgIGAsXG4gIGhvc3Q6IHsgJ1tjbGFzcy5jaGVja2JveF0nOiAnIWlubGluZScsICdbY2xhc3MuY2hlY2tib3gtaW5saW5lXSc6ICdpbmxpbmUnLCAnW2NsYXNzLmRpc2FibGVkXSc6ICdkaXNhYmxlZCcgfSxcbiAgLypcbiAgICAgKiBUaGlzIHByb3ZpZGVyIGxldHMgdXMgZGVjbGFyZSBvdXIgY2hlY2tib3ggYXMgYSBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICAgKiB3aGljaCBhbGxvd3MgdXMgdG8gdXNlIFsobmdNb2RlbCldIGRpcmVjdGx5IG9uIG91ciBjb21wb25lbnQsXG4gICAgICogd2l0aCBhbGwgdGhlIGF1dG9tYXRpYyBmZWF0dXJlcyB3aXJpbmcgdGhhdCBjb21lIHdpdGggaXQuXG4gICAgICovXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENsckNoZWNrYm94RGVwcmVjYXRlZCksIG11bHRpOiB0cnVlIH1dLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJDaGVja2JveERlcHJlY2F0ZWQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIC8vIElmIG91ciBob3N0IGhhcyBhbiBJRCBhdHRyaWJ1dGUsIHdlIHVzZSB0aGlzIGluc3RlYWQgb2Ygb3VyIGluZGV4LlxuICBASW5wdXQoJ2lkJykgX2lkOiBzdHJpbmcgPSAobGF0ZXN0SWQrKykudG9TdHJpbmcoKTtcblxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiBgY2xyLWNoZWNrYm94LSR7dGhpcy5faWR9YDtcbiAgfVxuXG4gIC8vIElmIGhvc3QgcHJvdmlkZXMgYW4gY2xyQXJpYUxhYmVsZWRCeSBpbnB1dCwgd2UgYXBwbHkgaXQgdG8gdGhlIGNoZWNrYm94XG4gIEBJbnB1dCgnY2xyQXJpYUxhYmVsZWRCeScpIHB1YmxpYyBjbHJBcmlhTGFiZWxlZEJ5OiBzdHJpbmcgPSBudWxsO1xuXG4gIC8vIElmIG91ciBob3N0IGhhcyBhIG5hbWUgYXR0cmlidXRlLCB3ZSBhcHBseSBpdCB0byB0aGUgY2hlY2tib3guXG4gIEBJbnB1dCgnbmFtZScpIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBudWxsO1xuXG4gIC8vIElmIHRoZSBob3N0IGlzIGRpc2FibGVkIHdlIGFwcGx5IGl0IHRvIHRoZSBjaGVja2JveFxuICBASW5wdXQoJ2NsckRpc2FibGVkJykgcHVibGljIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gU3VwcG9ydCBmb3IgaW5saW5lIGNoZWNrYm94ZXMsIGFkZHMgdGhlIG5lY2Vzc2FyeSBjbGFzcyB0byB0aGUgaG9zdFxuICBASW5wdXQoJ2NscklubGluZScpIHB1YmxpYyBpbmxpbmUgPSBmYWxzZTtcblxuICBwcml2YXRlIF9jaGVja2VkID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICB9XG5cbiAgQElucHV0KCdjbHJDaGVja2VkJylcbiAgcHVibGljIHNldCBjaGVja2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9jaGVja2VkKSB7XG4gICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGUoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRDaGVja2VkKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbmRldGVybWluYXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCBpbmRldGVybWluYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9pbmRldGVybWluYXRlO1xuICB9XG5cbiAgQElucHV0KCdjbHJJbmRldGVybWluYXRlJylcbiAgcHVibGljIHNldCBpbmRldGVybWluYXRlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX2luZGV0ZXJtaW5hdGUgIT09IHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5fY2hlY2tlZCkge1xuICAgICAgICB0aGlzLnNldENoZWNrZWQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRJbmRldGVybWluYXRlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCdjbHJJbmRldGVybWluYXRlQ2hhbmdlJylcbiAgcHVibGljIGluZGV0ZXJtaW5hdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgc2V0SW5kZXRlcm1pbmF0ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSB2YWx1ZTtcbiAgICB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2UuZW1pdCh0aGlzLl9pbmRldGVybWluYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NoZWNrZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMuX2NoZWNrZWQpO1xuICB9XG5cbiAgQE91dHB1dCgnY2xyQ2hlY2tlZENoYW5nZScpIHB1YmxpYyBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KGZhbHNlKTtcblxuICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMuY2hlY2tlZCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jaGVja2VkKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgICAqIFRoZXNlIGNhbGxiYWNrcyB3aWxsIGJlIGdpdmVuIHRvIHVzIHRocm91Z2ggdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZSxcbiAgICAgKiBhbmQgd2UgbmVlZCB0byBjYWxsIHRoZW0gd2hlbiB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgY2hlY2tib3guXG4gICAgICovXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjayA9IChfOiBhbnkpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjayA9ICgpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIHB1YmxpYyB0b3VjaCgpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrKCk7XG4gIH1cblxuICBjaGVja0luZGV0ZXJtaW5hdGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2xyQ2hlY2tib3hEZXByZWNhdGVkIH0gZnJvbSAnLi9jaGVja2JveCc7XG5cbmV4cG9ydCBjb25zdCBDTFJfQ0hFQ0tCT1hfRElSRUNUSVZFUzogVHlwZTxhbnk+W10gPSBbQ2xyQ2hlY2tib3hEZXByZWNhdGVkXTtcblxuQE5nTW9kdWxlKHsgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGRlY2xhcmF0aW9uczogW0NMUl9DSEVDS0JPWF9ESVJFQ1RJVkVTXSwgZXhwb3J0czogW0NMUl9DSEVDS0JPWF9ESVJFQ1RJVkVTXSB9KVxuZXhwb3J0IGNsYXNzIENsckNoZWNrYm94RGVwcmVjYXRlZE1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xyRGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJy4uL2Zvcm1zL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5tb2R1bGUnO1xuaW1wb3J0IHsgQ2xyQ2hlY2tib3hEZXByZWNhdGVkTW9kdWxlIH0gZnJvbSAnLi9jaGVja2JveC9jaGVja2JveC5tb2R1bGUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZXhwb3J0czogW0NsckNoZWNrYm94RGVwcmVjYXRlZE1vZHVsZSwgQ2xyRGF0ZXBpY2tlck1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIENsckZvcm1zRGVwcmVjYXRlZE1vZHVsZSB7fVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgYW5pbWF0ZSwgQW5pbWF0aW9uTWV0YWRhdGEsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGFwc2UoKTogQW5pbWF0aW9uTWV0YWRhdGFbXSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgcmV0dXJuIFtcbiAgICBzdGF0ZSgndHJ1ZScsIHN0eWxlKHsgaGVpZ2h0OiAwLCAnb3ZlcmZsb3cteSc6ICdoaWRkZW4nIH0pKSxcbiAgICB0cmFuc2l0aW9uKCd0cnVlID0+IGZhbHNlJywgW2FuaW1hdGUoJzAuMnMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IGhlaWdodDogJyonLCAnb3ZlcmZsb3cteSc6ICdoaWRkZW4nIH0pKV0pLFxuICAgIHRyYW5zaXRpb24oJ2ZhbHNlID0+IHRydWUnLCBbc3R5bGUoeyBoZWlnaHQ6ICcqJywgJ292ZXJmbG93LXknOiAnaGlkZGVuJyB9KSwgYW5pbWF0ZSgnMC4ycyBlYXNlLWluLW91dCcpXSksXG4gIF07XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25NZXRhZGF0YSwgc3R5bGUsIHRyYW5zaXRpb24gfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZhZGUob3BhY2l0eTogbnVtYmVyID0gMSk6IEFuaW1hdGlvbk1ldGFkYXRhW10ge1xuICByZXR1cm4gW1xuICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtzdHlsZSh7IG9wYWNpdHk6IDAgfSksIGFuaW1hdGUoJzAuMnMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IG9wYWNpdHk6IG9wYWNpdHkgfSkpXSksXG4gICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW2FuaW1hdGUoJzAuMnMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpXSksXG4gIF07XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTggVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5pbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25NZXRhZGF0YSwgc3R5bGUsIHRyYW5zaXRpb24gfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVTbGlkZShkaXJlY3Rpb246IHN0cmluZyk6IEFuaW1hdGlvbk1ldGFkYXRhW10ge1xuICBsZXQgdHJhbnNmb3JtOiBzdHJpbmcgPSBudWxsO1xuICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAyNSUpJztcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgIHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgLTI1JSknO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgyNSUsIDApJztcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICB0cmFuc2Zvcm0gPSAndHJhbnNsYXRlKC0yNSUsIDApJztcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZGlyZWN0aW9uICcgKyBkaXJlY3Rpb24gKyAnIGZvciBzbGlkZSBhbmltYXRpb24uJyk7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06IHRyYW5zZm9ybSB9KSwgYW5pbWF0ZSgnMC4ycyBlYXNlLWluLW91dCcpXSksXG4gICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW2FuaW1hdGUoJzAuMnMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogdHJhbnNmb3JtIH0pKV0pLFxuICBdO1xufVxuIiwiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE4IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuaW1wb3J0IHsgYW5pbWF0ZSwgQW5pbWF0aW9uTWV0YWRhdGEsIHN0eWxlLCB0cmFuc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzbGlkZShkaXJlY3Rpb246IHN0cmluZyk6IEFuaW1hdGlvbk1ldGFkYXRhW10ge1xuICBsZXQgdHJhbnNmb3JtOiBzdHJpbmcgPSBudWxsO1xuICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAyNSUpJztcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgIHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgLTI1JSknO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgyNSUsIDApJztcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICB0cmFuc2Zvcm0gPSAndHJhbnNsYXRlKC0yNSUsIDApJztcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZGlyZWN0aW9uICcgKyBkaXJlY3Rpb24gKyAnIGZvciBzbGlkZSBhbmltYXRpb24uJyk7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbc3R5bGUoeyB0cmFuc2Zvcm06IHRyYW5zZm9ybSB9KSwgYW5pbWF0ZSgnMC4ycyBlYXNlLWluLW91dCcpXSksXG4gICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW2FuaW1hdGUoJzAuMnMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IHRyYW5zZm9ybTogdHJhbnNmb3JtIH0pKV0pLFxuICBdO1xufVxuIl0sIm5hbWVzIjpbInRzbGliXzEuX192YWx1ZXMiLCJzdGF0ZSIsInRzbGliXzEuX19leHRlbmRzIiwiZmls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LENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQzVHLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQ3pHLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtJQUMxRyxjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7SUFDN0csY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7SUFDM0csY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDM0csZUFBZSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO0lBQzlHLGFBQWEsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLENB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","module.exports = \"<div class=\\\"hack-noshow p-2 z-depth-2\\\">\\r\\n  <div class=\\\"table-responsive px-1\\\">\\r\\n    <table class=\\\"table table-sm table-bordered table-striped card-list-table\\\" style=\\\"line-height: 1.1\\\">\\r\\n      <thead>\\r\\n        <tr>\\r\\n          <th scope=\\\"col\\\" class=\\\"text-center text-size-small\\\">序號</th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\" data-title=\\\"擬參選人/政黨\\\" scope=\\\"col\\\">\\r\\n            擬參選人<br />/政黨\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\"\\r\\n              data-title=\\\"參選公職名稱\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            參選公職名稱\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\"\\r\\n              data-title=\\\"申報序號/年度\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            申報序號<br />/年度\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\" data-title=\\\"交易日期\\\" scope=\\\"col\\\">\\r\\n            交易日期\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\" data-title=\\\"收支科目\\\" scope=\\\"col\\\">\\r\\n            收支科目\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\"\\r\\n              data-title=\\\"捐贈者/支出對象\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            捐贈者/支出對象\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\"\\r\\n              data-title=\\\"身分證/統一編號\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            身分證/<br />統一編號\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\" data-title=\\\"收入金額\\\" scope=\\\"col\\\">\\r\\n            收入金額\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\" data-title=\\\"支出金額\\\" scope=\\\"col\\\">\\r\\n            支出金額\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"捐贈方式\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            捐贈<br />方式\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"存入專戶日期\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            存入專戶日期\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\"\\r\\n              data-title=\\\"返還/繳庫\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            返還/<br />繳庫\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\" data-title=\\\"支出用途\\\" scope=\\\"col\\\">\\r\\n            支出用途\\r\\n          </th>\\r\\n          <th class=\\\"text-center d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"金錢類\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            金錢 類\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"地址\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            地址\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"聯絡電話\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            聯絡電話\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center text-size-small\\\"\\r\\n              data-title=\\\"應揭露之支出對象\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            應揭露之<br />支出對象\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"更正註記\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            更正註記\\r\\n          </th>\\r\\n          <th class=\\\"text-nowrap text-center d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"資料更正日期\\\"\\r\\n              scope=\\\"col\\\">\\r\\n            資料更正日期\\r\\n          </th>\\r\\n        </tr>\\r\\n      </thead>\\r\\n      <tbody>\\r\\n        <tr class=\\\"text-center tr-adv\\\"\\r\\n            *ngFor=\\\"let row of rows; let i = index\\\">\\r\\n          <td data-title=\\\"序號\\\">{{ i + 1 + pageBase }}</td>\\r\\n          <td class=\\\"text-wrap text-size-small\\\" data-title=\\\"擬參選人/政黨\\\" style=\\\"WORD-BREAK: break-all;\\\">{{ row.name }}</td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\" data-title=\\\"參選公職名稱\\\">\\r\\n            {{ row.electionName }}&nbsp;\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\" data-title=\\\"申報序號/年度\\\">\\r\\n            {{ row.yearOrSerial | toZh: \\\"serial\\\" }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\" data-title=\\\"交易日期\\\">\\r\\n            {{ row.transactionDate | toTwDate }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\" data-title=\\\"收支科目\\\" style=\\\"text-align: left\\\">\\r\\n            {{ row.typeCode | toZh: \\\"typeCode\\\" }}\\r\\n          </td>\\r\\n          <td class=\\\"text-wrap text-size-small\\\" data-title=\\\"捐贈者/支出對象\\\" style=\\\"text-align: left;WORD-BREAK: break-all; \\\">\\r\\n            {{ row.donor }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\" data-title=\\\"身分證/統一編號\\\">\\r\\n            {{ row.donorIdentifier?.length > 0 ? row.donorIdentifier : \\\"-\\\" }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\"\\r\\n              data-title=\\\"收入金額\\\"\\r\\n              style=\\\"text-align: right\\\">\\r\\n            {{\\r\\n              row.receivedAmount != null &&\\r\\n              (row.donationAmount == 0 || row.donationAmount == null)\\r\\n                ? (row.receivedAmount | number: \\\"1.\\\")\\r\\n                : \\\"-\\\"\\r\\n            }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\"\\r\\n              data-title=\\\"支出金額\\\"\\r\\n              style=\\\"text-align: right\\\">\\r\\n            {{\\r\\n              row.donationAmount != null &&\\r\\n              row.donationAmount != 0 &&\\r\\n              (row.receivedAmount == 0 || row.receivedAmount == null)\\r\\n                ? (row.donationAmount | number: \\\"1.\\\")\\r\\n                : \\\"-\\\"\\r\\n            }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap d-none d-md-table-cell text-size-small\\\" data-title=\\\"捐贈方式\\\">\\r\\n            {{ row.payType }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap d-none d-md-table-cell text-size-small\\\"\\r\\n              data-title=\\\"存入專戶日期\\\">\\r\\n            {{ row.saveAccountDate | toTwDate }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\"\\r\\n              data-title=\\\"返還/繳庫\\\">\\r\\n            {{ row.returnOrPaytrs }}&nbsp;\\r\\n          </td>\\r\\n          <td class=\\\"text-wrap text-size-small\\\" data-title=\\\"支出用途\\\" style=\\\"text-align: left;WORD-BREAK: break-all;\\\">\\r\\n            {{ row.donationUse ? row.donationUse : \\\"&nbsp;\\\" }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap d-none d-md-table-cell text-size-small\\\" data-title=\\\"金錢類\\\">\\r\\n            {{ row.isMoney | toZh: \\\"isMoney\\\" }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap d-none d-md-table-cell text-size-small\\\" data-title=\\\"地址\\\">\\r\\n            {{ row.donorAddress }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap d-none d-md-table-cell text-size-small\\\" data-title=\\\"聯絡電話\\\">\\r\\n            {{ row.tel }}\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap text-size-small\\\"\\r\\n              data-title=\\\"應揭露之支出對象\\\">\\r\\n            {{ row.exposeRemark == \\\"Y\\\" ? \\\"\\\" : row.exposeRemark }}&nbsp;\\r\\n\\r\\n            <button type=\\\"button\\\"\\r\\n                    class=\\\"btn btn-brown m-0 btn-sm px-md-1 text-size-small btn-padding0105\\\"\\r\\n                    *ngIf=\\\"row.exposeRemark === 'Y' || row.exposeRemark === '是'\\\"\\r\\n                    (click)=\\\"selectRow(row)\\\">\\r\\n              <!--<i class=\\\"fa fa-info\\\"></i> 20201216 added -->\\r\\n              明細\\r\\n            </button>\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap  text-size-small\\\" data-title=\\\"更正註記\\\">\\r\\n            {{ row.diffVersionStr }}&nbsp;\\r\\n          </td>\\r\\n          <td class=\\\"text-nowrap  text-size-small\\\" data-title=\\\"資料更正日期\\\">\\r\\n            {{ row.updateDatetimeB | toTwDate }}&nbsp;\\r\\n          </td>\\r\\n        </tr>\\r\\n      </tbody>\\r\\n    </table>\\r\\n  </div>\\r\\n  <ng-content></ng-content>\\r\\n</div>\\r\\n\\r\\n\\r\\n<ng-template #rowDetailModal let-modal>\\r\\n  <!-- <div class=\\\"modal-header\\\">\\r\\n    <h4 class=\\\"modal-title\\\">使用須知</h4>\\r\\n  </div> -->\\r\\n  <div class=\\\"modal-body\\\">\\r\\n    <table class=\\\"table table-striped table-sm\\\">\\r\\n      <tbody>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">擬參選人/政黨</th>\\r\\n          <td>{{ selectedRow.name }}</td>\\r\\n        </tr>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">交易日期</th>\\r\\n          <td>{{ selectedRow.transactionDate | toTwDate }}</td>\\r\\n        </tr>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">支出對象</th>\\r\\n          <td>{{ selectedRow.donor }}</td>\\r\\n        </tr>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">支出對象之內部人員姓名</th>\\r\\n          <td>{{ selectedRow.rpIntraName }}</td>\\r\\n        </tr>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">支出對象之內部人員職稱</th>\\r\\n          <td>{{ selectedRow.rpIntraTitle }}</td>\\r\\n        </tr>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">政黨之內部人員姓名</th>\\r\\n          <td>{{ selectedRow.rpPartyName }}</td>\\r\\n        </tr>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">政黨之內部人員職稱</th>\\r\\n          <td>{{ selectedRow.rpPartyTitle }}</td>\\r\\n        </tr>\\r\\n        <tr>\\r\\n          <th scope=\\\"row\\\">關係</th>\\r\\n          <td>{{ selectedRow.rpRelationStr }}</td>\\r\\n        </tr>\\r\\n      </tbody>\\r\\n    </table>\\r\\n  </div>\\r\\n  <div class=\\\"modal-footer p-0\\\">\\r\\n    <button\\r\\n      type=\\\"button\\\"\\r\\n      class=\\\"btn btn-brown  m-0\\\"\\r\\n      (click)=\\\"modal.close('Save click')\\\"\\r\\n    >\\r\\n      結束\\r\\n    </button>\\r\\n  </div>\\r\\n</ng-template>\\r\\n\\r\\n\"","module.exports = \"@media print {\\n  :host .hack-noshow.p-2.z-depth-2 {\\n    padding: 0 !important; }\\n  :host .table-responsive.px-1 {\\n    padding: 0 !important; }\\n  :host .table.table-sm.table-striped.card-list-table th, :host .table.table-sm.table-striped.card-list-table td {\\n    padding: 0 !important; } }\\n\\n@media screen and (max-width: 768px) {\\n  .tr-adv {\\n    border-bottom: 2px solid black; }\\n  .card-list-table {\\n    width: 100%;\\n    table-layout: fixed;\\n    background: transparent; }\\n    .card-list-table thead {\\n      display: none; }\\n    .card-list-table tbody tr {\\n      display: block;\\n      background: white; }\\n    .card-list-table tbody td {\\n      border-top: 0;\\n      display: block;\\n      position: relative;\\n      padding-left: 40%;\\n      text-align: right !important; }\\n      .card-list-table tbody td:first-of-type::after {\\n        visibility: hidden; }\\n      .card-list-table tbody td:before {\\n        content: attr(data-title);\\n        display: table-cell;\\n        position: absolute;\\n        left: 15px;\\n        width: 40%;\\n        margin: auto;\\n        color: #838383;\\n        /*          font-size: .85em;*/\\n        font-weight: 500;\\n        text-align: left;\\n        text-transform: uppercase;\\n        vertical-align: middle;\\n        white-space: nowrap; } }\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvc2VhcmNoL3NlYXJjaC1hZHZhbmNlZC9zZWFyY2gtYWR2YW5jZWQtdGFibGUvRDpcXGpjeS1wcm9qZWN0XFwyMDIwMDUyNVxcamN5LW9wZW4tZGF0YVxcVU9wZW5EYXRhXFxDbGllbnRBcHBcXGpjeS1mcm9udC1lbmQvc3JjXFxhcHBcXHNlYXJjaFxcc2VhcmNoLWFkdmFuY2VkXFxzZWFyY2gtYWR2YW5jZWQtdGFibGVcXHNlYXJjaC1hZHZhbmNlZC10YWJsZS5jb21wb25lbnQuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDRTtFQURGO0lBR00sc0JBQXFCLEVBQ3RCO0VBSkw7SUFPTSxzQkFBcUIsRUFDdEI7RUFSTDtJQVdlLHNCQUFxQixFQUFHLEVBQUE7O0FBTXZDO0VBQ0U7SUFDRSwrQkFBOEIsRUFDL0I7RUFFRDtJQUNFLFlBQVc7SUFDWCxvQkFBbUI7SUFDbkIsd0JBQXVCLEVBbUN4QjtJQXRDRDtNQUtJLGNBQWEsRUFDZDtJQU5IO01BU00sZUFBYztNQUNkLGtCQUFpQixFQUNsQjtJQVhMO01BYU0sY0FBYTtNQUNiLGVBQWM7TUFDZCxtQkFBa0I7TUFDbEIsa0JBQWlCO01BQ2pCLDZCQUE0QixFQW1CN0I7TUFwQ0w7UUFtQlEsbUJBQWtCLEVBQ25CO01BcEJQO1FBc0JRLDBCQUF5QjtRQUN6QixvQkFBbUI7UUFDbkIsbUJBQWtCO1FBQ2xCLFdBQVU7UUFDVixXQUFVO1FBQ1YsYUFBWTtRQUNaLGVBQWM7UUFDeEIsK0JBQStCO1FBQ3JCLGlCQUFnQjtRQUNoQixpQkFBZ0I7UUFDaEIsMEJBQXlCO1FBQ3pCLHVCQUFzQjtRQUN0QixvQkFBbUIsRUFDcEIsRUFBQSIsImZpbGUiOiJzcmMvYXBwL3NlYXJjaC9zZWFyY2gtYWR2YW5jZWQvc2VhcmNoLWFkdmFuY2VkLXRhYmxlL3NlYXJjaC1hZHZhbmNlZC10YWJsZS5jb21wb25lbnQuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIjpob3N0IHtcclxuICBAbWVkaWEgcHJpbnQge1xyXG4gICAgLmhhY2stbm9zaG93LnAtMi56LWRlcHRoLTIge1xyXG4gICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnRhYmxlLXJlc3BvbnNpdmUucHgtMSB7XHJcbiAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcclxuICAgIH1cclxuICAgIC50YWJsZS50YWJsZS1zbS50YWJsZS1zdHJpcGVkLmNhcmQtbGlzdC10YWJsZSB7XHJcbiAgICAgIC8vXHJcbiAgICAgIHRoLCB0ZCB7IHBhZGRpbmc6IDAgIWltcG9ydGFudDt9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHtcclxuICAudHItYWR2IHtcclxuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBibGFjaztcclxuICB9XHJcblxyXG4gIC5jYXJkLWxpc3QtdGFibGUge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkO1xyXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgICB0aGVhZCB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgICB0Ym9keSB7XHJcbiAgICAgIHRyIHtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgICAgfVxyXG4gICAgICB0ZCB7XHJcbiAgICAgICAgYm9yZGVyLXRvcDogMDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA0MCU7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQgIWltcG9ydGFudDsgLy8yMDIwMTIwOSBhZGQgIWltcG9ydGFudFxyXG4gICAgICAgICY6Zmlyc3Qtb2YtdHlwZTo6YWZ0ZXIge1xyXG4gICAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAmOmJlZm9yZSB7XHJcbiAgICAgICAgICBjb250ZW50OiBhdHRyKGRhdGEtdGl0bGUpO1xyXG4gICAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDtcclxuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICAgIGxlZnQ6IDE1cHg7XHJcbiAgICAgICAgICB3aWR0aDogNDAlO1xyXG4gICAgICAgICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgICAgICAgY29sb3I6ICM4MzgzODM7XHJcbi8qICAgICAgICAgIGZvbnQtc2l6ZTogLjg1ZW07Ki8gIC8vMjAyMDEyMDkgbWFya2VkXHJcbiAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XHJcbiAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19 */\"","import { Component, OnInit, Input, ViewChild, TemplateRef } from '@angular/core';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { AdvancedRow } from '../../search.service';\r\n\r\n@Component({\r\n  selector: \"app-search-advanced-table\",\r\n  templateUrl: \"./search-advanced-table.component.html\",\r\n  styleUrls: [\"./search-advanced-table.component.scss\"],\r\n})\r\nexport class SearchAdvancedTableComponent implements OnInit {\r\n\r\n  selectedRow: AdvancedRow = null;\r\n\r\n  @ViewChild(\"rowDetailModal\")\r\n  rowDetailModal: TemplateRef<any>;\r\n\r\n  @Input()\r\n  rows: AdvancedRow[];\r\n\r\n  @Input()\r\n  currentPage: number = 1;\r\n\r\n  @Input()\r\n  pageSize: number = 10;\r\n\r\n  get pageBase(): number {\r\n    return (this.currentPage - 1) * this.pageSize;\r\n  }\r\n\r\n  serialName(id: number): string {\r\n    switch (id) {\r\n      case 1:\r\n        return \"首次\";\r\n      case 2:\r\n        return \"第一次賸餘\";\r\n      case 3:\r\n        return \"第二次賸餘\";\r\n      case 4:\r\n        return \"第三次賸餘\";\r\n      case 5:\r\n        return \"第四次賸餘\";\r\n      case 6:\r\n        return \"第五次賸餘\";\r\n      default:\r\n        return \"\";\r\n    }\r\n  }\r\n  constructor(private modalService: NgbModal) {}\r\n\r\n  ngOnInit() {}\r\n\r\n  selectRow(row: AdvancedRow): void {\r\n    this.selectedRow =row;\r\n\r\n    const modalRef = this.modalService.open(this.rowDetailModal, {\r\n      backdrop: \"static\",\r\n      centered: true,\r\n      size: \"lg\",\r\n    });\r\n    modalRef.result.then(\r\n      () => {\r\n        this.selectedRow = null;\r\n        // this.state.acceptTos();\r\n      },\r\n      () => {\r\n        this.selectedRow = null;\r\n      }\r\n    );\r\n  }\r\n}\r\n","module.exports = \"<app-breadcrumbs\\r\\n  [breadcrumbs]=\\\"[{ title: '資料查詢' }, { title: '一般查詢' }]\\\"\\r\\n></app-breadcrumbs>\\r\\n\\r\\n<!-- <pre>\\r\\n {{queryState | json}}\\r\\n</pre>\\r\\n<pre>\\r\\n  {{query | json}}\\r\\n</pre> -->\\r\\n<!-- <pre>{{searchFormData|json}}</pre> -->\\r\\n<div class=\\\"container-fluid mb-5\\\">\\r\\n  <div class=\\\"row mb-3 d-print-none\\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"card\\\" style=\\\"line-height: 1;\\\">\\r\\n        <h3 class=\\\"card-header brown white-text\\\">查詢條件</h3>\\r\\n        <div class=\\\"card-body\\\">\\r\\n          <div class=\\\"input-group\\\">\\r\\n            <input\\r\\n              class=\\\"form-control form-control-lg\\\"\\r\\n              type=\\\"text\\\"\\r\\n              [(ngModel)]=\\\"queryState.keyword\\\"\\r\\n              placeholder=\\\"查詢關鍵詞\\\"\\r\\n            />\\r\\n            <div class=\\\"input-group-append\\\">\\r\\n              <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"查詢條件\\\">\\r\\n                <button\\r\\n                  class=\\\"btn btn-brown px-2 px-md-3 m-0\\\" \\r\\n                  [clrLoading]=\\\"searchDetailsBtnState\\\" \\r\\n                  type=\\\"button\\\"                  \\r\\n                  (click)=\\\"onSearch()\\\"\\r\\n                >\\r\\n                  <i class=\\\"fas fa-search\\\"></i>\\r\\n                  <span class=\\\"d-none d-md-inline\\\">查詢</span>\\r\\n                </button>\\r\\n                <button\\r\\n                  class=\\\"btn btn-brown px-2 px-md-3 m-0 mb-0\\\"\\r\\n                  (click)=\\\"isCollapsed = !isCollapsed\\\"\\r\\n                  type=\\\"button\\\"\\r\\n                >\\r\\n                  <span class=\\\"d-none d-md-inline\\\">\\r\\n                    <i class=\\\"fas fa-search-plus\\\"></i>\\r\\n                    進階查詢\\r\\n                  </span>\\r\\n                  <span class=\\\"d-md-none\\\">\\r\\n                    <i class=\\\"fa fa-chevron-down\\\"></i>\\r\\n                  </span>\\r\\n                </button>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n\\r\\n          <hr class=\\\"my-3\\\" style=\\\"margin-bottom: 0.5rem !important;margin-top: 0.5rem !important;\\\" />\\r\\n          <div class=\\\"form-check form-check-inline\\\">\\r\\n            <input\\r\\n              class=\\\"form-check-input\\\"\\r\\n              type=\\\"checkbox\\\"\\r\\n              [(ngModel)]=\\\"allDetailSearchTypes\\\"\\r\\n              (ngModelChange)=\\\"onDetailSearchTypesChange($event)\\\"\\r\\n              id=\\\"dst-0\\\"\\r\\n            />\\r\\n            <label class=\\\"form-check-label\\\" for=\\\"dst-0\\\">全部</label>\\r\\n          </div>\\r\\n          <div class=\\\"form-check form-check-inline\\\">\\r\\n            <input\\r\\n              class=\\\"form-check-input\\\"\\r\\n              type=\\\"checkbox\\\"\\r\\n              [(ngModel)]=\\\"queryState.detailSearchTypes.Candidate\\\"\\r\\n              (ngModelChange)=\\\"onDetailSpecificChange($event, 'Candidate')\\\"\\r\\n              id=\\\"dst-1\\\"\\r\\n            />\\r\\n            <label class=\\\"form-check-label\\\" for=\\\"dst-1\\\"\\r\\n              >擬參選人(含總統選舉)</label\\r\\n            >\\r\\n          </div>\\r\\n          <div class=\\\"form-check form-check-inline\\\">\\r\\n            <input\\r\\n              class=\\\"form-check-input\\\"\\r\\n              type=\\\"checkbox\\\"\\r\\n              [(ngModel)]=\\\"queryState.detailSearchTypes.PoliticalParty\\\"\\r\\n              (ngModelChange)=\\\"onDetailSpecificChange($event, 'PoliticalParty')\\\"\\r\\n              id=\\\"dst-2\\\"\\r\\n            />\\r\\n            <label class=\\\"form-check-label\\\" for=\\\"dst-2\\\">政黨、政治團體</label>\\r\\n          </div>\\r\\n          <div class=\\\"form-check form-check-inline\\\">\\r\\n            <input\\r\\n              class=\\\"form-check-input\\\"\\r\\n              type=\\\"checkbox\\\"\\r\\n              [(ngModel)]=\\\"queryState.detailSearchTypes.Donor\\\"\\r\\n              (ngModelChange)=\\\"onDetailSpecificChange($event)\\\"\\r\\n              id=\\\"dst-3\\\"\\r\\n            />\\r\\n            <label class=\\\"form-check-label\\\" for=\\\"dst-3\\\">捐贈者</label>\\r\\n          </div>\\r\\n          <div class=\\\"form-check form-check-inline\\\">\\r\\n            <input\\r\\n              class=\\\"form-check-input\\\"\\r\\n              type=\\\"checkbox\\\"\\r\\n              [(ngModel)]=\\\"queryState.detailSearchTypes.ExpenditureTarget\\\"\\r\\n              (ngModelChange)=\\\"onDetailSpecificChange($event)\\\"\\r\\n              id=\\\"dst-4\\\"\\r\\n            />\\r\\n            <label class=\\\"form-check-label\\\" for=\\\"dst-4\\\">支出對象</label>\\r\\n          </div>\\r\\n\\r\\n          <div class=\\\"w-100\\\" [ngbCollapse]=\\\"isCollapsed\\\">\\r\\n            <hr class=\\\"my-3\\\" style=\\\"margin-bottom: 0.5rem !important;margin-top: 0.5rem !important;\\\" />\\r\\n            <ng-container *ngIf=\\\"showCandidateFields\\\">\\r\\n              <div class=\\\"row\\\">\\r\\n                <div class=\\\"col-12\\\">\\r\\n                  <strong>擬參選人(含總統選舉) 欄位</strong>\\r\\n                </div>\\r\\n                <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                  <div class=\\\"form-group\\\">\\r\\n                    <label class=\\\"grey-text\\\">選舉年度</label>\\r\\n                    <select\\r\\n                      class=\\\"form-control\\\"\\r\\n                      [(ngModel)]=\\\"queryState.electionYear\\\"\\r\\n                    >\\r\\n                      <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                      <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                        <option\\r\\n                          *ngFor=\\\"let year of searchFormData.electionYears\\\"\\r\\n                          [ngValue]=\\\"year\\\"\\r\\n                        >\\r\\n                          {{ year }}\\r\\n                        </option>\\r\\n                      </ng-container>\\r\\n                    </select>\\r\\n                  </div>\\r\\n                </div>\\r\\n                <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                  <div class=\\\"form-group\\\">\\r\\n                    <label class=\\\"grey-text\\\">選舉名稱</label>\\r\\n                    <!-- TODO: -->\\r\\n                    <select\\r\\n                      class=\\\"form-control\\\"\\r\\n                      [(ngModel)]=\\\"queryState.electionCode\\\"\\r\\n                    >\\r\\n                      <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                      <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                        <option\\r\\n                          *ngFor=\\\"let election of filteredElections\\\"\\r\\n                          [ngValue]=\\\"election.code\\\"\\r\\n                        >\\r\\n                          {{ election.name }}\\r\\n                        </option>\\r\\n                      </ng-container>\\r\\n                    </select>\\r\\n                  </div>\\r\\n                </div>\\r\\n                <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                  <div class=\\\"form-group\\\">\\r\\n                    <label class=\\\"grey-text\\\">選舉區縣市</label>\\r\\n                    <select\\r\\n                      class=\\\"form-control\\\"\\r\\n                      [(ngModel)]=\\\"queryState.electionDistrict\\\"\\r\\n                    >\\r\\n                      <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                      <ng-container *ngIf=\\\"searchFormData\\\"></ng-container>\\r\\n                      <option\\r\\n                        *ngFor=\\\"let dist of searchFormData?.electionDistricts\\\"\\r\\n                        [ngValue]=\\\"dist\\\"\\r\\n                      >\\r\\n                        {{ dist }}\\r\\n                      </option>\\r\\n                    </select>\\r\\n                  </div>\\r\\n                </div>\\r\\n                <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                  <div class=\\\"form-group\\\">\\r\\n                    <label class=\\\"grey-text\\\">申報序號</label>\\r\\n                    <select\\r\\n                      class=\\\"form-control\\\"\\r\\n                      [(ngModel)]=\\\"queryState.accountingSerial\\\"\\r\\n                    >\\r\\n                      <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                      <option [ngValue]=\\\"1\\\">首次</option>\\r\\n                      <option [ngValue]=\\\"2\\\">第一次賸餘</option>\\r\\n                      <option [ngValue]=\\\"3\\\">第二次賸餘</option>\\r\\n                      <option [ngValue]=\\\"4\\\">第三次賸餘</option>\\r\\n                      <option [ngValue]=\\\"5\\\">第四次賸餘</option>\\r\\n                      <option [ngValue]=\\\"6\\\">第五次賸餘</option>\\r\\n                    </select>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <hr class=\\\"my-3\\\" style=\\\"margin-bottom: 0.5rem !important;margin-top: 0.5rem !important;\\\" />\\r\\n            </ng-container>\\r\\n            <ng-container *ngIf=\\\"showPartyFields\\\">\\r\\n              <div class=\\\"row\\\">\\r\\n                <div class=\\\"col-12\\\"><strong>政黨、政治團體欄位</strong></div>\\r\\n                <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                  <div class=\\\"form-group\\\">\\r\\n                    <label class=\\\"grey-text\\\">申報年度</label>\\r\\n                    <select\\r\\n                      class=\\\"form-control\\\"\\r\\n                      [(ngModel)]=\\\"queryState.reportedYear\\\"\\r\\n                    >\\r\\n                      <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                      <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                        <option\\r\\n                          *ngFor=\\\"let year of searchFormData.reportYears\\\"\\r\\n                          [ngValue]=\\\"year\\\"\\r\\n                        >\\r\\n                          {{ year }}\\r\\n                        </option>\\r\\n                      </ng-container>\\r\\n                    </select>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <hr class=\\\"my-3\\\" style=\\\"margin-bottom: 0.5rem !important;margin-top: 0.5rem !important;\\\" />\\r\\n            </ng-container>\\r\\n\\r\\n            <div class=\\\"row\\\">\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <!-- TODO: wtf is this -->\\r\\n                  <label class=\\\"grey-text\\\">收支對象</label>\\r\\n                  <input type=\\\"text\\\"\\r\\n                         class=\\\"form-control\\\"\\r\\n                         [(ngModel)]=\\\"queryState.donor\\\" />\\r\\n                </div>\\r\\n              </div>\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text d-inline-block w-100\\\">是否金錢類</label>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           [value]=\\\"null\\\"\\r\\n                           id=\\\"fim-0\\\"\\r\\n                           name=\\\"isMoneyRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.isMoney\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"fim-0\\\">全部</label>\\r\\n                  </div>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           [value]=\\\"true\\\"\\r\\n                           id=\\\"fim-1\\\"\\r\\n                           name=\\\"isMoneyRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.isMoney\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"fim-1\\\">金錢</label>\\r\\n                  </div>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           [value]=\\\"false\\\"\\r\\n                           id=\\\"fim-2\\\"\\r\\n                           name=\\\"isMoneyRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.isMoney\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"fim-2\\\">非金錢</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text\\\">收支科目</label>\\r\\n                  <select class=\\\"form-control\\\"\\r\\n                          [(ngModel)]=\\\"queryState.classType\\\">\\r\\n                    <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                    <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                      <ng-container *ngFor=\\\"let type of selectedClassTypes\\\">\\r\\n                        <option *ngIf=\\\"type.ctrlNm !== '賸餘'\\\"\\r\\n                                [ngValue]=\\\"type.acctCd\\\">\\r\\n                          {{ type.acctNm }}({{ type.type | toZh }})\\r\\n                        </option>\\r\\n                        <option *ngIf=\\\"type.ctrlNm === '賸餘'\\\"\\r\\n                                [ngValue]=\\\"type.acctCd\\\">\\r\\n                          {{ type.acctNm }}(擬參選人-賸餘)\\r\\n                        </option>\\r\\n                      </ng-container>\\r\\n                    </ng-container>\\r\\n                  </select>\\r\\n                </div>\\r\\n              </div>\\r\\n              <div class=\\\"col-md-6\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text\\\">交易日期</label>\\r\\n                  <div class=\\\"d-flex align-items-center\\\">\\r\\n                    <div class=\\\"input-group\\\">\\r\\n                      <input class=\\\"form-control\\\"\\r\\n                             placeholder=\\\"yyyy-mm-dd\\\"\\r\\n                             [(ngModel)]=\\\"queryState.transactionDateBegin\\\"\\r\\n                             ngbDatepicker\\r\\n                             #d=\\\"ngbDatepicker\\\" />\\r\\n                      <div class=\\\"input-group-append\\\">\\r\\n                        <button class=\\\"btn m-0 px-3 py-2 calendar btn-brown\\\"\\r\\n                                (click)=\\\"d.toggle()\\\"\\r\\n                                type=\\\"button\\\">\\r\\n                          <i class=\\\"fa fa-calendar\\\"></i>\\r\\n                        </button>\\r\\n                      </div>\\r\\n                    </div>\\r\\n                    <span class=\\\"mx-2\\\">至</span>\\r\\n                    <div class=\\\"input-group\\\">\\r\\n                      <input class=\\\"form-control\\\"\\r\\n                             placeholder=\\\"yyyy-mm-dd\\\"\\r\\n                             [(ngModel)]=\\\"queryState.transactionDateEnd\\\"\\r\\n                             ngbDatepicker\\r\\n                             #d2=\\\"ngbDatepicker\\\" />\\r\\n                      <div class=\\\"input-group-append\\\">\\r\\n                        <button class=\\\"btn m-0 px-3 py-2 calendar btn-brown\\\"\\r\\n                                (click)=\\\"d2.toggle()\\\"\\r\\n                                type=\\\"button\\\">\\r\\n                          <i class=\\\"fa fa-calendar\\\"></i>\\r\\n                        </button>\\r\\n                      </div>\\r\\n                    </div>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text d-inline-block w-100\\\">是否金額超過3萬元以上</label>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"checkbox\\\"\\r\\n                           id=\\\"over3m-0\\\"\\r\\n                           [(ngModel)]=\\\"queryState.amountOver3Million\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"over3m-0\\\">是</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <!-- TODO: wtf is this -->\\r\\n                  <label class=\\\"grey-text\\\">金額範圍</label>\\r\\n                  <div class=\\\"d-flex align-items-center\\\">\\r\\n                    <input type=\\\"number\\\"\\r\\n                           class=\\\"form-control\\\"\\r\\n                           [(ngModel)]=\\\"queryState.amountBegin\\\"\\r\\n                           placeholder=\\\"最小值\\\" />\\r\\n                    <span class=\\\"mx-2\\\">至</span>\\r\\n                    <input type=\\\"number\\\"\\r\\n                           class=\\\"form-control\\\"\\r\\n                           [(ngModel)]=\\\"queryState.amountEnd\\\"\\r\\n                           placeholder=\\\"最大值\\\" />\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <!-- TODO: begin -->\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text d-inline-block w-100\\\">捐贈方式</label>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           [value]=\\\"null\\\"\\r\\n                           id=\\\"fim-0-0\\\"\\r\\n                           name=\\\"payTypeRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.payType\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"fim-0-0\\\">全部</label>\\r\\n                  </div>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           value=\\\"1\\\"\\r\\n                           id=\\\"fim-0-1\\\"\\r\\n                           name=\\\"payTypeRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.payType\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"fim-0-1\\\">現金</label>\\r\\n                  </div>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           value=\\\"2\\\"\\r\\n                           id=\\\"fim-1-1\\\"\\r\\n                           name=\\\"payTypeRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.payType\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"fim-1-1\\\">票據</label>\\r\\n                  </div>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           value=\\\"3\\\"\\r\\n                           id=\\\"fim-2-1\\\"\\r\\n                           name=\\\"payTypeRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.payType\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"fim-2-1\\\">匯款</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n\\r\\n              <div class=\\\"col-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text d-inline-block w-100\\\">應揭露之支出對象</label>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"checkbox\\\"\\r\\n                           id=\\\"form-expose-remark\\\"\\r\\n                           [(ngModel)]=\\\"queryState.exposeRemark\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"form-expose-remark\\\">是</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <!--<div class=\\\"col-6 col-lg-3\\\">\\r\\n    <div class=\\\"form-group\\\">\\r\\n      <label class=\\\"grey-text d-inline-block w-100\\\"\\r\\n        >返還/繳庫</label\\r\\n      >\\r\\n      <div class=\\\"form-check form-check-inline\\\">\\r\\n        <input\\r\\n          class=\\\"form-check-input\\\"\\r\\n          type=\\\"checkbox\\\"\\r\\n          id=\\\"form-return-or-paytrs\\\"\\r\\n          [(ngModel)]=\\\"queryState.returnOrPaytrs\\\"\\r\\n        />\\r\\n        <label class=\\\"form-check-label\\\" for=\\\"form-return-or-paytrs\\\"\\r\\n          >是</label\\r\\n        >\\r\\n      </div>\\r\\n    </div>\\r\\n  </div> 20201216 added-->\\r\\n              <div class=\\\"col-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text d-inline-block w-100\\\">返還/繳庫</label>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           [value]=\\\"null\\\"\\r\\n                           id=\\\"form-return-or-paytrs-0\\\"\\r\\n                           name=\\\"returnOrPaytrsRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.returnOrPaytrs\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"form-return-or-paytrs-0\\\">全部</label>\\r\\n                  </div>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           value=\\\"1\\\"\\r\\n                           id=\\\"form-return-or-paytrs-1\\\"\\r\\n                           name=\\\"returnOrPaytrsRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.returnOrPaytrs\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"form-return-or-paytrs-1\\\">已返還</label>\\r\\n                  </div>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"radio\\\"\\r\\n                           value=\\\"2\\\"\\r\\n                           id=\\\"form-return-or-paytrs-2\\\"\\r\\n                           name=\\\"returnOrPaytrsRadio\\\"\\r\\n                           [(ngModel)]=\\\"queryState.returnOrPaytrs\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"form-return-or-paytrs-2\\\">已繳庫</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <!--2022/07/26-->\\r\\n              <div class=\\\"col-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text d-inline-block w-100\\\">更正註記</label>\\r\\n                  <div class=\\\"form-check form-check-inline\\\">\\r\\n                    <input class=\\\"form-check-input\\\"\\r\\n                           type=\\\"checkbox\\\"\\r\\n                           id=\\\"form-diffVersionStr\\\"\\r\\n                           [(ngModel)]=\\\"queryState.diffVersionStr\\\" />\\r\\n                    <label class=\\\"form-check-label\\\" for=\\\"form-diffVersionStr\\\">是</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <div class=\\\"col-md-6\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text\\\">存入專戶日期</label>\\r\\n                  <div class=\\\"d-flex align-items-center\\\">\\r\\n                    <div class=\\\"input-group\\\">\\r\\n                      <input class=\\\"form-control\\\"\\r\\n                             placeholder=\\\"yyyy-mm-dd\\\"\\r\\n                             [(ngModel)]=\\\"queryState.saveAccountDateBegin\\\"\\r\\n                             ngbDatepicker\\r\\n                             #d3=\\\"ngbDatepicker\\\" />\\r\\n                      <div class=\\\"input-group-append\\\">\\r\\n                        <button class=\\\"btn m-0 px-3 py-2 calendar btn-brown\\\"\\r\\n                                (click)=\\\"d3.toggle()\\\"\\r\\n                                type=\\\"button\\\">\\r\\n                          <i class=\\\"fa fa-calendar\\\"></i>\\r\\n                        </button>\\r\\n                      </div>\\r\\n                    </div>\\r\\n                    <span class=\\\"mx-2\\\">至</span>\\r\\n                    <div class=\\\"input-group\\\">\\r\\n                      <input class=\\\"form-control\\\"\\r\\n                             placeholder=\\\"yyyy-mm-dd\\\"\\r\\n                             [(ngModel)]=\\\"queryState.saveAccountDateEnd\\\"\\r\\n                             ngbDatepicker\\r\\n                             #d4=\\\"ngbDatepicker\\\" />\\r\\n                      <div class=\\\"input-group-append\\\">\\r\\n                        <button class=\\\"btn m-0 px-3 py-2 calendar btn-brown\\\"\\r\\n                                (click)=\\\"d4.toggle()\\\"\\r\\n                                type=\\\"button\\\">\\r\\n                          <i class=\\\"fa fa-calendar\\\"></i>\\r\\n                        </button>\\r\\n                      </div>\\r\\n                    </div>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <!--<div class=\\\"col-md-6 d-md-none d-lg-flex\\\"></div>-->\\r\\n              <!-- TODO: end -->\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text\\\">排序機制</label>\\r\\n\\r\\n                  <div class=\\\"d-flex align-items-center\\\">\\r\\n                    <select class=\\\"form-control\\\"\\r\\n                            [(ngModel)]=\\\"queryState.orderBy\\\">\\r\\n                      <option ngValue=\\\"Date\\\">以日期</option>\\r\\n                      <option ngValue=\\\"Amount\\\">以金額</option>\\r\\n                    </select>\\r\\n                    <select class=\\\"form-control\\\"\\r\\n                            [(ngModel)]=\\\"queryState.orderDirection\\\">\\r\\n                      <option ngValue=\\\"DESC\\\">由大到小</option>\\r\\n                      <option ngValue=\\\"ASC\\\">由小到大</option>\\r\\n                    </select>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n                <div class=\\\"form-group\\\">\\r\\n                  <label class=\\\"grey-text\\\">排序機制2</label>\\r\\n\\r\\n                  <div class=\\\"d-flex align-items-center\\\">\\r\\n                    <select class=\\\"form-control\\\"\\r\\n                            [(ngModel)]=\\\"queryState.thenOrderBy\\\">\\r\\n                      <option [ngValue]=\\\"null\\\">--</option>\\r\\n                      <option ngValue=\\\"Date\\\">以日期</option>\\r\\n                      <option ngValue=\\\"Amount\\\">以金額</option>\\r\\n                    </select>\\r\\n                    <select class=\\\"form-control\\\"\\r\\n                            [(ngModel)]=\\\"queryState.thenOrderDirection\\\">\\r\\n                      <option [ngValue]=\\\"null\\\">--</option>\\r\\n                      <option ngValue=\\\"DESC\\\">由大到小</option>\\r\\n                      <option ngValue=\\\"ASC\\\">由小到大</option>\\r\\n                    </select>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n        </div>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n\\r\\n  <div class=\\\"row mb-3\\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div\\r\\n        class=\\\"d-flex align-items-start flex-column d-md-inline-flex flex-md-row w-100 d-print-none\\\"\\r\\n        *ngIf=\\\"rows?.length > 0\\\"\\r\\n      >\\r\\n        <div\\r\\n          class=\\\"mr-md-auto align-items-center d-flex d-print-none\\\"\\r\\n          style=\\\"max-width: 100%; overflow-x: auto; white-space: nowrap\\\"\\r\\n        >\\r\\n          <div class=\\\"form-group my-0\\\">\\r\\n            <div class=\\\"input-group input-group-sm\\\">\\r\\n              <div class=\\\"input-group-prepend\\\">\\r\\n                <label class=\\\"input-group-text\\\">每頁</label>\\r\\n              </div>\\r\\n              <select\\r\\n                class=\\\"form-control form-control-sm\\\"\\r\\n                (change)=\\\"onPageSizeChange()\\\"\\r\\n                [(ngModel)]=\\\"queryState.pageSize\\\"\\r\\n              >\\r\\n                <option [value]=\\\"10\\\">10</option>\\r\\n                <option [value]=\\\"50\\\">50</option>\\r\\n                <option [value]=\\\"100\\\">100</option>\\r\\n                <option [value]=\\\"500\\\">500</option>\\r\\n                <option [value]=\\\"1000\\\">1000</option>\\r\\n              </select>\\r\\n              <div class=\\\"input-group-append\\\">\\r\\n                <label class=\\\"input-group-text\\\">筆</label>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n          <app-pagination\\r\\n            [paging]=\\\"paging\\\"\\r\\n            (pageChange)=\\\"onPaginate($event)\\\"\\r\\n          ></app-pagination>\\r\\n          <small class=\\\"d-none d-md-inline\\\"\\r\\n            >共{{ paging?.recordCount }}筆</small\\r\\n          >\\r\\n        </div>\\r\\n\\r\\n        <div>\\r\\n          <a\\r\\n            target=\\\"_blank\\\"\\r\\n            [href]=\\\"exportLink\\\"\\r\\n            download\\r\\n            class=\\\"btn btn-outline-brown btn-sm px-3\\\"\\r\\n            style=\\\"white-space: nowrap\\\"\\r\\n          >\\r\\n            <i class=\\\"fa fa-download mr-2\\\"></i>\\r\\n            產本頁電子檔\\r\\n          </a>\\r\\n          <!-- <button (click)=\\\"onExport()\\\" class=\\\"btn btn-outline-brown px-3\\\">\\r\\n            <i class=\\\"fa fa-download mr-2\\\"></i>\\r\\n            .CSV2\\r\\n          </button> -->\\r\\n          <button\\r\\n            class=\\\"btn btn-sm btn-outline-brown px-3\\\"\\r\\n            (click)=\\\"onPrint()\\\"\\r\\n            style=\\\"white-space: nowrap\\\"\\r\\n          >\\r\\n            <i class=\\\"fa fa-print\\\"></i>\\r\\n            列印本頁\\r\\n          </button>\\r\\n        </div>\\r\\n      </div>\\r\\n      <app-search-advanced-table\\r\\n        *ngIf=\\\"paging\\\"\\r\\n        [currentPage]=\\\"paging.pageNumber\\\"\\r\\n        [pageSize]=\\\"paging.pageSize\\\"\\r\\n        [rows]=\\\"rows\\\"\\r\\n      >\\r\\n      </app-search-advanced-table>\\r\\n      <div\\r\\n        class=\\\"d-flex my-2 align-items-center d-print-none\\\"\\r\\n        style=\\\"max-width: 100%; overflow-x: auto; white-space: nowrap\\\"\\r\\n      >\\r\\n        <div class=\\\"form-group my-0\\\">\\r\\n          <div class=\\\"input-group input-group-sm\\\">\\r\\n            <div class=\\\"input-group-prepend\\\">\\r\\n              <label class=\\\"input-group-text\\\">每頁</label>\\r\\n            </div>\\r\\n            <select\\r\\n              class=\\\"form-control form-control-sm\\\"\\r\\n              (change)=\\\"onPageSizeChange()\\\"\\r\\n              [(ngModel)]=\\\"queryState.pageSize\\\"\\r\\n            >\\r\\n              <option [value]=\\\"10\\\">10</option>\\r\\n              <option [value]=\\\"50\\\">50</option>\\r\\n              <option [value]=\\\"100\\\">100</option>\\r\\n              <option [value]=\\\"500\\\">500</option>\\r\\n              <option [value]=\\\"1000\\\">1000</option>\\r\\n            </select>\\r\\n            <div class=\\\"input-group-append\\\">\\r\\n              <label class=\\\"input-group-text\\\">筆</label>\\r\\n            </div>\\r\\n          </div>\\r\\n        </div>\\r\\n        <app-pagination\\r\\n          [paging]=\\\"paging\\\"\\r\\n          (pageChange)=\\\"onPaginate($event)\\\"\\r\\n        ></app-pagination>\\r\\n        <small class=\\\"d-none d-md-inline\\\">共{{ paging?.recordCount }}筆</small>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n</div>\\r\\n\"","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3NlYXJjaC9zZWFyY2gtYWR2YW5jZWQvc2VhcmNoLWFkdmFuY2VkLmNvbXBvbmVudC5zY3NzIn0= */\"","import {\r\n  Component,\r\n  OnInit,\r\n  OnDestroy,\r\n  PLATFORM_ID,\r\n  Inject,\r\n} from \"@angular/core\";\r\nimport {\r\n  DetailSearchType,\r\n  DetailOrder,\r\n  DetailOrderDirection,\r\n  SearchAdvancedQuery,\r\n  SearchFormData,\r\n  SearchService,\r\n  ElectionResource,\r\n  AdvancedRow,\r\n  ClassType,\r\n} from \"../search.service\";\r\nimport { of, Subject } from \"rxjs\";\r\nimport {\r\n  startWith,\r\n  switchMap,\r\n  tap,\r\n  takeUntil,\r\n  filter,\r\n  map,\r\n  switchMapTo,\r\n  catchError,\r\n} from \"rxjs/operators\";\r\nimport { Paging } from \"src/app/generics\";\r\nimport { ActivatedRoute, ParamMap } from \"@angular/router\";\r\nimport { buildQueryParams } from \"src/app/helpers\";\r\nimport { isPlatformBrowser } from \"@angular/common\";\r\nimport { ClrLoadingState } from \"@clr/angular\";\r\n\r\n@Component({\r\n  selector: \"app-search-advanced\",\r\n  templateUrl: \"./search-advanced.component.html\",\r\n  styleUrls: [\"./search-advanced.component.scss\"],\r\n})\r\nexport class SearchAdvancedComponent implements OnInit, OnDestroy {\r\n  isCollapsed = true;\r\n  allDetailSearchTypes = true;\r\n  showCandidateFields = true;\r\n  showPartyFields = true;\r\n\r\n  searchDetailsBtnState: ClrLoadingState = ClrLoadingState.DEFAULT;\r\n\r\n  initialQuery: SearchAdvancedQuery & {\r\n    detailSearchTypes: {\r\n      Candidate: boolean;\r\n      PoliticalParty: boolean;\r\n      Donor: boolean;\r\n      ExpenditureTarget: boolean;\r\n    };\r\n  } = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    keyword: null,\r\n    donor: null,\r\n    electionYear: null,\r\n    electionDistrict: null,\r\n    electionCode: null,\r\n    accountingSerial: null,\r\n    classType: null,\r\n    transactionDateBegin: null,\r\n    transactionDateEnd: null,\r\n    amountOver3Million: null,\r\n    amountBegin: null,\r\n    amountEnd: null,\r\n    orderBy: DetailOrder.Date,\r\n    orderDirection: DetailOrderDirection.ASC,\r\n    thenOrderBy: null,\r\n    thenOrderDirection: null,\r\n    isMoney: null,\r\n    reportedYear: null,\r\n    detailSearchTypes: {\r\n      Candidate: true,\r\n      PoliticalParty: true,\r\n      Donor: true,\r\n      ExpenditureTarget: true,\r\n    },\r\n    from: null,\r\n    payType: null,\r\n    exposeRemark: null,\r\n    returnOrPaytrs: null,\r\n    diffVersionStr: null,\r\n    saveAccountDateBegin: null,\r\n    saveAccountDateEnd: null,\r\n  };\r\n\r\n  queryState: SearchAdvancedQuery & {\r\n    detailSearchTypes: {\r\n      Candidate: boolean;\r\n      PoliticalParty: boolean;\r\n      Donor: boolean;\r\n      ExpenditureTarget: boolean;\r\n    };\r\n  } = { ...this.initialQuery };\r\n\r\n  searchFormData: SearchFormData;\r\n\r\n  refresher$ = new Subject<SearchAdvancedQuery>();\r\n  destroy$ = new Subject<boolean>();\r\n\r\n  rows: AdvancedRow[];\r\n  paging: Paging;\r\n\r\n  get selectedClassTypes(): ClassType[] {\r\n    if (!this.searchFormData) {\r\n      return [];\r\n    }\r\n\r\n    const isCandidate: boolean = this.queryState.detailSearchTypes.Candidate;\r\n    const isParty: boolean = this.queryState.detailSearchTypes.PoliticalParty;\r\n    const isBoth: boolean = isCandidate && isParty;\r\n\r\n    let selectableClassTypes = [];\r\n\r\n    if (isBoth) {\r\n      selectableClassTypes = this.searchFormData.classTypes;\r\n    } else if (isCandidate) {\r\n      selectableClassTypes = this.searchFormData.classTypes.filter(\r\n        (c) => c.type === \"Individual\"\r\n      );\r\n    } else if (isParty) {\r\n      selectableClassTypes = this.searchFormData.classTypes.filter(\r\n        (c) => c.type === \"Group\"\r\n      );\r\n    } else {\r\n      selectableClassTypes = this.searchFormData.classTypes;\r\n    }\r\n\r\n    if (this.queryState.accountingSerial == null) {\r\n      return selectableClassTypes;\r\n    } else {\r\n      const isShouCi: boolean = this.queryState.accountingSerial === 1;\r\n      if (isShouCi) {\r\n        return selectableClassTypes.filter(\r\n          (c: ClassType) => c.ctrlTp !== \"2\" && c.ctrlTp !== \"3\"\r\n        );\r\n      } else {\r\n        return selectableClassTypes.filter(\r\n          (c: ClassType) => c.ctrlTp !== \"0\" && c.ctrlTp !== \"1\"\r\n        );\r\n      }\r\n    }\r\n\r\n    return [];\r\n  }\r\n\r\n  constructor(\r\n    private searchService: SearchService,\r\n    private route: ActivatedRoute,\r\n    @Inject(PLATFORM_ID) private platformId: string\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.searchService\r\n      .getData()\r\n      .pipe(\r\n        tap((res) => (this.searchFormData = res)),\r\n        switchMapTo(this.route.queryParamMap),\r\n        filter((qp: ParamMap) => qp.has(\"keyword\") || qp.has(\"type\")),\r\n        map((qp: ParamMap) => ({\r\n          keyword: qp.has(\"keyword\") ? qp.get(\"keyword\") : null,\r\n          type: qp.has(\"type\") ? qp.get(\"type\") : null,\r\n          year: qp.has(\"year\") ? qp.get(\"year\") : null,\r\n          accountType: qp.has(\"accountType\") ? qp.get(\"accountType\") : null,\r\n          name: qp.has(\"name\") ? qp.get(\"name\") : null,\r\n          serial: qp.has(\"serial\") ? qp.get(\"serial\") : null,\r\n          electionYear: +qp.has(\"electionYear\") ? qp.get(\"electionYear\") : null,\r\n          electionDistrict: qp.has(\"electionDistrict\")\r\n            ? qp.get(\"electionDistrict\")\r\n            : null,\r\n          electionName: qp.has(\"electionName\") ? qp.get(\"electionName\") : null,\r\n          exposeRemark: qp.get(\"exposeRemark\") ? qp.get(\"exposeRemark\") : null,\r\n          diffVersionStr: qp.get(\"diffVersionStr\") ? qp.get(\"diffVersionStr\") : null,\r\n          returnOrPaytrs: qp.get(\"returnOrPaytrs\")\r\n            ? qp.get(\"returnOrPaytrs\")\r\n            : null,\r\n        })),\r\n        tap(\r\n          (params: {\r\n            keyword: string;\r\n            type: \"Group\" | \"Individual\" | \"Election\" | null;\r\n            year: string;\r\n            accountType: string;\r\n            name: string;\r\n            serial: string;\r\n            electionYear: string;\r\n            electionDistrict: string;\r\n            electionName: string;\r\n            from: \"Account\" | \"Election\" | \"PoliticalParty\" | null;\r\n            exposeRemark: string;            \r\n            returnOrPaytrs: string;\r\n            diffVersionStr: string;\r\n          }) => {\r\n            if (params.type != null) {\r\n              this.allDetailSearchTypes = false;\r\n              if (params.type === \"Group\") {\r\n                this.queryState = {\r\n                  ...this.queryState,\r\n                  detailSearchTypes: {\r\n                    ...this.queryState.detailSearchTypes,\r\n                    Candidate: false,\r\n                  },\r\n                  keyword: params.keyword || null,\r\n                  reportedYear: +params.year || null,\r\n                  from: \"PoliticalParty\",\r\n                };\r\n              }\r\n              if (params.type === \"Individual\") {\r\n                this.queryState = {\r\n                  ...this.queryState,\r\n                  detailSearchTypes: {\r\n                    ...this.queryState.detailSearchTypes,\r\n                    PoliticalParty: false,\r\n                  },\r\n                  keyword: params.name || null,\r\n                  accountingSerial: +params.serial || null,\r\n                  electionYear: +params.electionYear || null,\r\n                  electionDistrict: params.electionDistrict || null,\r\n                  electionName: params.electionName || null,\r\n                  from: \"Account\",\r\n                };\r\n\r\n                if (params.electionName != null) {\r\n                  const election = this.searchFormData.elections.find(\r\n                    (e) => e.name === params.electionName\r\n                  );\r\n                  if (election != null) {\r\n                    this.queryState = {\r\n                      ...this.queryState,\r\n                      electionCode: election.code,\r\n                    };\r\n                  }\r\n                }\r\n              }\r\n              if (params.type === \"Election\") {\r\n                this.queryState = {\r\n                  ...this.queryState,\r\n                  detailSearchTypes: {\r\n                    ...this.queryState.detailSearchTypes,\r\n                    PoliticalParty: false,\r\n                  },\r\n                  accountingSerial: +params.serial || null,\r\n                  electionYear: +params.electionYear || null,\r\n                  electionDistrict: params.electionDistrict || null,\r\n                  electionName: params.electionName || null,\r\n                  from: \"Election\",\r\n                };\r\n\r\n                if (params.electionName != null) {\r\n                  const election = this.searchFormData.elections.find(\r\n                    (e) => e.name === params.electionName\r\n                  );\r\n                  if (election != null) {\r\n                    this.queryState = {\r\n                      ...this.queryState,\r\n                      electionCode: election.code,\r\n                    };\r\n                  }\r\n                }\r\n              }\r\n            } else {\r\n              this.queryState = {\r\n                ...this.queryState,\r\n                keyword: params.keyword || null,\r\n              };\r\n            }\r\n          }\r\n        )\r\n      )\r\n      .subscribe(() => {\r\n        this.refresher$.next(this.query);\r\n      });\r\n\r\n    this.refresher$\r\n      .pipe(\r\n        startWith(this.query),\r\n        switchMap((query) =>\r\n          this.searchService.searchAdvanced({\r\n            ...query,\r\n            exposeRemark: query.exposeRemark ? \"Y\" : null,\r\n            diffVersionStr: query.diffVersionStr ? \"Y\" : null,\r\n            // returnOrPaytrs: query.returnOrPaytrs ? \"Y\" : null, //20201216 added\r\n          })\r\n        ),\r\n        catchError(() =>\r\n          of({\r\n            data: [],\r\n            paging: {\r\n              pageNumber: 0,\r\n              pageSize: 0,\r\n              pageCount: 0,\r\n              recordCount: 0,\r\n            },\r\n          })\r\n        ),\r\n        tap((res) => {\r\n          this.rows = res.data;\r\n          this.paging = res.paging;\r\n          this.searchDetailsBtnState = ClrLoadingState.SUCCESS;//2022/08/26\r\n        }),\r\n        takeUntil(this.destroy$)\r\n      )\r\n      .subscribe();\r\n  }\r\n\r\n  onDetailSearchTypesChange($event): void {\r\n    if ($event) {\r\n      this.queryState.detailSearchTypes = (Object.values(\r\n        DetailSearchType\r\n      ).reduce((obj, key) => ({ ...obj, [key]: true }), {}) as unknown) as any;\r\n      this.showPartyFields = true;\r\n      this.showCandidateFields = true;\r\n    }\r\n  }\r\n  onDetailSpecificChange($event: any, field?: string): void {\r\n    if (!$event) {\r\n      this.allDetailSearchTypes = false;\r\n    }\r\n\r\n    if (field != null && field === \"PoliticalParty\") {\r\n      this.showPartyFields = $event;\r\n    }\r\n    if (field != null && field === \"Candidate\") {\r\n      this.showCandidateFields = $event;\r\n    }\r\n  }\r\n\r\n  get query(): SearchAdvancedQuery {\r\n    const {\r\n      detailSearchTypes,\r\n      // transactionDateBegin,\r\n      // transactionDateEnd,\r\n      ...query\r\n    } = this.queryState;\r\n\r\n    return {\r\n      ...query,\r\n      keywordRanges: Object.keys(detailSearchTypes).filter(\r\n        (key) => detailSearchTypes[key]\r\n      ) as DetailSearchType[],\r\n    };\r\n  }\r\n\r\n  onSearch(): void {\r\n    this.queryState = {\r\n      ...this.queryState,\r\n      page: 1,\r\n      from: null,\r\n    };\r\n    this.searchDetailsBtnState = ClrLoadingState.LOADING;\r\n    this.refresher$.next(this.query);\r\n    // this.searchService.searchAdvanced()\r\n    //\r\n  }\r\n\r\n  get filteredElections(): ElectionResource[] {\r\n    if (!this.searchFormData) {\r\n      return [];\r\n    }\r\n\r\n    if (this.queryState.electionYear) {\r\n      return this.searchFormData.elections.filter(\r\n        (e) => e.year === this.queryState.electionYear\r\n      );\r\n    } else {\r\n      return this.searchFormData.elections;\r\n    }\r\n  }\r\n\r\n  onPaginate($event): void {\r\n    this.queryState = {\r\n      ...this.queryState,\r\n      page: $event,\r\n    };\r\n    this.refresher$.next(this.query);\r\n  }\r\n\r\n  onPageSizeChange(): void {\r\n    this.refresher$.next(this.query);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.unsubscribe();\r\n  }\r\n\r\n  get exportLink(): string {\r\n    return \"/api/v1/search/export/\" + buildQueryParams(this.query);\r\n  }\r\n\r\n  onPrint(): void {\r\n    if (isPlatformBrowser(this.platformId)) {\r\n      window.print();\r\n    }\r\n  }\r\n\r\n  onExport(): void {\r\n    //   download(myObj: any) {\r\n    //     this.testService.downloadDoc(myObj.id).subscribe(result => {\r\n\r\n    //         var url = window.URL.createObjectURL(result);\r\n    //         window.open(url);\r\n    //         console.log(\"download result \", result);\r\n    //     });\r\n    // }{\r\n    // alert('start');\r\n\r\n    if (isPlatformBrowser(this.platformId)) {\r\n      this.searchService.exportAdvanced(this.query).subscribe((res) => {\r\n        console.log(res);\r\n        // const url = window.URL.createObjectURL(res);\r\n        // window.open(url);\r\n        // console.log('download result ', res);\r\n      });\r\n    }\r\n  }\r\n}\r\n","module.exports = \"<!-- <pre>{{rows | json}}</pre> -->\\r\\n\\r\\n<div class=\\\"px-1\\\">\\r\\n  <div>\\r\\n    <div class=\\\"row\\\">\\r\\n      <div class=\\\"col-sm-12\\\">\\r\\n        <div class=\\\"table-responsive-md\\\">\\r\\n          <table\\r\\n            class=\\\"table table-striped table-bordered table-sm\\\"\\r\\n            *ngIf=\\\"!isGroup\\\"\\r\\n          >\\r\\n            <thead>\\r\\n              <tr>\\r\\n                <th class=\\\"text-center\\\">序號</th>\\r\\n                <th class=\\\"text-center\\\">選舉名稱</th>\\r\\n                <th class=\\\"text-center\\\">申報序號</th>\\r\\n                <th class=\\\"text-center\\\">縣市別</th>\\r\\n                <th class=\\\"text-center\\\" *ngIf=\\\"type != 'Election'\\\">\\r\\n                  擬參選人姓名\\r\\n                </th>\\r\\n                <th class=\\\"text-center\\\" *ngIf=\\\"showSearch\\\">會計報告書查詢</th>\\r\\n                <th class=\\\"text-center\\\">會計報告書下載</th>\\r\\n                <th class=\\\"text-center\\\">收支結算表下載</th>\\r\\n              </tr>\\r\\n            </thead>\\r\\n            <tbody>\\r\\n              <tr *ngFor=\\\"let row of rows; let i = index\\\">\\r\\n                <td>{{ i + 1 + pageBase }}</td>\\r\\n                <td>\\r\\n                  {{\\r\\n                    type === 'Individual' ? row.electionName2 : row.electionName\\r\\n                  }}\\r\\n                </td>\\r\\n                <td>{{ serialName(row.yearOrSerial) }}</td>\\r\\n                <td>{{ row.electionArea }}</td>\\r\\n                <td *ngIf=\\\"type != 'Election'\\\" style=\\\"WORD-BREAK: break-all;\\\">{{ row.name }}</td>\\r\\n                <td class=\\\"text-center\\\" *ngIf=\\\"showSearch\\\">\\r\\n                  <a\\r\\n                    class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-brown\\\"\\r\\n                    [routerLink]=\\\"['/', 'data', 'search', 'advanced']\\\"\\r\\n                    [queryParams]=\\\"rowQueryParams(row)\\\"\\r\\n                  >\\r\\n                    <i class=\\\"fas fa-search mr-2\\\"></i>會計報告書</a\\r\\n                  >\\r\\n                </td>\\r\\n                <td class=\\\"text-center\\\">\\r\\n                  <div class=\\\"btn-group\\\">\\r\\n                    <a\\r\\n                      class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-grey\\\"\\r\\n                      [href]=\\\"row.downloadZip\\\"\\r\\n                      download\\r\\n                    >\\r\\n                      <i class=\\\"d-none d-md-inline fas fa-file-archive mr-2\\\"></i\\r\\n                      >.CSV</a\\r\\n                    >\\r\\n                  </div>\\r\\n                </td>\\r\\n                <td class=\\\"text-center\\\">\\r\\n                  <div class=\\\"btn-group\\\">\\r\\n                    <a\\r\\n                      class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-blue\\\"\\r\\n                      [href]=\\\"row.downloadPdf\\\"\\r\\n                      download\\r\\n                      ><i class=\\\"d-none d-md-inline fas fa-file-pdf mr-2\\\"></i\\r\\n                      >.PDF</a\\r\\n                    ><a\\r\\n                      [href]=\\\"row.downloadCsv\\\"\\r\\n                      download\\r\\n                      class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-grey\\\"\\r\\n                      ><i class=\\\"d-none d-md-inline fa fa-file-csv mr-2\\\"></i\\r\\n                      >.CSV</a\\r\\n                    >\\r\\n                  </div>\\r\\n                </td>\\r\\n              </tr>\\r\\n            </tbody>\\r\\n          </table>\\r\\n          <table\\r\\n            class=\\\"table table-striped table-bordered table-sm\\\"\\r\\n            *ngIf=\\\"isGroup\\\"\\r\\n          >\\r\\n            <thead>\\r\\n              <tr>\\r\\n                <th class=\\\"text-center\\\">序號</th>\\r\\n                <th class=\\\"text-center\\\">類型</th>\\r\\n                <th class=\\\"text-center\\\" *ngIf=\\\"showName\\\">名稱</th>\\r\\n                <th class=\\\"text-center\\\">申報年度</th>\\r\\n                <th class=\\\"text-center\\\" *ngIf=\\\"showSearch\\\">會計報告書查詢</th>\\r\\n                <th class=\\\"text-center\\\">會計報告書下載</th>\\r\\n                <th class=\\\"text-center\\\">收支結算表下載</th>\\r\\n              </tr>\\r\\n            </thead>\\r\\n            <tbody>\\r\\n              <tr *ngFor=\\\"let row of rows; let i = index\\\">\\r\\n                <td>{{ i + 1 + pageBase }}</td>\\r\\n                <td>政黨、政治團體</td>\\r\\n                <td *ngIf=\\\"showName\\\">{{ row.name }}</td>\\r\\n                <td>{{ row?.yearOrSerial }}</td>\\r\\n                <td *ngIf=\\\"showSearch\\\" class=\\\"text-center\\\">\\r\\n                  <a\\r\\n                    class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-brown\\\"\\r\\n                    [routerLink]=\\\"['/', 'data', 'search', 'advanced']\\\"\\r\\n                    [queryParams]=\\\"rowQueryParams(row)\\\"\\r\\n                  >\\r\\n                    <i class=\\\"d-none d-md-inline fas fa-search mr-2\\\"></i\\r\\n                    >會計報告書</a\\r\\n                  >\\r\\n                </td>\\r\\n                <td class=\\\"text-center\\\">\\r\\n                  <div class=\\\"btn-group\\\">\\r\\n                    <a\\r\\n                      class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-grey\\\"\\r\\n                      [href]=\\\"row.downloadZip\\\"\\r\\n                      download\\r\\n                    >\\r\\n                      <i class=\\\"d-none d-md-inline fas fa-file-archive mr-2\\\"></i\\r\\n                      >.CSV</a\\r\\n                    >\\r\\n                  </div>\\r\\n                </td>\\r\\n                <td class=\\\"text-center\\\">\\r\\n                  <div class=\\\"btn-group\\\">\\r\\n                    <a\\r\\n                      class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-blue\\\"\\r\\n                      [href]=\\\"row.downloadPdf\\\"\\r\\n                      download\\r\\n                      ><i class=\\\"d-none d-md-inline fa fa-file-pdf mr-2\\\"></i\\r\\n                      >.PDF</a\\r\\n                    ><a\\r\\n                      [href]=\\\"row.downloadCsv\\\"\\r\\n                      download\\r\\n                      class=\\\"btn btn-sm mx-0 px-1 px-md-3 btn-grey\\\"\\r\\n                      ><i class=\\\"d-none d-md-inline fas fa-file-csv mr-2\\\"></i\\r\\n                      >.CSV</a\\r\\n                    >\\r\\n                  </div>\\r\\n                </td>\\r\\n              </tr>\\r\\n            </tbody>\\r\\n          </table>\\r\\n        </div>\\r\\n      </div>\\r\\n    </div>\\r\\n    <ng-content></ng-content>\\r\\n  </div>\\r\\n</div>\\r\\n\"","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3NlYXJjaC9zZWFyY2gtZGV0YWlsLXRhYmxlL3NlYXJjaC1kZXRhaWwtdGFibGUuY29tcG9uZW50LnNjc3MifQ== */\"","import { Component, OnInit, Input } from '@angular/core';\r\nimport { DownloadRow, SearchService } from '../search.service';\r\nimport { Router } from '@angular/router';\r\n\r\n@Component({\r\n  selector: 'app-search-detail-table',\r\n  templateUrl: './search-detail-table.component.html',\r\n  styleUrls: ['./search-detail-table.component.scss']\r\n})\r\nexport class SearchDetailTableComponent implements OnInit {\r\n  @Input()\r\n  showName = true;\r\n\r\n  @Input()\r\n  rows: DownloadRow[] = [];\r\n\r\n  @Input()\r\n  showSearch: boolean = true;\r\n\r\n  @Input()\r\n  type: string;\r\n\r\n  @Input()\r\n  currentPage: number = 1;\r\n\r\n  @Input()\r\n  pageSize: number = 10;\r\n\r\n  get pageBase(): number {\r\n    return (this.currentPage - 1) * this.pageSize;\r\n  }\r\n\r\n  get isGroup(): boolean {\r\n    return (this.type && this.type === 'Group') || this.type === 'GroupYearly';\r\n  }\r\n\r\n  serialName(id: number): string {\r\n    switch (id) {\r\n      case 1:\r\n        return '首次';\r\n      case 2:\r\n        return '第一次賸餘';\r\n      case 3:\r\n        return '第二次賸餘';\r\n      case 4:\r\n        return '第三次賸餘';\r\n      case 5:\r\n        return '第四次賸餘';\r\n      case 6:\r\n        return '第五次賸餘';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  // groupType(type: number | string): string {\r\n  //   switch (+type) {\r\n  //     case 1:\r\n  //       return '政黨';\r\n  //     case 2:\r\n  //       return '政治團體';\r\n  //     default:\r\n  //       return '';\r\n  //   }\r\n  // }\r\n\r\n  constructor(private router: Router, private searchService: SearchService) {}\r\n\r\n  ngOnInit() {}\r\n\r\n  rowRouterLink(row): string[] {\r\n    if (this.type === 'Group' || this.type === 'GroupYearly') {\r\n      return ['/', 'data', 'search', 'group'];\r\n    }\r\n    if (this.type === 'Individual') {\r\n      return ['/', 'data', 'search', 'individual'];\r\n    }\r\n    if (this.type === 'Election') {\r\n      return ['/', 'data', 'search', 'election'];\r\n    }\r\n    return [];\r\n  }\r\n\r\n  rowQueryParams(row: DownloadRow): any {\r\n    if (this.type === 'Group') {\r\n      return {\r\n        type: 'Group',\r\n        keyword: row.name,\r\n        name: row.name,\r\n        year: row.yearOrSerial,\r\n        accountType: row.accountType\r\n      };\r\n    }\r\n    if (this.type === 'GroupYearly') {\r\n      return {\r\n        type: 'Group',\r\n        year: row.yearOrSerial,\r\n        accountType: row.accountType\r\n      };\r\n    }\r\n    if (this.type === 'Individual') {\r\n      //\r\n      return {\r\n        type: 'Individual',\r\n        name: row.name,\r\n        serial: row.yearOrSerial,\r\n        electionYear: row.electionYear,\r\n        electionDistrict: row.electionArea,\r\n        electionName: row.electionName\r\n      };\r\n    }\r\n\r\n    if (this.type === 'Election') {\r\n      //\r\n      return {\r\n        type: 'Election',\r\n        serial: row.yearOrSerial,\r\n        electionYear: row.electionYear,\r\n        electionDistrict: row.electionArea,\r\n        electionName: row.electionName\r\n      };\r\n    }\r\n  }\r\n}\r\n","module.exports = \"<ng-container *ngIf=\\\"area\\\">\\r\\n  <app-breadcrumbs *ngIf=\\\"area === 'search'\\\" [breadcrumbs]=\\\"[{title: '資料查詢'}, {title: '選舉查詢'}]\\\"></app-breadcrumbs>\\r\\n  <app-breadcrumbs *ngIf=\\\"area === 'downloads'\\\" [breadcrumbs]=\\\"[{title: '政府開放資料'}, {title: '選舉資料'}]\\\"></app-breadcrumbs>\\r\\n</ng-container>\\r\\n\\r\\n<div class=\\\"container mb-5\\\">\\r\\n  <div class=\\\"row mb-3\\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"card\\\">\\r\\n        <h3 class=\\\"card-header brown white-text\\\">選舉{{area ===\\r\\n          'search' ? '查詢': '資料'}}\\r\\n        </h3>\\r\\n        <div class=\\\"card-body\\\">\\r\\n          <div class=\\\"input-group\\\">\\r\\n            <input class=\\\"form-control form-control-lg\\\" type=\\\"text\\\"\\r\\n              [(ngModel)]=\\\"queryState.keyword\\\" placeholder=\\\"選舉名稱關鍵字\\\">\\r\\n            <div class=\\\"input-group-append\\\">\\r\\n              <div class=\\\"btn-group\\\" role=\\\"group\\\">\\r\\n                <button class=\\\"btn btn-brown mx-0 black-text\\\" (click)=\\\"onSearch()\\\"\\r\\n                  type=\\\"button\\\"><i class=\\\"fas fa-search\\\"></i>查詢</button>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n          <div class=\\\"form-row w-100\\\">\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">選舉年度</label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.electionYear\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                  <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n\\r\\n                    <option *ngFor=\\\"let year of searchFormData.electionYears\\\"\\r\\n                      [ngValue]=\\\"year\\\">{{year}}</option>\\r\\n                  </ng-container>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">選舉名稱</label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.electionName\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n\\r\\n                  <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                    <option *ngFor=\\\"let election of filteredElections\\\"\\r\\n                      [ngValue]=\\\"election.name\\\">{{election.name}}</option>\\r\\n                  </ng-container>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">申報序號 </label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.serial\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                  <option [ngValue]=\\\"1\\\">首次</option>\\r\\n                  <option [ngValue]=\\\"2\\\">第一次賸餘</option>\\r\\n                  <option [ngValue]=\\\"3\\\">第二次賸餘</option>\\r\\n                  <option [ngValue]=\\\"4\\\">第三次賸餘</option>\\r\\n                  <option [ngValue]=\\\"5\\\">第四次賸餘</option>\\r\\n                  <option [ngValue]=\\\"6\\\">第五次賸餘</option>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">縣市別</label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.electionDistrictName\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                  <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                    <option *ngFor=\\\"let dist of searchFormData.electionDistricts\\\"\\r\\n                      [ngValue]=\\\"dist\\\">{{dist}}</option>\\r\\n                  </ng-container>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n        </div>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n  <div class=\\\"row\\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"p-2 z-depth-2\\\" *ngIf=\\\"paging\\\">\\r\\n        <app-search-detail-table [type]=\\\"'Election'\\\" [rows]=\\\"rows\\\"\\r\\n          [currentPage]=\\\"paging.pageNumber\\\" [showSearch]=\\\"area === 'search'\\\"\\r\\n          [pageSize]=\\\"paging.pageSize\\\">\\r\\n\\r\\n          <div class=\\\"d-flex my-2 align-items-center\\\">\\r\\n            <div class=\\\"form-group my-0\\\">\\r\\n              <div class=\\\"input-group\\\">\\r\\n                <div class=\\\"input-group-prepend\\\">\\r\\n                  <label class=\\\"input-group-text\\\">每頁</label>\\r\\n                </div>\\r\\n                <select class=\\\"form-control\\\" (change)=\\\"onPageSizeChange()\\\"\\r\\n                  [(ngModel)]=\\\"queryState.pageSize\\\">\\r\\n                  <option [value]=\\\"10\\\">10</option>\\r\\n                  <option [value]=\\\"50\\\">50</option>\\r\\n                  <option [value]=\\\"100\\\">100</option>\\r\\n                  <option [value]=\\\"500\\\">500</option>\\r\\n                </select>\\r\\n                <div class=\\\"input-group-append\\\">\\r\\n                  <label class=\\\"input-group-text\\\">筆</label>\\r\\n                </div>\\r\\n              </div>\\r\\n            </div>\\r\\n            <app-pagination [paging]=\\\"paging\\\" (pageChange)=\\\"onPaginate($event)\\\"></app-pagination>\\r\\n            共{{paging?.recordCount}}筆\\r\\n          </div>\\r\\n        </app-search-detail-table>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n</div>\\r\\n\"","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3NlYXJjaC9zZWFyY2gtZWxlY3Rpb24vc2VhcmNoLWVsZWN0aW9uLmNvbXBvbmVudC5zY3NzIn0= */\"","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport {\r\n  SearchFormData,\r\n  SearchElectionAndIndividualQuery,\r\n  DownloadRow,\r\n  SearchService,\r\n  ElectionResource\r\n} from '../search.service';\r\nimport { Subject } from 'rxjs';\r\nimport { List, Paging } from 'src/app/generics';\r\nimport {\r\n  startWith,\r\n  switchMap,\r\n  tap,\r\n  takeUntil,\r\n  map,\r\n  filter,\r\n  first,\r\n  switchMapTo\r\n} from 'rxjs/operators';\r\nimport { ActivatedRoute, ParamMap } from '@angular/router';\r\n\r\n@Component({\r\n  selector: 'app-search-election',\r\n  templateUrl: './search-election.component.html',\r\n  styleUrls: ['./search-election.component.scss']\r\n})\r\nexport class SearchElectionComponent implements OnInit, OnDestroy {\r\n  area: 'search' | 'downloads' | null = null;\r\n  searchFormData: SearchFormData;\r\n\r\n  initialState: SearchElectionAndIndividualQuery = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    electionName: null,\r\n    electionYear: null,\r\n    electionDistrictName: null,\r\n    serial: null,\r\n    keyword: null\r\n  };\r\n\r\n  refresher$ = new Subject<SearchElectionAndIndividualQuery>();\r\n  destroy$ = new Subject<boolean>();\r\n\r\n  queryState: SearchElectionAndIndividualQuery = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    electionName: null,\r\n    electionYear: null,\r\n    electionDistrictName: null,\r\n    serial: null,\r\n    keyword: null\r\n  };\r\n\r\n  data: List<DownloadRow>;\r\n  rows: DownloadRow[] = [];\r\n  paging: Paging | null = null;\r\n\r\n  constructor(\r\n    private searchService: SearchService,\r\n    private route: ActivatedRoute\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.route.data\r\n      .pipe(\r\n        map(data => data.area),\r\n        filter(d => d != null),\r\n        tap(area => (this.area = area)),\r\n        first()\r\n      )\r\n      .subscribe();\r\n\r\n    this.searchService\r\n      .getData()\r\n      \r\n      .pipe(\r\n        tap(res => (this.searchFormData = res)),\r\n        switchMapTo(this.route.queryParamMap),\r\n        map((qp: ParamMap) => ({\r\n          year: qp.has('year') ? +qp.get('year') : null,\r\n          name: qp.has('name') ? qp.get('name') : null,\r\n          district: qp.has('district') ? qp.get('district') : null\r\n        })),\r\n        tap((params: { year: number; name: string; district: string }) => {\r\n          const { year, name, district } = params;\r\n          this.queryState = {\r\n            ...this.queryState,\r\n            electionName: name != null ? name : null,\r\n            electionYear: year != null ? year : null,\r\n            electionDistrictName: district != null ? district : null\r\n          };\r\n        })\r\n      )\r\n      .subscribe();\r\n      \r\n    \r\n    this.refresher$\r\n      .pipe(\r\n        startWith(this.initialState),\r\n        switchMap(q => this.searchService.searchElections(q)),\r\n        tap(res => {\r\n          this.rows = res.data;\r\n          this.paging = res.paging;\r\n        }),\r\n        takeUntil(this.destroy$)\r\n      )\r\n      .subscribe();\r\n      \r\n  }\r\n\r\n  onSearch(): void {\r\n    this.queryState = {\r\n      ...this.queryState,\r\n      page: 1\r\n    };\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n\r\n  onPaginate($event: number): void {\r\n    this.queryState = { ...this.queryState, page: $event };\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.unsubscribe();\r\n  }\r\n\r\n  get filteredElections(): ElectionResource[] {\r\n    // return this\r\n\r\n    if (this.searchFormData) {\r\n      if (this.queryState.electionYear) {\r\n        return this.searchFormData.elections.filter(\r\n          e => +e.year === this.queryState.electionYear\r\n        );\r\n      } else {\r\n        return this.searchFormData.elections;\r\n      }\r\n    }\r\n    return [];\r\n  }\r\n\r\n  onPageSizeChange(): void {\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n}\r\n","module.exports = \"<ng-container *ngIf=\\\"area\\\">\\r\\n  <app-breadcrumbs\\r\\n    *ngIf=\\\"area === 'search'\\\"\\r\\n    [breadcrumbs]=\\\"[\\r\\n      { title: '資料查詢' },\\r\\n      { title: '政黨查詢', link: ['/', 'data', 'search', 'group'] },\\r\\n      { title: '年度查詢' }\\r\\n    ]\\\"\\r\\n  ></app-breadcrumbs>\\r\\n  <app-breadcrumbs\\r\\n    *ngIf=\\\"area === 'downloads'\\\"\\r\\n    [breadcrumbs]=\\\"[\\r\\n      { title: '政府開放資料' },\\r\\n      { title: '政黨資料', link: ['/', 'data', 'downloads', 'group'] },\\r\\n      { title: '年度資料' }\\r\\n    ]\\\"\\r\\n  ></app-breadcrumbs>\\r\\n</ng-container>\\r\\n\\r\\n<div class=\\\"container pb-5 mb-5\\\">\\r\\n  <div class=\\\"row mb-3\\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"card\\\">\\r\\n        <h3 class=\\\"card-header brown text-white\\\">\\r\\n          政黨年度\\r\\n          {{ area === 'search' ? '查詢' : '資料' }}\\r\\n        </h3>\\r\\n        <div class=\\\"card-body\\\">\\r\\n          <div class=\\\"input-group\\\">\\r\\n            <select\\r\\n              [(ngModel)]=\\\"queryState.year\\\"\\r\\n              class=\\\"form-control form-control-lg\\\"\\r\\n            >\\r\\n              <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                <option\\r\\n                  *ngFor=\\\"let year of searchFormData.reportYears\\\"\\r\\n                  [ngValue]=\\\"year\\\"\\r\\n                  >{{ year }}</option\\r\\n                >\\r\\n              </ng-container>\\r\\n            </select>\\r\\n\\r\\n            <div class=\\\"input-group-append\\\">\\r\\n              <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"查詢條件\\\">\\r\\n                <button\\r\\n                  class=\\\"btn btn-brown m-0 black-text\\\"\\r\\n                  type=\\\"button\\\"\\r\\n                  (click)=\\\"onSearch()\\\"\\r\\n                >\\r\\n                  <i class=\\\"fas fa-search\\\"></i> 查詢\\r\\n                </button>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n        </div>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n  <div class=\\\"row \\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"card\\\">\\r\\n        <div class=\\\"card-body px-1\\\">\\r\\n          <app-search-detail-table\\r\\n            *ngIf=\\\"data\\\"\\r\\n            [showName]=\\\"false\\\"\\r\\n            [rows]=\\\"data.data\\\"\\r\\n            [type]=\\\"'GroupYearly'\\\"\\r\\n            [showSearch]=\\\"area === 'search'\\\"\\r\\n            [currentPage]=\\\"data.paging.pageNumber\\\"\\r\\n            [pageSize]=\\\"data.paging.pageSize\\\"\\r\\n          >\\r\\n            <div class=\\\"d-flex my-2 align-items-center\\\">\\r\\n              <div class=\\\"form-group my-0\\\">\\r\\n                <div class=\\\"input-group\\\">\\r\\n                  <div class=\\\"input-group-prepend\\\">\\r\\n                    <label class=\\\"input-group-text\\\">每頁</label>\\r\\n                  </div>\\r\\n                  <select\\r\\n                    class=\\\"form-control\\\"\\r\\n                    (change)=\\\"onPageSizeChange()\\\"\\r\\n                    [(ngModel)]=\\\"queryState.pageSize\\\"\\r\\n                  >\\r\\n                    <option [value]=\\\"10\\\">10</option>\\r\\n                    <option [value]=\\\"50\\\">50</option>\\r\\n                    <option [value]=\\\"100\\\">100</option>\\r\\n                    <option [value]=\\\"500\\\">500</option>\\r\\n                  </select>\\r\\n                  <div class=\\\"input-group-append\\\">\\r\\n                    <label class=\\\"input-group-text\\\">筆</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <app-pagination\\r\\n                [paging]=\\\"data.paging\\\"\\r\\n                (pageChange)=\\\"onPaginate($event)\\\"\\r\\n              ></app-pagination>\\r\\n              共{{ data.paging?.recordCount }}筆\\r\\n            </div>\\r\\n          </app-search-detail-table>\\r\\n        </div>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n</div>\\r\\n\"","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3NlYXJjaC9zZWFyY2gtZ3JvdXAteWVhcmx5L3NlYXJjaC1ncm91cC15ZWFybHkuY29tcG9uZW50LnNjc3MifQ== */\"","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport {\r\n  SearchFormData,\r\n  SearchPartyYearQuery,\r\n  DownloadRow,\r\n  SearchService\r\n} from '../search.service';\r\nimport { Subject } from 'rxjs';\r\nimport { List } from 'src/app/generics';\r\nimport { ActivatedRoute, ParamMap } from '@angular/router';\r\nimport {\r\n  map,\r\n  filter,\r\n  tap,\r\n  first,\r\n  switchMapTo,\r\n  startWith,\r\n  switchMap,\r\n  takeUntil\r\n} from 'rxjs/operators';\r\n\r\n@Component({\r\n  selector: 'app-search-group-yearly',\r\n  templateUrl: './search-group-yearly.component.html',\r\n  styleUrls: ['./search-group-yearly.component.scss']\r\n})\r\nexport class SearchGroupYearlyComponent implements OnInit, OnDestroy {\r\n  searchFormData: SearchFormData;\r\n\r\n  area: 'search' | 'downloads' | null = null;\r\n\r\n  initialState: SearchPartyYearQuery = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    year: null\r\n  };\r\n\r\n  refresher$ = new Subject<SearchPartyYearQuery>();\r\n  destroy$ = new Subject<boolean>();\r\n\r\n  queryState: SearchPartyYearQuery = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    year: null\r\n  };\r\n\r\n  data: List<DownloadRow>;\r\n\r\n  constructor(\r\n    private searchService: SearchService,\r\n    private route: ActivatedRoute\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.route.data\r\n      .pipe(\r\n        map(data => data.area),\r\n        filter(d => d != null),\r\n        tap(area => (this.area = area)),\r\n        first()\r\n      )\r\n      .subscribe();\r\n\r\n    this.searchService\r\n      .getData()\r\n      .pipe(\r\n        tap(res => (this.searchFormData = res)),\r\n        switchMapTo(this.route.queryParamMap),\r\n        map((qp: ParamMap) => ({\r\n          year: qp.has('year') ? +qp.get('year') : null\r\n        })),\r\n        tap((params: { year?: number }) => {\r\n          this.queryState = {\r\n            ...this.queryState,\r\n            year: params.year\r\n          };\r\n        })\r\n      )\r\n      .subscribe();\r\n\r\n    this.refresher$\r\n      .pipe(\r\n        startWith(this.initialState),\r\n        switchMap(q => this.searchService.searchPartiesByYear(q)),\r\n        tap(res => (this.data = res)),\r\n        takeUntil(this.destroy$)\r\n      )\r\n      .subscribe();\r\n  }\r\n\r\n  onSearch(): void {\r\n    this.queryState = {\r\n      ...this.queryState,\r\n      page: 1\r\n    };\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n\r\n  onPaginate($event: number): void {\r\n    this.queryState = { ...this.queryState, page: $event };\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.unsubscribe();\r\n  }\r\n\r\n  onPageSizeChange(): void {\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n}\r\n","module.exports = \"<ng-container *ngIf=\\\"area\\\">\\r\\n  <app-breadcrumbs\\r\\n    *ngIf=\\\"area === 'search'\\\"\\r\\n    [breadcrumbs]=\\\"[{ title: '資料查詢' }, { title: '政黨查詢' }]\\\"\\r\\n  ></app-breadcrumbs>\\r\\n  <app-breadcrumbs\\r\\n    *ngIf=\\\"area === 'downloads'\\\"\\r\\n    [breadcrumbs]=\\\"[{ title: '政府開放資料' }, { title: '政黨資料' }]\\\"\\r\\n  ></app-breadcrumbs>\\r\\n</ng-container>\\r\\n\\r\\n<div class=\\\"container pb-5 mb-5\\\">\\r\\n  <div class=\\\"row mb-3\\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"card\\\">\\r\\n        <h3 class=\\\"card-header brown text-white\\\">\\r\\n          政黨\\r\\n          {{ area === 'search' ? '查詢' : '資料' }}\\r\\n        </h3>\\r\\n        <div class=\\\"card-body\\\">\\r\\n          <div class=\\\"input-group\\\">\\r\\n            <select\\r\\n              [(ngModel)]=\\\"queryState.party\\\"\\r\\n              class=\\\"form-control form-control-lg\\\"\\r\\n            >\\r\\n              <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                <option\\r\\n                  *ngFor=\\\"let party of searchFormData.parties\\\"\\r\\n                  [ngValue]=\\\"party\\\"\\r\\n                  >{{ party.pptNm }}</option\\r\\n                >\\r\\n              </ng-container>\\r\\n            </select>\\r\\n            <div class=\\\"input-group-append\\\">\\r\\n              <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"查詢條件\\\">\\r\\n                <button\\r\\n                  class=\\\"btn btn-brown m-0 black-text\\\"\\r\\n                  type=\\\"button\\\"\\r\\n                  (click)=\\\"onSearch()\\\"\\r\\n                >\\r\\n                  <i class=\\\"fas fa-search\\\"></i> 查詢\\r\\n                </button>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n          <div class=\\\"row\\\">\\r\\n            <div class=\\\"col-md-6 col-lg-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">申報年度</label>\\r\\n                <select [(ngModel)]=\\\"queryState.year\\\" class=\\\"form-control\\\">\\r\\n                  <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                    <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                    <option\\r\\n                      *ngFor=\\\"let year of searchFormData.reportYears\\\"\\r\\n                      [ngValue]=\\\"year\\\"\\r\\n                      >{{ year }}</option\\r\\n                    >\\r\\n                  </ng-container>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n            <div class=\\\"col\\\">\\r\\n              <div class=\\\"alert alert-info\\\" style=\\\"margin-top: 1rem;\\\">\\r\\n                <a [routerLink]=\\\"['/', 'data', area, 'group', 'yearly']\\\">\\r\\n                  <i class=\\\"fa fa-info-circle mr-2\\\"></i>\\r\\n\\t\\t\\t\\t  依申報年度,{{ area === 'search' ? '查詢' : '下載' }}當年度所有政黨會計報告書資料\\r\\n\\t\\t\\t\\t</a>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n        </div>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n  <div class=\\\"row \\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"card\\\">\\r\\n        <div class=\\\"card-body px-1\\\">\\r\\n          <app-search-detail-table\\r\\n            *ngIf=\\\"data\\\"\\r\\n            [rows]=\\\"data.data\\\"\\r\\n            [type]=\\\"'Group'\\\"\\r\\n            [showSearch]=\\\"area === 'search'\\\"\\r\\n            [currentPage]=\\\"data.paging.pageNumber\\\"\\r\\n            [pageSize]=\\\"data.paging.pageSize\\\"\\r\\n          >\\r\\n            <div class=\\\"d-flex my-2 align-items-center\\\">\\r\\n              <div class=\\\"form-group my-0\\\">\\r\\n                <div class=\\\"input-group\\\">\\r\\n                  <div class=\\\"input-group-prepend\\\">\\r\\n                    <label class=\\\"input-group-text\\\">每頁</label>\\r\\n                  </div>\\r\\n                  <select\\r\\n                    class=\\\"form-control\\\"\\r\\n                    (change)=\\\"onPageSizeChange()\\\"\\r\\n                    [(ngModel)]=\\\"queryState.pageSize\\\"\\r\\n                  >\\r\\n                    <option [value]=\\\"10\\\">10</option>\\r\\n                    <option [value]=\\\"50\\\">50</option>\\r\\n                    <option [value]=\\\"100\\\">100</option>\\r\\n                    <option [value]=\\\"500\\\">500</option>\\r\\n                  </select>\\r\\n                  <div class=\\\"input-group-append\\\">\\r\\n                    <label class=\\\"input-group-text\\\">筆</label>\\r\\n                  </div>\\r\\n                </div>\\r\\n              </div>\\r\\n              <app-pagination\\r\\n                [paging]=\\\"data.paging\\\"\\r\\n                (pageChange)=\\\"onPaginate($event)\\\"\\r\\n              ></app-pagination>\\r\\n              共{{ data.paging?.recordCount }}筆\\r\\n            </div>\\r\\n          </app-search-detail-table>\\r\\n        </div>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n</div>\\r\\n\"","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3NlYXJjaC9zZWFyY2gtZ3JvdXAvc2VhcmNoLWdyb3VwLmNvbXBvbmVudC5zY3NzIn0= */\"","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport {\r\n  SearchService,\r\n  Party,\r\n  SearchFormData,\r\n  SearchPartyQuery,\r\n  DownloadRow,\r\n  AccountType\r\n} from '../search.service';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport {\r\n  map,\r\n  tap,\r\n  switchMap,\r\n  startWith,\r\n  takeUntil,\r\n  filter,\r\n  first,\r\n  withLatestFrom,\r\n  switchMapTo\r\n} from 'rxjs/operators';\r\nimport { List } from 'src/app/generics';\r\nimport { ActivatedRoute, ParamMap } from '@angular/router';\r\nimport { ClrLoadingState } from \"@clr/angular\";//2023\r\n\r\n@Component({\r\n  selector: 'app-search-group',\r\n  templateUrl: './search-group.component.html',\r\n  styleUrls: ['./search-group.component.scss']\r\n})\r\nexport class SearchGroupComponent implements OnInit, OnDestroy {\r\n  selectedParty: Party | null = null;\r\n  searchFormData: SearchFormData;\r\n\r\n  area: 'search' | 'downloads' | null = null;\r\n\r\n  searchDetailsBtnState: ClrLoadingState = ClrLoadingState.DEFAULT;\r\n\r\n  initialState: SearchPartyQuery & { party: Party } = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    year: null,\r\n    party: null,\r\n    pptCd: null,\r\n    acctTp: null\r\n  };\r\n\r\n  refresher$ = new Subject<SearchPartyQuery>();\r\n  destroy$ = new Subject<boolean>();\r\n\r\n  queryState: SearchPartyQuery & { party: Party } = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    year: null,\r\n    party: null,\r\n    pptCd: null,\r\n    acctTp: null\r\n  };\r\n\r\n  get queryStateAsQuery(): SearchPartyQuery {\r\n    const { party, ...query } = this.queryState;\r\n    const q: SearchPartyQuery = { ...query };\r\n    if (party != null) {\r\n      q.pptCd = party.pptCd;\r\n      q.acctTp = party.acctTp;\r\n    }\r\n\r\n    return q;\r\n  }\r\n\r\n  data: List<DownloadRow>;\r\n  // parties$: Observable<Party[]>;\r\n\r\n  constructor(\r\n    private searchService: SearchService,\r\n    private route: ActivatedRoute\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    \r\n    this.route.data\r\n      .pipe(\r\n        map(data => data.area),\r\n        filter(d => d != null),\r\n        tap(area => (this.area = area)),\r\n        first()\r\n      )\r\n      .subscribe();\r\n      \r\n    this.searchService\r\n      .getData()\r\n      .pipe(\r\n        tap(res => (this.searchFormData = res)),\r\n        switchMapTo(this.route.queryParamMap),\r\n        map((qp: ParamMap) => ({\r\n          name: qp.has('name') ? qp.get('name') : null,\r\n          year: qp.has('year') ? +qp.get('year') : null,\r\n          pptCd: qp.has('pptCd') ? +qp.get('pptCd') : null,\r\n          acctTp: qp.has('acctTp') ? qp.get('acctTp') : null\r\n        })),\r\n        tap(\r\n          (params: {\r\n            name?: string;\r\n            year?: number;\r\n            pptCd?: number;\r\n            accountType?: string;\r\n          }) => {\r\n            // NOTE: year can be null\r\n            // either can be null,\r\n            // console.log(params);\r\n\r\n            const { name, year, pptCd, accountType } = params;\r\n            let party = this.searchFormData.parties.find(p => p.pptNm === name);\r\n            if (\r\n              party == null &&\r\n              params.pptCd != null &&\r\n              params.accountType != null\r\n            ) {\r\n              party = this.searchFormData.parties.find(\r\n                p => p.pptCd === pptCd && p.acctTp === accountType\r\n              );\r\n            }\r\n\r\n            // if year, patch year\r\n            // if has name , patch party\r\n            // if  has pptCd && acctTp, patch party\r\n\r\n            this.queryState = {\r\n              ...this.queryState,\r\n              party: party != null ? party : null,\r\n              year,\r\n              pptCd: party != null ? party.pptCd : null,\r\n              acctTp: party != null ? party.acctTp : null\r\n            };\r\n          }\r\n        )\r\n    )\r\n      .subscribe();\r\n\r\n    this.refresher$\r\n      .pipe(\r\n        startWith(this.initialState),\r\n        switchMap(q => this.searchService.searchParties(q)),\r\n        //tap(res => (this.data = res)),\r\n        tap((res) => {\r\n          this.data = res;\r\n          this.searchDetailsBtnState = ClrLoadingState.SUCCESS;//2022/08/26\r\n        }),\r\n        takeUntil(this.destroy$)\r\n      )\r\n      .subscribe();\r\n  }\r\n\r\n  onSearch(): void {\r\n    this.queryState = {\r\n      ...this.queryState,\r\n      page: 1\r\n    };\r\n    this.searchDetailsBtnState = ClrLoadingState.LOADING;//2023\r\n    this.refresher$.next(this.queryStateAsQuery);\r\n  }\r\n\r\n  onPaginate($event: number): void {\r\n    this.queryState = { ...this.queryState, page: $event };\r\n    this.refresher$.next(this.queryStateAsQuery);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.unsubscribe();\r\n  }\r\n\r\n  onPageSizeChange(): void {\r\n    this.refresher$.next(this.queryStateAsQuery);\r\n  }\r\n}\r\n","module.exports = \"<ng-container *ngIf=\\\"area\\\">\\r\\n  <app-breadcrumbs *ngIf=\\\"area === 'search'\\\" [breadcrumbs]=\\\"[{title: '資料查詢'}, {title: '專戶查詢'}]\\\"></app-breadcrumbs>\\r\\n  <app-breadcrumbs *ngIf=\\\"area === 'downloads'\\\" [breadcrumbs]=\\\"[{title: '政府開放資料'}, {title: '專戶資料'}]\\\"></app-breadcrumbs>\\r\\n</ng-container>\\r\\n\\r\\n<div class=\\\"container mb-5\\\">\\r\\n  <div class=\\\"row mb-3\\\">\\r\\n    <div class=\\\"col\\\"><a class=\\\"card\\\">\\r\\n        <h3 class=\\\"card-header brown white-text\\\">專戶\\r\\n          {{area === 'search' ? '查詢': '資料'}}\\r\\n        </h3>\\r\\n        <div class=\\\"card-body\\\">\\r\\n          <div class=\\\"input-group\\\">\\r\\n            <input class=\\\"form-control form-control-lg\\\" type=\\\"text\\\"\\r\\n              [(ngModel)]=\\\"queryState.keyword\\\" placeholder=\\\"專戶設立申請人姓名\\\">\\r\\n            <div class=\\\"input-group-append\\\">\\r\\n              <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"政黨或政治團體名稱\\\">\\r\\n                <button class=\\\"btn btn-brown mx-0 black-text\\\" (click)=\\\"onSearch()\\\"\\r\\n                  type=\\\"button\\\"><i class=\\\"fas fa-search\\\"></i>查詢</button>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n          <div class=\\\"form-row w-100\\\">\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">選舉年度</label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.electionYear\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                  <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n\\r\\n                    <option *ngFor=\\\"let year of searchFormData.electionYears\\\"\\r\\n                      [ngValue]=\\\"year\\\">{{year}}</option>\\r\\n                  </ng-container>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">選舉名稱</label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.electionName\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n\\r\\n                  <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                    <option *ngFor=\\\"let election of filteredElections\\\"\\r\\n                      [ngValue]=\\\"election.name\\\">{{election.name}}</option>\\r\\n                  </ng-container>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">申報序號 </label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.serial\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                  <option value=\\\"1\\\">首次</option>\\r\\n                  <option value=\\\"2\\\">第一次賸餘</option>\\r\\n                  <option value=\\\"3\\\">第二次賸餘</option>\\r\\n                  <option value=\\\"4\\\">第三次賸餘</option>\\r\\n                  <option value=\\\"5\\\">第四次賸餘</option>\\r\\n                  <option value=\\\"6\\\">第五次賸餘</option>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n            <div class=\\\"col-md-3\\\">\\r\\n              <div class=\\\"form-group\\\">\\r\\n                <label class=\\\"grey-text\\\">縣市別</label>\\r\\n                <select class=\\\"form-control\\\" [(ngModel)]=\\\"queryState.electionDistrictName\\\">\\r\\n                  <option [ngValue]=\\\"null\\\">全部</option>\\r\\n                  <ng-container *ngIf=\\\"searchFormData\\\">\\r\\n                    <option *ngFor=\\\"let dist of searchFormData.electionDistricts\\\"\\r\\n                      [ngValue]=\\\"dist\\\">{{dist}}</option>\\r\\n                  </ng-container>\\r\\n                </select>\\r\\n              </div>\\r\\n            </div>\\r\\n          </div>\\r\\n        </div>\\r\\n      </a></div>\\r\\n  </div>\\r\\n  <div class=\\\"row\\\">\\r\\n    <div class=\\\"col\\\">\\r\\n      <div class=\\\"p-2 z-depth-2\\\" *ngIf=\\\"paging\\\">\\r\\n        <app-search-detail-table [type]=\\\"'Individual'\\\" [rows]=\\\"rows\\\"\\r\\n                                 [currentPage]=\\\"paging.pageNumber\\\" [showSearch]=\\\"area === 'search'\\\"\\r\\n                                 [pageSize]=\\\"paging.pageSize\\\">\\r\\n          <div class=\\\"d-flex my-2 align-items-center\\\">\\r\\n            <div class=\\\"form-group my-0\\\">\\r\\n              <div class=\\\"input-group\\\">\\r\\n                <div class=\\\"input-group-prepend\\\">\\r\\n                  <label class=\\\"input-group-text\\\">每頁</label>\\r\\n                </div>\\r\\n                <select class=\\\"form-control\\\" (change)=\\\"onPageSizeChange()\\\"\\r\\n                        [(ngModel)]=\\\"queryState.pageSize\\\">\\r\\n                  <option [value]=\\\"10\\\">10</option>\\r\\n                  <option [value]=\\\"50\\\">50</option>\\r\\n                  <option [value]=\\\"100\\\">100</option>\\r\\n                  <option [value]=\\\"500\\\">500</option>\\r\\n                </select>\\r\\n                <div class=\\\"input-group-append\\\">\\r\\n                  <label class=\\\"input-group-text\\\">筆</label>\\r\\n                </div>\\r\\n              </div>\\r\\n            </div>\\r\\n            <app-pagination [paging]=\\\"paging\\\" (pageChange)=\\\"onPaginate($event)\\\"></app-pagination>\\r\\n            共{{paging?.recordCount}}筆\\r\\n          </div>\\r\\n        </app-search-detail-table>\\r\\n      </div>\\r\\n    </div>\\r\\n  </div>\\r\\n</div>\\r\\n\"","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3NlYXJjaC9zZWFyY2gtaW5kaXZpZHVhbC9zZWFyY2gtaW5kaXZpZHVhbC5jb21wb25lbnQuc2NzcyJ9 */\"","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport {\r\n  SearchService,\r\n  SearchFormData,\r\n  DownloadRow,\r\n  SearchElectionAndIndividualQuery,\r\n  ElectionResource\r\n} from '../search.service';\r\nimport { Subject } from 'rxjs';\r\nimport { List, Paging } from 'src/app/generics';\r\nimport {\r\n  startWith,\r\n  switchMap,\r\n  tap,\r\n  takeUntil,\r\n  map,\r\n  first,\r\n  filter,\r\n  switchMapTo\r\n} from 'rxjs/operators';\r\nimport { ActivatedRoute, ParamMap } from '@angular/router';\r\n\r\n@Component({\r\n  selector: 'app-search-individual',\r\n  templateUrl: './search-individual.component.html',\r\n  styleUrls: ['./search-individual.component.scss']\r\n})\r\nexport class SearchIndividualComponent implements OnInit, OnDestroy {\r\n  searchFormData: SearchFormData;\r\n  area: 'search' | 'downloads' | null = null;\r\n  initialState: SearchElectionAndIndividualQuery = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    electionName: null,\r\n    electionYear: null,\r\n    electionDistrictName: null,\r\n    serial: null,\r\n    keyword: null\r\n  };\r\n\r\n  refresher$ = new Subject<SearchElectionAndIndividualQuery>();\r\n  destroy$ = new Subject<boolean>();\r\n\r\n  queryState: SearchElectionAndIndividualQuery = {\r\n    page: 1,\r\n    pageSize: 50,\r\n    electionName: null,\r\n    electionYear: null,\r\n    electionDistrictName: null,\r\n    serial: null,\r\n    keyword: null\r\n  };\r\n\r\n  data: List<DownloadRow>;\r\n  rows: DownloadRow[] = [];\r\n  paging: Paging | null = null;\r\n\r\n  constructor(\r\n    private searchService: SearchService,\r\n    private route: ActivatedRoute\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.route.data\r\n      .pipe(\r\n        map(data => data.area),\r\n        filter(d => d != null),\r\n        tap(area => (this.area = area)),\r\n        first()\r\n      )\r\n      .subscribe();\r\n    this.refresher$\r\n      .pipe(\r\n        startWith(this.initialState),\r\n        switchMap(q => this.searchService.searchIndividuals(q)),\r\n        tap(res => {\r\n          this.rows = res.data;\r\n          this.paging = res.paging;\r\n        }),\r\n        takeUntil(this.destroy$)\r\n      )\r\n      .subscribe();\r\n\r\n    this.searchService\r\n      .getData()\r\n      .pipe(\r\n        tap(res => (this.searchFormData = res)),\r\n        switchMapTo(this.route.queryParamMap),\r\n        map((qp: ParamMap) => ({\r\n          keyword: qp.has('keyword') ? qp.get('keyword') : null,\r\n          year: qp.has('year') ? +qp.get('year') : null,\r\n          electionName: qp.has('electionName') ? qp.get('electionName') : null,\r\n          serial: qp.has('serial') ? qp.get('serial') : null,\r\n          district: qp.has('district') ? qp.get('district') : null\r\n        })),\r\n        tap(\r\n          (params: {\r\n            keyword?: string;\r\n            year?: number;\r\n            electionName?: string;\r\n            serial?: string;\r\n            district?: string;\r\n          }) => {\r\n            this.queryState = {\r\n              ...this.queryState,\r\n              keyword: params.keyword || null,\r\n              serial: params.serial || null,\r\n              electionYear: params.year || null,\r\n              electionDistrictName: params.district || null,\r\n              electionName: params.electionName || null\r\n            };\r\n          }\r\n        )\r\n      )\r\n      .subscribe();\r\n  }\r\n\r\n  onSearch(): void {\r\n    this.queryState = {\r\n      ...this.queryState,\r\n      page: 1\r\n    };\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n\r\n  onPaginate($event: number): void {\r\n    this.queryState = { ...this.queryState, page: $event };\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.unsubscribe();\r\n  }\r\n\r\n  get filteredElections(): ElectionResource[] {\r\n    // return this\r\n\r\n    if (this.searchFormData) {\r\n      if (this.queryState.electionYear) {\r\n        return this.searchFormData.elections.filter(\r\n          e => +e.year === this.queryState.electionYear\r\n        );\r\n      } else {\r\n        return this.searchFormData.elections;\r\n      }\r\n    }\r\n    return [];\r\n  }\r\n\r\n  onPageSizeChange(): void {\r\n    this.refresher$.next(this.queryState);\r\n  }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { SearchAdvancedComponent } from './search-advanced/search-advanced.component';\r\nimport { SearchGroupComponent } from './search-group/search-group.component';\r\nimport { SearchElectionComponent } from './search-election/search-election.component';\r\nimport { SearchIndividualComponent } from './search-individual/search-individual.component';\r\nimport { AcceptedTosGuard } from '../core/guards/accepted-tos.guard';\r\nimport { SearchGroupYearlyComponent } from './search-group-yearly/search-group-yearly.component';\r\n\r\nconst routes: Routes = [\r\n  {\r\n    path: '',\r\n    pathMatch: 'full',\r\n    redirectTo: 'advanced'\r\n  },\r\n  {\r\n    path: 'search/advanced',\r\n    component: SearchAdvancedComponent,\r\n    canActivate: [AcceptedTosGuard]\r\n  },\r\n  {\r\n    path: 'search/group/yearly',\r\n    component: SearchGroupYearlyComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'search' }\r\n  },\r\n  {\r\n    path: 'search/group',\r\n    component: SearchGroupComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'search' }\r\n  },\r\n  {\r\n    path: 'search/individual',\r\n    component: SearchIndividualComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'search' }\r\n  },\r\n  {\r\n    path: 'search/election',\r\n    component: SearchElectionComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'search' }\r\n  },\r\n  {\r\n    path: 'downloads/group/yearly',\r\n    component: SearchGroupYearlyComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'downloads' }\r\n  },\r\n  {\r\n    path: 'downloads/group',\r\n    component: SearchGroupComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'downloads' }\r\n  },\r\n  {\r\n    path: 'downloads/individual',\r\n    component: SearchIndividualComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'downloads' }\r\n  },\r\n  {\r\n    path: 'downloads/election',\r\n    component: SearchElectionComponent,\r\n    canActivate: [AcceptedTosGuard],\r\n    data: { area: 'downloads' }\r\n  }\r\n];\r\n\r\n@NgModule({\r\n  imports: [RouterModule.forChild(routes)],\r\n  exports: [RouterModule]\r\n})\r\nexport class SearchRoutingModule {}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { SearchRoutingModule } from './search-routing.module';\r\nimport { SearchAdvancedComponent } from './search-advanced/search-advanced.component';\r\nimport { SearchElectionComponent } from './search-election/search-election.component';\r\nimport { SearchGroupComponent } from './search-group/search-group.component';\r\nimport { SearchIndividualComponent } from './search-individual/search-individual.component';\r\nimport { SharedModule } from '../shared/shared.module';\r\nimport { SearchDetailTableComponent } from './search-detail-table/search-detail-table.component';\r\nimport { ClarityModule, ClrFormsModule } from '@clr/angular';//20220829\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n  NgbCollapseModule,\r\n  NgbDatepickerModule,\r\n  NgbDateAdapter,\r\n  NgbDateNativeUTCAdapter,\r\n  NgbButtonsModule\r\n} from '@ng-bootstrap/ng-bootstrap';\r\nimport { SearchAdvancedTableComponent } from './search-advanced/search-advanced-table/search-advanced-table.component';\r\nimport { SearchGroupYearlyComponent } from './search-group-yearly/search-group-yearly.component';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    SearchAdvancedComponent,\r\n    SearchElectionComponent,\r\n    SearchGroupComponent,\r\n    SearchIndividualComponent,\r\n    SearchDetailTableComponent,\r\n    SearchAdvancedTableComponent,\r\n    SearchGroupYearlyComponent\r\n  ],\r\n  providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeUTCAdapter }],\r\n  imports: [\r\n    CommonModule,\r\n    ClarityModule,\r\n    ClrFormsModule,\r\n    FormsModule,\r\n    SearchRoutingModule,\r\n    SharedModule,\r\n    NgbCollapseModule,\r\n    NgbButtonsModule,\r\n    NgbDatepickerModule\r\n  ]\r\n})\r\nexport class SearchModule {}\r\n"],"sourceRoot":""}