@dra2020/district-analytics 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///webpack://poly/webpack/universalModuleDefinition","webpack:///webpack://poly/webpack/bootstrap","webpack:///webpack://poly/lib/all.ts","webpack:///webpack://poly/lib/poly.ts","webpack:///webpack://poly/lib/union.ts","webpack:///webpack://poly/node_modules/polygon-clipping/dist/polygon-clipping.esm.js","webpack:///webpack://poly/node_modules/splaytree/index.js","webpack:///webpack://poly/external \"@dra2020/util\"","webpack:///webpack://util/webpack/universalModuleDefinition","webpack:///webpack://util/webpack/bootstrap","webpack:///webpack://util/lib/all.ts","webpack:///webpack://util/lib/countedhash.ts","webpack:///webpack://util/lib/indexedarray.ts","webpack:///webpack://util/lib/util.ts","webpack:///./node_modules/csv-parse/lib/ResizeableBuffer.js","webpack:///./node_modules/csv-parse/lib/index.js","webpack:///./node_modules/csv-parse/lib/sync.js","webpack:///./node_modules/polygon-clipping/dist/polygon-clipping.esm.js","webpack:///./src/_api.ts","webpack:///./src/_data.ts","webpack:///./src/analyze.ts","webpack:///./src/cohesive.ts","webpack:///./src/compact.ts","webpack:///./src/equal.ts","webpack:///./src/geofeature.ts","webpack:///./src/minority.ts","webpack:///./src/political.ts","webpack:///./src/preprocess.ts","webpack:///./src/results.ts","webpack:///./src/settings.ts","webpack:///./src/utils.ts","webpack:///./src/valid.ts","webpack:///./test/_cli.ts","webpack:///external \"assert\"","webpack:///external \"fs\"","webpack:///external \"path\"","webpack:///external \"stream\"","webpack:///external \"yargs\""],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;AClFA;AACA,IAAI,IAAyD;AAC7D;AACA,MAAM,EAKqB;AAC3B,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;AClFa;AACb;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D,SAAS,mBAAO,CAAC,6BAAQ;AACzB,SAAS,mBAAO,CAAC,+BAAS;;;;;;;;;;;;;ACNb;AACb,8CAA8C,cAAc;AAC5D,aAAa,mBAAO,CAAC,oCAAe;AACpC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,yBAAyB;AAC5C;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,QAAQ;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;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,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C,2BAA2B,kBAAkB;AAC7C,0BAA0B,4CAA4C;AACtE,6BAA6B,sEAAsE;AACnG;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C,2BAA2B;AAC3B,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,kCAAkC;AAClC,cAAc;AACd;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB;AACA;AACA,mCAAmC;AACnC,6BAA6B;AAC7B;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACjfa;AACb,8CAA8C,cAAc;AAC5D,WAAW,mBAAO,CAAC,sFAAkB;AACrC,aAAa,mBAAO,CAAC,oCAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA,kBAAkB,+BAA+B;AACjD;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnJA;AAAA;AAAkC;;AAElC;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK,MAAM,mBAAmB,OAAO,mBAAmB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oGAAoG;;AAEpG;AACA,qDAAqD;;AAErD;AACA,qDAAqD;;AAErD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;;AAGH;AACA,+BAA+B;;AAE/B;;AAEA;AACA;AACA,GAAG;;;AAGH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,iDAAS,GAAG;;AAEhC;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC,GAAG;;;AAGJ;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qCAAqC,UAAU;AAC/C;AACA;AACA;;AAEA;;AAEA,0CAA0C,UAAU;AACpD;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iDAAiD,UAAU;AAC3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uDAAuD;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qEAAqE;AACrE,GAAG;AACH;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC,yCAAyC;;AAEzC,0DAA0D;AAC1D;;AAEA;AACA,KAAK;;AAEL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,GAAG;;AAEH;AACA;;AAEA,0DAA0D;AAC1D;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,eAAe;AACpC;AACA;;AAEA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA,sDAAsD,UAAU;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC;;;AAGzC;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA,8CAA8C;;AAE9C;AACA;AACA,qCAAqC;;AAErC;AACA,gDAAgD;AAChD;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA,6CAA6C;;AAE7C;AACA,8CAA8C;;AAE9C;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA,OAAO;AACP;AACA;;;AAGA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;;AAGP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA,8BAA8B;AAC9B;;AAEA;AACA,gCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA,iFAAiF;;AAEjF;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP,yDAAyD;;AAEzD;AACA,sCAAsC;AACtC;;AAEA,qEAAqE;AACrE;;AAEA,mCAAmC;;AAEnC,kDAAkD;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA;;AAEA,mDAAmD,UAAU;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,gDAAgD,gEAAgE;AAChH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;;AAEjD,+CAA+C,UAAU;AACzD;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,OAAO;;;AAGP;AACA;;AAEA,iDAAiD,YAAY;AAC7D,8CAA8C;;AAE9C;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;;AAEA;AACA;AACA,OAAO;;;AAGP,mDAAmD,cAAc;AACjE;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA,mCAAmC;;AAEnC;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA,4DAA4D;;AAE5D;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,uDAAuD,UAAU;AACjE;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA,yCAAyC,UAAU;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oDAAoD,UAAU;AAC9D;AACA;AACA;AACA;AACA;AACA,OAAO;;;AAGP,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,YAAY;AACvC;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC;;AAEA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,+CAA+C;;AAE/C;;AAEA,uDAAuD,UAAU;AACjE,uDAAuD;;AAEvD;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD,+CAA+C;;AAE/C;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,0CAA0C,UAAU;AACpD;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,oBAAoB,iDAAS;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA,8CAA8C;AAC9C,OAAO;;;AAGP;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA,SAAS;;;AAGT;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kEAAkE,YAAY;AAC9E;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA;AACA;AACA,mEAAmE,8DAA8D;AACjI;AACA;AACA,8DAA8D;;AAE9D;AACA,WAAW;AACX;;AAEA;AACA;;AAEA;;AAEA,iEAAiE,cAAc;AAC/E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;;AAEA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,8CAA8C,UAAU;AACxD;AACA;AACA;;;AAGA,4CAA4C,YAAY;AACxD;AACA;AACA;AACA;;;AAGA;;AAEA,8CAA8C,cAAc;AAC5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,qDAAqD,cAAc;AACnE;;AAEA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;;;AAGA,sBAAsB,iDAAS;;AAE/B,mDAAmD,cAAc;AACjE;;AAEA,oDAAoD,YAAY;AAChE;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oDAAoD,cAAc;AAClE;AACA;AACA;;AAEA;AACA;AACA,OAAO;;;AAGP;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC,GAAG;;AAEJ;;AAEA;AACA,6FAA6F,aAAa;AAC1G;AACA;;AAEA;AACA;;AAEA;AACA,iGAAiG,eAAe;AAChH;AACA;;AAEA;AACA;;AAEA;AACA,iGAAiG,eAAe;AAChH;AACA;;AAEA;AACA;;AAEA;AACA,qGAAqG,eAAe;AACpH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEe,oEAAK,EAAC;;;;;;;;;;;;;AC1+DrB;AAAA;AAAA;AACA;AACA;;AAEA;AACA,aAAa,EAAE;AACf;;;AAGA;AACA,aAAa,EAAE;AACf;;;AAGA;AACA,aAAa,yBAAyB;AACtC;;;AAGA;AACA,aAAa,8BAA8B;AAC3C;;;AAGA;AACA,WAAW,2BAA2B;AACtC;;;AAGA;AACA,aAAa,OAAO;AACpB,cAAc,IAAI;AAClB,cAAc,OAAO;AACrB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,mCAAmC;;;AAGpE;AACA;AACA,WAAW,IAAI;AACf,WAAW,MAAM;AACjB,WAAW,WAAW;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,YAAY,IAAI;AAChB,YAAY,MAAM;AAClB,YAAY,WAAW;AACvB,YAAY,KAAK;AACjB,YAAY,KAAK;AACjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,YAAY,IAAI;AAChB,YAAY,MAAM;AAClB,YAAY,WAAW;AACvB,YAAY,KAAK;AACjB,YAAY,KAAK;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,IAAI;AACf,WAAW,KAAK;AAChB,WAAW,WAAW;AACtB,WAAW,KAAK;AAChB,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;;AAGA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA,YAAY,KAAK;AACjB,YAAY,OAAO;AACnB,YAAY,QAAQ;AACpB,YAAY,cAAc;AAC1B,YAAY,2BAA2B;AACvC;AACA;AACA;AACA,WAAW,SAAS,EAAE,2BAA2B,EAAE,kBAAkB;AACrE;AACA;AACA;AACA;AACA;;;AAGe;;AAEf;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,IAAI;AAClB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,IAAI;AAClB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc,QAAQ;AACtB,cAAc,GAAG;AACjB,cAAc;AACd;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,IAAI;AAClB,cAAc,IAAI;AAClB,cAAc,SAAS;AACvB,cAAc,GAAG;AACjB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;;;AAGA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA,cAAc,KAAK;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;;AAGA;AACA,cAAc,KAAK;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,QAAQ;AACtB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA,KAAK,OAAO;AACZ;AACA;AACA,oCAAoC,mBAAmB;AACvD;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA,aAAa,4BAA4B;;AAEzC,eAAe,mBAAmB;;;AAGlC;AACA,cAAc,aAAa;AAC3B,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,SAAS,cAAc;AACvB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,gBAAgB;AAChB;AACA,iBAAiB,iBAAiB;AAClC,kBAAkB;AAClB;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,gBAAgB;AAChB;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA,kBAAkB;AAClB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,WAAW;AACX,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AClvBA,iBAAiB,mBAAO,CAAC,gEAAe,E;;;;;;;;;;;;;;;;;ACAxC;AACA,IAAI,IAAyD;AAC7D;AACA,MAAM,EAKqB;AAC3B,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,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AC,CAAC;AAA5E,0BAA4E;AAC5E,SAAgB,OAAO,CAAC,GAAW,IAAY,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAA5E,0BAA4E;AAE5E,qCAAqC;AACrC,SAAgB,OAAO,CAAC,GAAW;IAEjC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3C,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AAC9B,CAAC;AAJD,0BAIC;;;;;;;;;;;;;;;;;;;;ACzeD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC5CA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO,YAAY,GAAG,mBAAO,CAAC,sBAAQ;AACtC,yBAAyB,mBAAO,CAAC,4EAAoB;;AAErD;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB,WAAW,IAAI,yBAAyB,UAAU;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,4BAA4B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,kCAAkC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,gCAAgC;AAC/C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kCAAkC;AACjD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,kFAAkF,+BAA+B;AACjH,KAAK;AACL,kFAAkF,sBAAsB;AACxG,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,kFAAkF,0BAA0B;AAC5G;AACA,OAAO;AACP,wEAAwE,6BAA6B;AACrG;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sGAAsG,+BAA+B;AACrI;AACA,OAAO;AACP,6EAA6E,+BAA+B;AAC5G;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,gEAAgE,6BAA6B;AAC7F;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL,yFAAyF,wCAAwC;AACjI;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL,mFAAmF,gBAAgB;AACnG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,kCAAkC;AACjD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,mFAAmF,8BAA8B;AACjH,OAAO;AACP,mFAAmF,qBAAqB;AACxG,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,+DAA+D,4BAA4B;AAC3F;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,sEAAsE,8BAA8B;AACpG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,mFAAmF,2CAA2C;AAC9H;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,wFAAwF,gDAAgD;AACxI;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,wFAAwF,gDAAgD;AACxI;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,iFAAiF,yCAAyC;AAC1H;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,6FAA6F,qDAAqD;AAClJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,sFAAsF,8CAA8C;AACpI;AACA;AACA;AACA;AACA,KAAK;AACL,sEAAsE,8BAA8B;AACpG;AACA;AACA;AACA;AACA,KAAK;AACL,sEAAsE,8BAA8B;AACpG;AACA;AACA;AACA;AACA,KAAK;AACL,qEAAqE,6BAA6B;AAClG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA,OAAO;AACP,sEAAsE,wBAAwB;AAC9F;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,oGAAoG,6BAA6B;AACjI;AACA,OAAO;AACP,2EAA2E,6BAA6B;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,uHAAuH;AAClI,SAAS,iBAAiB;AAC1B,WAAW,kDAAkD;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,0BAA0B,6BAA6B;AACvD,6BAA6B,gBAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,gBAAgB;AAC/E;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,aAAa;AACb;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,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6HAA6H;AACxI,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD,qBAAqB,aAAa,WAAW,gBAAgB;AAC7D;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,mCAAmC,eAAe;AAClD,qBAAqB,aAAa,WAAW,gBAAgB;AAC7D;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA,eAAe,YAAY;AAC3B,+BAA+B,qCAAqC,IAAI;AACxE,gCAAgC,sBAAsB,IAAI;AAC1D;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,4BAA4B;AAC3C,8BAA8B,qCAAqC,IAAI;AACvE,+BAA+B,sBAAsB;AACrD;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,aAAa,eAAe;AAC5B,4BAA4B,qCAAqC,IAAI;AACrE,6BAA6B,sBAAsB;AACnD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mBAAmB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6BAA6B;AACxC,WAAW,oBAAoB;AAC/B;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,kCAAkC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA,yBAAyB,2BAA2B;AACpD;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,sBAAsB;AACjC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,eAAe,yBAAyB,YAAY,EAAE;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,cAAc,mBAAmB;AACjC;AACA;AACA,8BAA8B;AAC9B,KAAK;AACL,8BAA8B;AAC9B,KAAK;AACL;AACA;AACA;AACA,qDAAqD,EAAE;AACvD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,uBAAuB,eAAe,EAAE;AACvD;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC5jCA,cAAc,mBAAO,CAAC,gDAAG;;AAEzB,0CAA0C;AAC1C;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrBA;AAAA;AAAkC;;AAElC;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK,MAAM,mBAAmB,OAAO,mBAAmB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oGAAoG;;AAEpG;AACA,qDAAqD;;AAErD;AACA,qDAAqD;;AAErD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;;AAGH;;AAEA;AACA;AACA,GAAG;;;AAGH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,iDAAS,GAAG;;AAEhC;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC,GAAG;;;AAGJ;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC,yCAAyC;;AAEzC,0DAA0D;AAC1D;;AAEA;AACA,KAAK;;AAEL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,GAAG;;AAEH;AACA;;AAEA,0DAA0D;AAC1D;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,eAAe;AACpC;AACA;;AAEA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA,sDAAsD,UAAU;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC;;;AAGzC;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA,8CAA8C;;AAE9C;AACA;AACA,qCAAqC;;AAErC;AACA,gDAAgD;AAChD;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA,6CAA6C;;AAE7C;AACA,8CAA8C;;AAE9C;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA,OAAO;AACP;AACA;;;AAGA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;;AAGP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA,8BAA8B;AAC9B;;AAEA;AACA,gCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA;AACA,2CAA2C;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA,iFAAiF;;AAEjF;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP,yDAAyD;;AAEzD;AACA,sCAAsC;AACtC;;AAEA,qEAAqE;AACrE;;AAEA,mCAAmC;;AAEnC,kDAAkD;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA;;AAEA,mDAAmD,UAAU;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,gDAAgD,gEAAgE;AAChH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;;AAEjD,+CAA+C,UAAU;AACzD;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,OAAO;;;AAGP;AACA;;AAEA,iDAAiD,YAAY;AAC7D,8CAA8C;;AAE9C;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;;AAEA;AACA;AACA,OAAO;;;AAGP,mDAAmD,cAAc;AACjE;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA,mCAAmC;;AAEnC;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;;AAEA,gEAAgE;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;;AAGL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4DAA4D;;AAE5D;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,uDAAuD,UAAU;AACjE;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK,aAAa;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,uCAAuC,UAAU;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA,yCAAyC,UAAU;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oDAAoD,UAAU;AAC9D;AACA;AACA;AACA;AACA;AACA,OAAO;;;AAGP,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,YAAY;AACvC;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC;;AAEA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,+CAA+C;;AAE/C;;AAEA,uDAAuD,UAAU;AACjE,uDAAuD;;AAEvD;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD,+CAA+C;;AAE/C;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,0CAA0C,UAAU;AACpD;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,oBAAoB,iDAAS;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA,8CAA8C;AAC9C,OAAO;;;AAGP;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA,SAAS;;;AAGT;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kEAAkE,YAAY;AAC9E;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA;AACA;AACA,mEAAmE,8DAA8D;AACjI;AACA;AACA,WAAW;AACX;;AAEA;AACA;;AAEA;;AAEA,iEAAiE,cAAc;AAC/E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;;AAEA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,8CAA8C,UAAU;AACxD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;;;AAGA;AACA;A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","file":"cli.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./test/_cli.ts\");\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"poly\"] = factory();\n\telse\n\t\troot[\"poly\"] = factory();\n})(global, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./lib/all.ts\");\n","\"use strict\";\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./poly\"));\n__export(require(\"./union\"));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Util = require(\"@dra2020/util\");\n// Internal utilities\nexports.EARTH_RADIUS = 6371000; // Radius of earth in meters\nconst DefaultOptions = {};\n// Return geographic polygon area in meters^2\nfunction polySimpleArea(p, options) {\n if (options === undefined)\n options = DefaultOptions;\n let p1;\n let p2;\n let p3;\n let dx;\n let l;\n let m;\n let u;\n let i;\n let total = 0;\n let n = p.length;\n if (n > 2) {\n for (i = 0; i < n; i++) {\n if (i === n - 2) {\n l = n - 2;\n m = n - 1;\n u = 0;\n }\n else if (i === n - 1) {\n l = n - 1;\n m = 0;\n u = 1;\n }\n else {\n l = i;\n m = i + 1;\n u = i + 2;\n }\n p1 = p[l];\n p2 = p[m];\n p3 = p[u];\n dx = (Util.deg2rad(p3[0]) - Util.deg2rad(p1[0]));\n dx *= Math.sin(Util.deg2rad(p2[1]));\n total += dx;\n }\n total *= exports.EARTH_RADIUS * exports.EARTH_RADIUS / 2;\n }\n return Math.abs(total);\n}\n// Allow bare polygon coordinates array or GeoJSON feature.\n// Normalize to multipolygon points array.\nfunction polyNormalize(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n // Convert a GeoJSON polygon or multipolygon to the raw list of points\n if (poly && poly.geometry && poly.geometry.coordinates)\n poly = poly.geometry.coordinates;\n // This is really an invalid specification but used internally to represent null polygon\n if (poly && poly.length == 0)\n return null;\n if (Util.depthof(poly) == 4)\n poly = [poly];\n return poly;\n}\nexports.polyNormalize = polyNormalize;\n// Area of geographic polygon\nfunction polyArea(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n poly = polyNormalize(poly, options);\n let a = 0;\n // MultiPolygon is a set of polygons\n for (let i = 0; poly && i < poly.length; i++) {\n // Single polygon is exterior ring with interior holes. Holes are subtracted.\n let p = poly[i];\n for (let j = 0; j < p.length; j++) {\n let sp = p[j];\n a += polySimpleArea(sp, options) * (j == 0 ? 1 : -1);\n }\n }\n return a;\n}\nexports.polyArea = polyArea;\n// Return distance in meters given two lat/lon points\nfunction haversine(x1, y1, x2, y2, options) {\n let dLat = Util.deg2rad(y2 - y1);\n let dLon = Util.deg2rad(x2 - x1);\n let c;\n // Short circuit for using simple cartesian algorithm instead of haversine\n if (options.noLatitudeCorrection)\n c = Math.sqrt((dLat * dLat) + (dLon * dLon));\n else {\n let lat1 = Util.deg2rad(y1);\n let lat2 = Util.deg2rad(y2);\n let a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);\n c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n }\n return exports.EARTH_RADIUS * c;\n}\n// Perimeter of geographic polygon in meters\nfunction polyPerimeter(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n poly = polyNormalize(poly, options);\n let perimeter = 0;\n for (let i = 0; poly && i < poly.length; i++) {\n // Ignore holes so only look at first polyline\n let p = poly[i][0];\n for (let j = 0; j < p.length - 1; j++)\n perimeter += haversine(p[j][0], p[j][1], p[j + 1][0], p[j + 1][1], options);\n if (p.length > 2 && (p[0][0] != p[p.length - 1][0] || p[0][1] != p[p.length - 1][1]))\n perimeter += haversine(p[0][0], p[0][1], p[p.length - 1][0], p[p.length - 1][1], options);\n }\n return perimeter;\n}\nexports.polyPerimeter = polyPerimeter;\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n}\nclass Circle {\n constructor(x, y, r) {\n this.x = x;\n this.y = y;\n this.r = r;\n }\n}\nexports.Circle = Circle;\n//\n// Returns the smallest circle that encloses the given polygon.\n// Runs in expected O(n) time, randomized.\n// Note: If 0 points are given, null is returned.\n// If 1 point is given, a circle of radius 0 is returned.\n//\nfunction polyToCircle(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n return makeCircle(polyToExteriorPoints(poly));\n}\nexports.polyToCircle = polyToCircle;\n//\n// Returns the circle whose perimeter is equal to the perimeter of the bounding perimeter\n// of the polygon. Use binary search to find an approximation.\n//\nfunction polyToPolsbyPopperCircle(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n let c = polyToCircle(poly, options);\n if (c == null)\n return c;\n let p = polyPerimeter(poly, options);\n c.r = (p / (2 * Math.PI)) / 111139;\n return c;\n}\nexports.polyToPolsbyPopperCircle = polyToPolsbyPopperCircle;\nfunction makeCircle(points) {\n if (points == null)\n return null;\n // Clone list to preserve the caller's data, do Durstenfeld shuffle\n let shuffled = points.slice();\n for (let i = points.length - 1; i >= 0; i--) {\n let j = Math.floor(Math.random() * (i + 1));\n j = Math.max(Math.min(j, i), 0);\n const temp = shuffled[i];\n shuffled[i] = shuffled[j];\n shuffled[j] = temp;\n }\n // Progressively add points to circle or recompute circle\n let c = null;\n shuffled.forEach((p, i) => {\n if (c === null || !isInCircle(c, p))\n c = makeCircleOnePoint(shuffled.slice(0, i + 1), p);\n });\n return c;\n}\n// One boundary point known\nfunction makeCircleOnePoint(points, p) {\n let c = new Circle(p.x, p.y, 0);\n points.forEach((q, i) => {\n if (!isInCircle(c, q)) {\n if (c.r == 0)\n c = makeDiameter(p, q);\n else\n c = makeCircleTwoPoints(points.slice(0, i + 1), p, q);\n }\n });\n return c;\n}\n// Two boundary points known\nfunction makeCircleTwoPoints(points, p, q) {\n const circ = makeDiameter(p, q);\n let left = null;\n let right = null;\n // For each point not in the two-point circle\n for (const r of points) {\n if (isInCircle(circ, r))\n continue;\n // Form a circumcircle and classify it on left or right side\n const cross = crossProduct(p.x, p.y, q.x, q.y, r.x, r.y);\n const c = makeCircumcircle(p, q, r);\n if (c === null)\n continue;\n else if (cross > 0 && (left === null || crossProduct(p.x, p.y, q.x, q.y, c.x, c.y) > crossProduct(p.x, p.y, q.x, q.y, left.x, left.y)))\n left = c;\n else if (cross < 0 && (right === null || crossProduct(p.x, p.y, q.x, q.y, c.x, c.y) < crossProduct(p.x, p.y, q.x, q.y, right.x, right.y)))\n right = c;\n }\n // Select which circle to return\n if (left === null && right === null)\n return circ;\n else if (left === null && right !== null)\n return right;\n else if (left !== null && right === null)\n return left;\n else if (left !== null && right !== null)\n return left.r <= right.r ? left : right;\n else\n throw \"Assertion error\";\n}\nfunction makeDiameter(a, b) {\n const cx = (a.x + b.x) / 2;\n const cy = (a.y + b.y) / 2;\n const r0 = Util.distance(cx, cy, a.x, a.y);\n const r1 = Util.distance(cx, cy, b.x, b.y);\n return new Circle(cx, cy, Math.max(r0, r1));\n}\nfunction makeCircumcircle(a, b, c) {\n // Mathematical algorithm from Wikipedia: Circumscribed circle\n const ox = (Math.min(a.x, b.x, c.x) + Math.max(a.x, b.x, c.x)) / 2;\n const oy = (Math.min(a.y, b.y, c.y) + Math.max(a.y, b.y, c.y)) / 2;\n const ax = a.x - ox;\n const ay = a.y - oy;\n const bx = b.x - ox;\n const by = b.y - oy;\n const cx = c.x - ox;\n const cy = c.y - oy;\n const d = (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by)) * 2;\n if (d == 0)\n return null;\n const x = ox + ((ax * ax + ay * ay) * (by - cy) + (bx * bx + by * by) * (cy - ay) + (cx * cx + cy * cy) * (ay - by)) / d;\n const y = oy + ((ax * ax + ay * ay) * (cx - bx) + (bx * bx + by * by) * (ax - cx) + (cx * cx + cy * cy) * (bx - ax)) / d;\n const ra = Util.distance(x, y, a.x, a.y);\n const rb = Util.distance(x, y, b.x, b.y);\n const rc = Util.distance(x, y, c.x, c.y);\n return new Circle(x, y, Math.max(ra, rb, rc));\n}\n/* Simple mathematical functions */\nconst MULTIPLICATIVE_EPSILON = 1 + 1e-14;\nfunction isInCircle(c, p) {\n return c !== null && Util.distance(p.x, p.y, c.x, c.y) <= c.r * MULTIPLICATIVE_EPSILON;\n}\n// Returns twice the signed area of the triangle defined by (x0, y0), (x1, y1), (x2, y2).\nfunction crossProduct(x0, y0, x1, y1, x2, y2) {\n return (x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0);\n}\n// cache x,y circle offsets for one quadrant indexed by number of segments\nlet circleOffsets = {};\nfunction getCircleOffsets(n) {\n if (circleOffsets[n] === undefined) {\n let a = [];\n let incr = (Math.PI / 2) / n;\n let theta = 0;\n let i, j;\n // Compute NE quadrant\n for (i = 0; i < n; i++, theta += incr) {\n a.push(Math.sin(theta));\n a.push(Math.cos(theta));\n }\n // Add top of circle\n a.push(0);\n a.push(1);\n // Now flip X and replicate to NW quadrant\n for (i = 0; i < n; i++) {\n j = (n - i) * 2;\n a.push(-a[j - 1]);\n a.push(a[j - 2]);\n }\n // Now flip X and Y and replicate to SW quadrant\n for (i = 0; i < n; i++) {\n j = (n - i) * 2;\n a.push(-a[j - 1]);\n a.push(-a[j - 2]);\n }\n // Add bottom of circle\n a.push(0);\n a.push(-1);\n // Now flip Y and replicate to SE quadrant\n for (i = 0; i < n; i++) {\n j = (n - i) * 2;\n a.push(a[j - 1]);\n a.push(-a[j - 2]);\n }\n // Duplicate final point per GeoJSON spec\n a.push(a[0]);\n a.push(a[1]);\n circleOffsets[n] = a;\n }\n return circleOffsets[n];\n}\n// Note that this is essentially an inversion of polyToCircle which computes a mathematical\n// circle given the point values, ignoring latitude correction. This inversion also\n// ignores that correction which means when plotted on a 2D map looks circular but the edge of\n// the circle is not a fixed distance (in physical units, e.g. meters) from the center.\n//\nfunction polyFromCircle(c, nSegments, options) {\n if (options === undefined)\n options = DefaultOptions;\n if (c === null || c.r == 0)\n return null;\n if (!nSegments || nSegments < 8)\n nSegments = 8;\n let poly = [];\n let offsets = getCircleOffsets(nSegments);\n const n = offsets.length;\n for (let i = 0; i < n; i += 2)\n poly.push([c.x + (c.r * offsets[i]), c.y + (c.r * offsets[i + 1])]);\n // return multi-polygon\n return [[poly]];\n}\nexports.polyFromCircle = polyFromCircle;\n// isLeft(): tests if a point is Left|On|Right of an infinite line.\n// Input: three points P0, P1, and P2\n// Return: >0 for P2 left of the line through P0 and P1\n// =0 for P2 on the line\n// <0 for P2 right of the line\nfunction sortPointX(a, b) { return a.x - b.x; }\nfunction sortPointY(a, b) { return a.y - b.y; }\nfunction sortPoint(a, b) { return a.x === b.x ? a.y - b.y : a.x - b.x; }\nfunction isLeft(p0, p1, p2) { return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y); }\nfunction pointsToPoly(points) {\n let p = [];\n for (let i = 0; i < points.length; i++)\n p.push([points[i].x, points[i].y]);\n return [p];\n}\nfunction polyToExteriorPoints(poly) {\n poly = polyNormalize(poly);\n if (poly == null)\n return null;\n let points = [];\n for (let i = 0; poly && i < poly.length; i++) {\n let p = poly[i][0]; // Only need exterior points, so grab exterior ring and ignore holes\n for (let j = 0; j < p.length; j++)\n points.push(new Point(p[j][0], p[j][1]));\n }\n return points;\n}\n//\n// polyConvexHull(): A.M. Andrew's monotone chain 2D convex hull algorithm\n//\nfunction polyConvexHull(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n // Normalize input\n let points = polyToExteriorPoints(poly);\n if (points == null)\n return null;\n points.sort(sortPoint);\n let H = [];\n // the output array H[] will be used as the stack\n let n = points.length;\n let i;\n let bot = 0;\n let top = -1; // indices for bottom and top of the stack\n // Get the indices of points with min x-coord and min|max y-coord\n let minmin = 0, minmax;\n let xmin = points[0].x;\n for (i = 1; i < n; i++)\n if (points[i].x != xmin)\n break;\n minmax = i - 1;\n if (minmax == n - 1) // degenerate case: all x-coords == xmin\n {\n H[++top] = points[minmin];\n if (points[minmax].y != points[minmin].y) // a nontrivial segment\n H[++top] = points[minmax];\n H[++top] = points[minmin]; // add polygon endpoint\n return pointsToPoly(H);\n }\n // Get the indices of points with max x-coord and min|max y-coord\n let maxmin, maxmax = n - 1;\n let xmax = points[n - 1].x;\n for (i = n - 2; i >= 0; i--)\n if (points[i].x != xmax)\n break;\n maxmin = i + 1;\n // Compute the lower hull on the stack H\n H[++top] = points[minmin]; // push minmin point onto stack\n i = minmax;\n while (++i <= maxmin) {\n // the lower line joins points[minmin] with points[maxmin]\n if (isLeft(points[minmin], points[maxmin], points[i]) >= 0 && i < maxmin)\n continue; // ignore points[i] above or on the lower line\n while (top > 0) // there are at least 2 points on the stack\n {\n // test if points[i] is left of the line at the stack top\n if (isLeft(H[top - 1], H[top], points[i]) > 0)\n break; // points[i] is a new hull vertex\n else\n top--; // pop top point off stack\n }\n H[++top] = points[i]; // push points[i] onto stack\n }\n // Next, compute the upper hull on the stack H above the bottom hull\n if (maxmax != maxmin) // if distinct xmax points\n H[++top] = points[maxmax]; // push maxmax point onto stack\n bot = top; // the bottom point of the upper hull stack\n i = maxmin;\n while (--i >= minmax) {\n // the upper line joins points[maxmax] with points[minmax]\n if (isLeft(points[maxmax], points[minmax], points[i]) >= 0 && i > minmax)\n continue; // ignore points[i] below or on the upper line\n while (top > bot) // at least 2 points on the upper stack\n {\n // test if points[i] is left of the line at the stack top\n if (isLeft(H[top - 1], H[top], points[i]) > 0)\n break; // points[i] is a new hull vertex\n else\n top--; // pop top point off stack\n }\n if (points[i].x == H[0].x && points[i].y == H[0].y)\n return pointsToPoly(H); // special case (mgomes)\n H[++top] = points[i]; // push points[i] onto stack\n }\n if (minmax != minmin)\n H[++top] = points[minmin]; // push joining endpoint onto stack\n return pointsToPoly(H);\n}\nexports.polyConvexHull = polyConvexHull;\nfunction polyCompactness(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n poly = polyNormalize(poly, options);\n let area = polyArea(poly, options);\n let perimeter = polyPerimeter(poly, options);\n let circle = polyToCircle(poly, options);\n let circleArea = polyArea(polyFromCircle(circle), options);\n let ppcircleArea = polyArea(polyFromCircle(polyToPolsbyPopperCircle(poly)), options);\n let hullArea = polyArea(polyConvexHull(poly), options);\n let result = { value: 0, reock: 0, polsby_popper: 0, convex_hull: 0, schwartzberg: 0 };\n if (area == 0 || circle == null || circle.r == 0)\n return result;\n result.reock = area / circleArea;\n result.polsby_popper = area / ppcircleArea;\n result.convex_hull = area / hullArea;\n result.schwartzberg = ((2 * Math.PI) * Math.sqrt(area / Math.PI)) / perimeter;\n // Weight Reock and Polsby-Popper equally, normalize in 0-100 range\n result.value = Math.trunc(((result.reock + result.polsby_popper) / 2) * 100);\n return result;\n}\nexports.polyCompactness = polyCompactness;\nconst EmptyPolyDescription = { npoly: 0, nhole: 0, npoint: 0 };\nfunction polySimpleDescribe(poly, d) {\n if (d === undefined)\n d = Util.shallowCopy(EmptyPolyDescription);\n d.npoint += npoints(poly);\n d.npoly++;\n d.nhole = poly.length - 1;\n return d;\n}\nfunction polyDescribe(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n // Support getting passed either GeoJSON feature or simply arrays of coordinates\n poly = polyNormalize(poly, options);\n let d = Util.shallowCopy(EmptyPolyDescription);\n let depth = Util.depthof(poly);\n // Multipolygon\n if (depth == 5) {\n for (let i = 0; i < poly.length; i++)\n polySimpleDescribe(poly[i], d);\n }\n // Polygon\n else if (depth == 4)\n polySimpleDescribe(poly, d);\n // Support null/undefined but other inputs are programming errors\n else if (poly != null && poly !== undefined)\n throw ('polyDescribe: argument not a polygon coordinate array');\n return d;\n}\nexports.polyDescribe = polyDescribe;\nfunction npoints(poly) {\n if (Array.isArray(poly)) {\n if (poly.length == 2 && typeof poly[0] === 'number')\n return 1;\n else {\n let n = 0;\n for (let i = 0; i < poly.length; i++)\n n += npoints(poly[i]);\n return n;\n }\n }\n else\n return 0;\n}\nexports.npoints = npoints;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst PC = require(\"polygon-clipping\");\nconst Util = require(\"@dra2020/util\");\nfunction addToPoly(poly, polys) {\n return PC.union(poly, ...polys);\n}\nfunction subFromPoly(poly, polys) {\n return PC.difference(poly, ...polys);\n}\nclass AsyncUnion {\n constructor() {\n this.onList = {};\n this.tick = this.tick.bind(this);\n this.computes = [];\n this.bTicking = false;\n }\n empty() {\n this.computes = [];\n }\n on(eventName, cb) {\n let aCB = this.onList[eventName];\n if (aCB === undefined) {\n aCB = [];\n this.onList[eventName] = aCB;\n }\n aCB.push(cb);\n }\n emit(eventName, ps) {\n let aCB = this.onList[eventName];\n if (aCB !== undefined)\n for (let i = 0; i < aCB.length; i++)\n if (ps)\n (aCB[i])(ps.key, ps.accum);\n else\n (aCB[i])();\n }\n off(eventName, cb) {\n let aCB = this.onList[eventName];\n if (aCB !== undefined)\n for (let i = 0; i < aCB.length; i++)\n if (aCB[i] === cb) {\n aCB.splice(i, 1);\n break;\n }\n }\n keepTick() {\n setTimeout(this.tick, 2);\n }\n startTick() {\n if (!this.bTicking) {\n setTimeout(this.tick, 2);\n this.bTicking = true;\n }\n }\n endTick() {\n if (this.bTicking) {\n this.bTicking = false;\n this.emit('end');\n }\n }\n tick() {\n let bMore = false;\n for (let i = 0; i < this.computes.length; i++) {\n let ps = this.computes[i];\n if (ps.toAdd.length || ps.toSub.length) {\n if (ps.toAdd.length) {\n let polys = ps.toAdd.splice(0, 40);\n ps.accum = addToPoly(ps.accum, polys);\n }\n if (ps.toSub.length) {\n let polys = ps.toSub.splice(0, 40);\n ps.accum = subFromPoly(ps.accum, polys);\n }\n if (ps.toAdd.length == 0 && ps.toSub.length == 0)\n this.emit('done', ps);\n else\n bMore = true;\n }\n }\n if (bMore)\n this.keepTick();\n else\n this.endTick();\n }\n computePoly(key, map) {\n let ps = this.findPoly(key);\n // Work to do (or at least we now want to at least emit an 'end' event)\n this.startTick();\n // If we're computing the same polygon as previously, nothing to do.\n if (Util.shallowEqual(ps.map, map)) {\n this.emit('done', ps);\n return;\n }\n // If not finished computation, start from scratch\n if (ps.toAdd.length || ps.toSub.length) {\n ps.toSub = [];\n ps.toAdd = [];\n ps.accum = null;\n ps.map = map;\n for (let id in map)\n if (map.hasOwnProperty(id)) {\n let f = map[id];\n let poly = f.geometry.coordinates;\n if (ps.accum == null)\n ps.accum = poly;\n else\n ps.toAdd.push(poly);\n }\n }\n // Finished computation, do diff\n else {\n // To add\n let id;\n let nSkipped = 0;\n for (id in map)\n if (map.hasOwnProperty(id))\n if (ps.map[id] === undefined) {\n let f = map[id];\n ps.toAdd.push(f.geometry.coordinates);\n }\n else\n nSkipped++;\n if (nSkipped > 0) {\n // To sub\n for (id in ps.map)\n if (ps.map.hasOwnProperty(id) && map[id] === undefined) {\n let f = ps.map[id];\n ps.toSub.push(f.geometry.coordinates);\n }\n }\n else\n ps.accum = ps.toAdd.splice(0, 1)[0];\n ps.map = map;\n }\n }\n findPoly(key) {\n for (let i = 0; i < this.computes.length; i++) {\n let ps = this.computes[i];\n if (Util.shallowEqual(ps.key, key))\n return ps;\n }\n let ps = { key: key, accum: null, map: {}, toAdd: [], toSub: [] };\n this.computes.push(ps);\n return ps;\n }\n}\nexports.AsyncUnion = AsyncUnion;\n","import SplayTree from 'splaytree';\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\nvar isInBbox = function isInBbox(bbox, point) {\n return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;\n};\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\n\nvar getBboxOverlap = function getBboxOverlap(b1, b2) {\n // check if the bboxes overlap at all\n if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) return null; // find the middle two X values\n\n var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;\n var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x; // find the middle two Y values\n\n var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;\n var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y; // put those middle values together to get the overlap\n\n return {\n ll: {\n x: lowerX,\n y: lowerY\n },\n ur: {\n x: upperX,\n y: upperY\n }\n };\n};\n\n/* Javascript doesn't do integer math. Everything is\n * floating point with percision Number.EPSILON.\n *\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON\n */\nvar epsilon = Number.EPSILON; // IE Polyfill\n\nif (epsilon === undefined) epsilon = Math.pow(2, -52);\nvar EPSILON_SQ = epsilon * epsilon;\n/* FLP comparator */\n\nvar cmp = function cmp(a, b) {\n // check if they're both 0\n if (-epsilon < a && a < epsilon) {\n if (-epsilon < b && b < epsilon) {\n return 0;\n }\n } // check if one is positive and the other negative\n\n\n if (a < 0 && 0 < b) return -1;\n if (b < 0 && 0 < a) return 1; // check if they're flp equal\n\n var ab = a - b;\n\n if (ab * ab < EPSILON_SQ * a * b) {\n return 0;\n } // normal comparison\n\n\n return a < b ? -1 : 1;\n};\n\n/* Cross Product of two vectors with first point at origin */\n\nvar crossProduct = function crossProduct(a, b) {\n return a.x * b.y - a.y * b.x;\n};\n/* Dot Product of two vectors with first point at origin */\n\nvar dotProduct = function dotProduct(a, b) {\n return a.x * b.x + a.y * b.y;\n};\n/* Comparator for two vectors with same starting point */\n\nvar compareVectorAngles = function compareVectorAngles(basePt, endPt1, endPt2) {\n var v1 = {\n x: endPt1.x - basePt.x,\n y: endPt1.y - basePt.y\n };\n var v2 = {\n x: endPt2.x - basePt.x,\n y: endPt2.y - basePt.y\n };\n var kross = crossProduct(v1, v2);\n return cmp(kross, 0);\n};\nvar length = function length(v) {\n return Math.sqrt(dotProduct(v, v));\n};\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar sineOfAngle = function sineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar cosineOfAngle = function cosineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the closest point on an line (defined by two points)\n * to another point. */\n\nvar closestPoint = function closestPoint(ptA1, ptA2, ptB) {\n if (ptA1.x === ptA2.x) return {\n x: ptA1.x,\n y: ptB.y // vertical vector\n\n };\n if (ptA1.y === ptA2.y) return {\n x: ptB.x,\n y: ptA1.y // horizontal vector\n // determinne which point is further away\n // we use the further point as our base in the calculation, so that the\n // vectors are more parallel, providing more accurate dot product\n\n };\n var v1 = {\n x: ptB.x - ptA1.x,\n y: ptB.y - ptA1.y\n };\n var v2 = {\n x: ptB.x - ptA2.x,\n y: ptB.y - ptA2.y\n };\n var vFar, vA, farPt;\n\n if (dotProduct(v1, v1) > dotProduct(v2, v2)) {\n vFar = v1;\n vA = {\n x: ptA2.x - ptA1.x,\n y: ptA2.y - ptA1.y\n };\n farPt = ptA1;\n } else {\n vFar = v2;\n vA = {\n x: ptA1.x - ptA2.x,\n y: ptA1.y - ptA2.y\n };\n farPt = ptA2;\n }\n\n var dist = dotProduct(vA, vFar) / dotProduct(vA, vA);\n return {\n x: farPt.x + dist * vA.x,\n y: farPt.y + dist * vA.y\n };\n};\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar horizontalIntersection = function horizontalIntersection(pt, v, y) {\n if (v.y === 0) return null;\n return {\n x: pt.x + v.x / v.y * (y - pt.y),\n y: y\n };\n};\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar verticalIntersection = function verticalIntersection(pt, v, x) {\n if (v.x === 0) return null;\n return {\n x: x,\n y: pt.y + v.y / v.x * (x - pt.x)\n };\n};\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar intersection = function intersection(pt1, v1, pt2, v2) {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x);\n if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x);\n if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y);\n if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y); // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n var kross = crossProduct(v1, v2);\n if (kross == 0) return null;\n var ve = {\n x: pt2.x - pt1.x,\n y: pt2.y - pt1.y\n };\n var d1 = crossProduct(ve, v1) / kross;\n var d2 = crossProduct(ve, v2) / kross; // take the average of the two calculations to minimize rounding error\n\n var x1 = pt1.x + d2 * v1.x,\n x2 = pt2.x + d1 * v2.x;\n var y1 = pt1.y + d2 * v1.y,\n y2 = pt2.y + d1 * v2.y;\n var x = (x1 + x2) / 2;\n var y = (y1 + y2) / 2;\n return {\n x: x,\n y: y\n };\n};\n\n/**\n * This class rounds incoming values sufficiently so that\n * floating points problems are, for the most part, avoided.\n *\n * Incoming points are have their x & y values tested against\n * all previously seen x & y values. If either is 'too close'\n * to a previously seen value, it's value is 'snapped' to the\n * previously seen value.\n *\n * All points should be rounded by this class before being\n * stored in any data structures in the rest of this algorithm.\n */\n\nvar PtRounder =\n/*#__PURE__*/\nfunction () {\n function PtRounder() {\n _classCallCheck(this, PtRounder);\n\n this.reset();\n }\n\n _createClass(PtRounder, [{\n key: \"reset\",\n value: function reset() {\n this.xRounder = new CoordRounder();\n this.yRounder = new CoordRounder();\n }\n }, {\n key: \"round\",\n value: function round(x, y) {\n return {\n x: this.xRounder.round(x),\n y: this.yRounder.round(y)\n };\n }\n }]);\n\n return PtRounder;\n}();\n\nvar CoordRounder =\n/*#__PURE__*/\nfunction () {\n function CoordRounder() {\n _classCallCheck(this, CoordRounder);\n\n this.tree = new SplayTree(); // preseed with 0 so we don't end up with values < Number.EPSILON\n\n this.round(0);\n } // Note: this can rounds input values backwards or forwards.\n // You might ask, why not restrict this to just rounding\n // forwards? Wouldn't that allow left endpoints to always\n // remain left endpoints during splitting (never change to\n // right). No - it wouldn't, because we snap intersections\n // to endpoints (to establish independence from the segment\n // angle for t-intersections).\n\n\n _createClass(CoordRounder, [{\n key: \"round\",\n value: function round(coord) {\n var node = this.tree.add(coord);\n var prevNode = this.tree.prev(node);\n\n if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {\n this.tree.remove(coord);\n return prevNode.key;\n }\n\n var nextNode = this.tree.next(node);\n\n if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {\n this.tree.remove(coord);\n return nextNode.key;\n }\n\n return coord;\n }\n }]);\n\n return CoordRounder;\n}(); // singleton available by import\n\n\nvar rounder = new PtRounder();\n\n/* Given input geometry as a standard array-of-arrays geojson-style\n * geometry, return one that uses objects as points, for better perf */\n\nvar pointsAsObjects = function pointsAsObjects(geom) {\n // we can handle well-formed multipolys and polys\n var output = [];\n\n if (!Array.isArray(geom)) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n for (var i = 0, iMax = geom.length; i < iMax; i++) {\n if (!Array.isArray(geom[i]) || geom[i].length == 0) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n output.push([]);\n\n for (var j = 0, jMax = geom[i].length; j < jMax; j++) {\n if (!Array.isArray(geom[i][j]) || geom[i][j].length == 0) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n if (Array.isArray(geom[i][j][0])) {\n // multipolygon\n output[i].push([]);\n\n for (var k = 0, kMax = geom[i][j].length; k < kMax; k++) {\n if (!Array.isArray(geom[i][j][k]) || geom[i][j][k].length < 2) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n if (geom[i][j][k].length > 2) {\n throw new Error('Input has more than two coordinates. ' + 'Only 2-dimensional polygons supported.');\n }\n\n output[i][j].push(rounder.round(geom[i][j][k][0], geom[i][j][k][1]));\n }\n } else {\n // polygon\n if (geom[i][j].length < 2) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n if (geom[i][j].length > 2) {\n throw new Error('Input has more than two coordinates. ' + 'Only 2-dimensional polygons supported.');\n }\n\n output[i].push(rounder.round(geom[i][j][0], geom[i][j][1]));\n }\n }\n }\n\n return output;\n};\n/* WARN: input modified directly */\n\nvar forceMultiPoly = function forceMultiPoly(geom) {\n if (Array.isArray(geom)) {\n if (geom.length === 0) return; // allow empty multipolys\n\n if (Array.isArray(geom[0])) {\n if (Array.isArray(geom[0][0])) {\n if (typeof geom[0][0][0].x === 'number' && typeof geom[0][0][0].y === 'number') {\n // multipolygon\n return;\n }\n }\n\n if (typeof geom[0][0].x === 'number' && typeof geom[0][0].y === 'number') {\n // polygon\n geom.unshift(geom.splice(0));\n return;\n }\n }\n }\n\n throw new Error('Unrecognized input - not a polygon nor multipolygon');\n};\n/* WARN: input modified directly */\n\nvar cleanMultiPoly = function cleanMultiPoly(multipoly) {\n var i = 0;\n\n while (i < multipoly.length) {\n var poly = multipoly[i];\n\n if (poly.length === 0) {\n multipoly.splice(i, 1);\n continue;\n }\n\n var exteriorRing = poly[0];\n cleanRing(exteriorRing); // poly is dropped if exteriorRing is degenerate\n\n if (exteriorRing.length === 0) {\n multipoly.splice(i, 1);\n continue;\n }\n\n var j = 1;\n\n while (j < poly.length) {\n var interiorRing = poly[j];\n cleanRing(interiorRing);\n if (interiorRing.length === 0) poly.splice(j, 1);else j++;\n }\n\n i++;\n }\n};\n/* Clean ring:\n * - remove duplicate points\n * - remove colinear points\n * - remove rings with no area (less than 3 distinct points)\n * - un-close rings (last point should not repeat first)\n *\n * WARN: input modified directly */\n\nvar cleanRing = function cleanRing(ring) {\n if (ring.length === 0) return;\n var firstPt = ring[0];\n var lastPt = ring[ring.length - 1];\n if (firstPt.x === lastPt.x && firstPt.y === lastPt.y) ring.pop();\n\n var isPointUncessary = function isPointUncessary(prevPt, pt, nextPt) {\n return prevPt.x === pt.x && prevPt.y === pt.y || nextPt.x === pt.x && nextPt.y === pt.y || compareVectorAngles(pt, prevPt, nextPt) === 0;\n };\n\n var i = 0;\n var prevPt, nextPt;\n\n while (i < ring.length) {\n prevPt = i === 0 ? ring[ring.length - 1] : ring[i - 1];\n nextPt = i === ring.length - 1 ? ring[0] : ring[i + 1];\n if (isPointUncessary(prevPt, ring[i], nextPt)) ring.splice(i, 1);else i++;\n } // if our ring has less than 3 distinct points now (so is degenerate)\n // shrink it down to the empty array to communicate to our caller to\n // drop it\n\n\n while (ring.length < 3 && ring.length > 0) {\n ring.pop();\n }\n};\n\nvar SweepEvent =\n/*#__PURE__*/\nfunction () {\n _createClass(SweepEvent, null, [{\n key: \"compare\",\n // for ordering sweep events in the sweep event queue\n value: function compare(a, b) {\n // favor event with a point that the sweep line hits first\n var ptCmp = SweepEvent.comparePoints(a.point, b.point);\n if (ptCmp !== 0) return ptCmp; // the points are the same, so link them if needed\n\n if (a.point !== b.point) a.link(b); // favor right events over left\n\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1; // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n\n return Segment.compare(a.segment, b.segment);\n } // for ordering points in sweep line order\n\n }, {\n key: \"comparePoints\",\n value: function comparePoints(aPt, bPt) {\n if (aPt.x < bPt.x) return -1;\n if (aPt.x > bPt.x) return 1;\n if (aPt.y < bPt.y) return -1;\n if (aPt.y > bPt.y) return 1;\n return 0;\n } // Warning: 'point' input will be modified and re-used (for performance)\n\n }]);\n\n function SweepEvent(point, isLeft) {\n _classCallCheck(this, SweepEvent);\n\n if (point.events === undefined) point.events = [this];else point.events.push(this);\n this.point = point;\n this.isLeft = isLeft; // this.segment, this.otherSE set by factory\n }\n\n _createClass(SweepEvent, [{\n key: \"link\",\n value: function link(other) {\n if (other.point === this.point) {\n throw new Error('Tried to link already linked events');\n }\n\n var otherEvents = other.point.events;\n\n for (var i = 0, iMax = otherEvents.length; i < iMax; i++) {\n var evt = otherEvents[i];\n this.point.events.push(evt);\n evt.point = this.point;\n }\n\n this.checkForConsuming();\n }\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n\n }, {\n key: \"checkForConsuming\",\n value: function checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n // Compare each pair of events to see if other events also match\n var numEvents = this.point.events.length;\n\n for (var i = 0; i < numEvents; i++) {\n var evt1 = this.point.events[i];\n if (evt1.segment.consumedBy !== undefined) continue;\n\n for (var j = i + 1; j < numEvents; j++) {\n var evt2 = this.point.events[j];\n if (evt2.consumedBy !== undefined) continue;\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue;\n evt1.segment.consume(evt2.segment);\n }\n }\n }\n }, {\n key: \"getAvailableLinkedEvents\",\n value: function getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n var events = [];\n\n for (var i = 0, iMax = this.point.events.length; i < iMax; i++) {\n var evt = this.point.events[i];\n\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt);\n }\n }\n\n return events;\n }\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n\n }, {\n key: \"getLeftmostComparator\",\n value: function getLeftmostComparator(baseEvent) {\n var _this = this;\n\n var cache = new Map();\n\n var fillCache = function fillCache(linkedEvent) {\n var nextEvent = linkedEvent.otherSE;\n cache.set(linkedEvent, {\n sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)\n });\n };\n\n return function (a, b) {\n if (!cache.has(a)) fillCache(a);\n if (!cache.has(b)) fillCache(b);\n\n var _cache$get = cache.get(a),\n asine = _cache$get.sine,\n acosine = _cache$get.cosine;\n\n var _cache$get2 = cache.get(b),\n bsine = _cache$get2.sine,\n bcosine = _cache$get2.cosine; // both on or above x-axis\n\n\n if (asine >= 0 && bsine >= 0) {\n if (acosine < bcosine) return 1;\n if (acosine > bcosine) return -1;\n return 0;\n } // both below x-axis\n\n\n if (asine < 0 && bsine < 0) {\n if (acosine < bcosine) return -1;\n if (acosine > bcosine) return 1;\n return 0;\n } // one above x-axis, one below\n\n\n if (bsine < asine) return -1;\n if (bsine > asine) return 1;\n return 0;\n };\n }\n }]);\n\n return SweepEvent;\n}();\n\n// segments and sweep events when all else is identical\n\nvar segmentId = 0;\n\nvar Segment =\n/*#__PURE__*/\nfunction () {\n _createClass(Segment, null, [{\n key: \"compare\",\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n value: function compare(a, b) {\n var alx = a.leftSE.point.x;\n var blx = b.leftSE.point.x;\n var arx = a.rightSE.point.x;\n var brx = b.rightSE.point.x; // check if they're even in the same vertical plane\n\n if (brx < alx) return 1;\n if (arx < blx) return -1;\n var aly = a.leftSE.point.y;\n var bly = b.leftSE.point.y;\n var ary = a.rightSE.point.y;\n var bry = b.rightSE.point.y; // is left endpoint of segment B the right-more?\n\n if (alx < blx) {\n // are the two segments in the same horizontal plane?\n if (bly < aly && bly < ary) return 1;\n if (bly > aly && bly > ary) return -1; // is the B left endpoint colinear to segment A?\n\n var aCmpBLeft = a.comparePoint(b.leftSE.point);\n if (aCmpBLeft < 0) return 1;\n if (aCmpBLeft > 0) return -1; // is the A right endpoint colinear to segment B ?\n\n var bCmpARight = b.comparePoint(a.rightSE.point);\n if (bCmpARight !== 0) return bCmpARight; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return -1;\n } // is left endpoint of segment A the right-more?\n\n\n if (alx > blx) {\n if (aly < bly && aly < bry) return -1;\n if (aly > bly && aly > bry) return 1; // is the A left endpoint colinear to segment B?\n\n var bCmpALeft = b.comparePoint(a.leftSE.point);\n if (bCmpALeft !== 0) return bCmpALeft; // is the B right endpoint colinear to segment A?\n\n var aCmpBRight = a.comparePoint(b.rightSE.point);\n if (aCmpBRight < 0) return 1;\n if (aCmpBRight > 0) return -1; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return 1;\n } // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n // consider the lower left-endpoint to come first\n\n\n if (aly < bly) return -1;\n if (aly > bly) return 1; // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n // is the A right endpoint more left-more?\n\n if (arx < brx) {\n var _bCmpARight = b.comparePoint(a.rightSE.point);\n\n if (_bCmpARight !== 0) return _bCmpARight;\n } // is the B right endpoint more left-more?\n\n\n if (arx > brx) {\n var _aCmpBRight = a.comparePoint(b.rightSE.point);\n\n if (_aCmpBRight < 0) return 1;\n if (_aCmpBRight > 0) return -1;\n }\n\n if (arx !== brx) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n var ay = ary - aly;\n var ax = arx - alx;\n var by = bry - bly;\n var bx = brx - blx;\n if (ay > ax && by < bx) return 1;\n if (ay < ax && by > bx) return -1;\n } // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n\n\n if (arx > brx) return 1;\n if (arx < brx) return -1; // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n // consider the lower right-endpoint to come first\n\n if (ary < bry) return -1;\n if (ary > bry) return 1; // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1; // identical segment, ie a === b\n\n return 0;\n }\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n\n }]);\n\n function Segment(leftSE, rightSE, rings, windings) {\n _classCallCheck(this, Segment);\n\n this.id = ++segmentId;\n this.leftSE = leftSE;\n leftSE.segment = this;\n leftSE.otherSE = rightSE;\n this.rightSE = rightSE;\n rightSE.segment = this;\n rightSE.otherSE = leftSE;\n this.rings = rings;\n this.windings = windings; // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n _createClass(Segment, [{\n key: \"replaceRightSE\",\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n value: function replaceRightSE(newRightSE) {\n this.rightSE = newRightSE;\n this.rightSE.segment = this;\n this.rightSE.otherSE = this.leftSE;\n this.leftSE.otherSE = this.rightSE;\n }\n }, {\n key: \"bbox\",\n value: function bbox() {\n var y1 = this.leftSE.point.y;\n var y2 = this.rightSE.point.y;\n return {\n ll: {\n x: this.leftSE.point.x,\n y: y1 < y2 ? y1 : y2\n },\n ur: {\n x: this.rightSE.point.x,\n y: y1 > y2 ? y1 : y2\n }\n };\n }\n /* A vector from the left point to the right */\n\n }, {\n key: \"vector\",\n value: function vector() {\n return {\n x: this.rightSE.point.x - this.leftSE.point.x,\n y: this.rightSE.point.y - this.leftSE.point.y\n };\n }\n }, {\n key: \"isAnEndpoint\",\n value: function isAnEndpoint(pt) {\n return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;\n }\n /* Compare this segment with a point. Return value indicates:\n * 1: point lies above or to the left of segment\n * 0: point is colinear to segment\n * -1: point is below or to the right of segment */\n\n }, {\n key: \"comparePoint\",\n value: function comparePoint(point) {\n if (this.isAnEndpoint(point)) return 0;\n var interPt = closestPoint(this.leftSE.point, this.rightSE.point, point); // use cmp() to do the same rounding as would apply in rounder.round\n // but avoid using rounder.round for performance boost, and to avoid\n // saving the result in the rounding trees\n // also, there is a fair amount of rounding error introduced when computing\n // the closestPoint to a nearly vertical or horizontal segment. Thus, we use\n // the more accurate coordinate for comparison of the two points\n\n var lx = this.leftSE.point.x;\n var ly = this.leftSE.point.y;\n var rx = this.rightSE.point.x;\n var ry = this.rightSE.point.y; // is the segment upward sloping?\n\n if (ry >= ly) {\n // is the segment more vertical?\n if (ry - ly > rx - lx) {\n // use the X coordinate\n var cmpX = cmp(interPt.x, point.x);\n if (cmpX != 0) return cmpX;\n } else {\n // segment is more horizontal, so use Y coord\n var cmpY = cmp(point.y, interPt.y);\n if (cmpY != 0) return cmpY;\n }\n } else {\n // segment is more downward sloping\n // is the segment more vertical?\n if (ly - ry > rx - lx) {\n // use the X coordinate\n var _cmpX = cmp(point.x, interPt.x);\n\n if (_cmpX != 0) return _cmpX;\n } else {\n // segment is more horizontal, so use the Y coordinate\n var _cmpY = cmp(point.y, interPt.y);\n\n if (_cmpY != 0) return _cmpY;\n }\n } // on the line\n\n\n return 0;\n }\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n\n }, {\n key: \"getIntersection\",\n value: function getIntersection(other) {\n // If bboxes don't overlap, there can't be any intersections\n var tBbox = this.bbox();\n var oBbox = other.bbox();\n var bboxOverlap = getBboxOverlap(tBbox, oBbox);\n if (bboxOverlap === null) return null; // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n var tlp = this.leftSE.point;\n var trp = this.rightSE.point;\n var olp = other.leftSE.point;\n var orp = other.rightSE.point; // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n\n var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;\n var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;\n var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;\n var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0; // do left endpoints match?\n\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp;\n if (!touchesThisRSE && touchesOtherRSE) return orp; // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n\n return null;\n } // does this left endpoint matches (other doesn't)\n\n\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x === orp.x && tlp.y === orp.y) return null;\n } // t-intersection on left endpoint\n\n\n return tlp;\n } // does other left endpoint matches (this doesn't)\n\n\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x === olp.x && trp.y === olp.y) return null;\n } // t-intersection on left endpoint\n\n\n return olp;\n } // trivial intersection on right endpoints\n\n\n if (touchesThisRSE && touchesOtherRSE) return null; // t-intersections on just one right endpoint\n\n if (touchesThisRSE) return trp;\n if (touchesOtherRSE) return orp; // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n\n var pt = intersection(tlp, this.vector(), olp, other.vector()); // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n\n if (pt === null) return null; // is the intersection found between the lines not on the segments?\n\n if (!isInBbox(bboxOverlap, pt)) return null; // round the the computed point if needed\n\n return rounder.round(pt.x, pt.y);\n }\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n\n }, {\n key: \"split\",\n value: function split(point) {\n var newEvents = [];\n var alreadyLinked = point.events !== undefined;\n var newLeftSE = new SweepEvent(point, true);\n var newRightSE = new SweepEvent(point, false);\n var oldRightSE = this.rightSE;\n this.replaceRightSE(newRightSE);\n newEvents.push(newRightSE);\n newEvents.push(newLeftSE);\n var newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice()); // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n\n if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {\n newSeg.swapEvents();\n }\n\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents();\n } // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n\n\n if (alreadyLinked) {\n newLeftSE.checkForConsuming();\n newRightSE.checkForConsuming();\n }\n\n return newEvents;\n }\n /* Swap which event is left and right */\n\n }, {\n key: \"swapEvents\",\n value: function swapEvents() {\n var tmpEvt = this.rightSE;\n this.rightSE = this.leftSE;\n this.leftSE = tmpEvt;\n this.leftSE.isLeft = true;\n this.rightSE.isLeft = false;\n\n for (var i = 0, iMax = this.windings.length; i < iMax; i++) {\n this.windings[i] *= -1;\n }\n }\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n\n }, {\n key: \"consume\",\n value: function consume(other) {\n var consumer = this;\n var consumee = other;\n\n while (consumer.consumedBy) {\n consumer = consumer.consumedBy;\n }\n\n while (consumee.consumedBy) {\n consumee = consumee.consumedBy;\n }\n\n var cmp$$1 = Segment.compare(consumer, consumee);\n if (cmp$$1 === 0) return; // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n\n if (cmp$$1 > 0) {\n var tmp = consumer;\n consumer = consumee;\n consumee = tmp;\n } // make sure a segment doesn't consume it's prev\n\n\n if (consumer.prev === consumee) {\n var _tmp = consumer;\n consumer = consumee;\n consumee = _tmp;\n }\n\n for (var i = 0, iMax = consumee.rings.length; i < iMax; i++) {\n var ring = consumee.rings[i];\n var winding = consumee.windings[i];\n var index = consumer.rings.indexOf(ring);\n\n if (index === -1) {\n consumer.rings.push(ring);\n consumer.windings.push(winding);\n } else consumer.windings[index] += winding;\n }\n\n consumee.rings = null;\n consumee.windings = null;\n consumee.consumedBy = consumer; // mark sweep events consumed as to maintain ordering in sweep event queue\n\n consumee.leftSE.consumedBy = consumer.leftSE;\n consumee.rightSE.consumedBy = consumer.rightSE;\n }\n /* The first segment previous segment chain that is in the result */\n\n }, {\n key: \"prevInResult\",\n value: function prevInResult() {\n if (this._prevInResult !== undefined) return this._prevInResult;\n if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult();\n return this._prevInResult;\n }\n }, {\n key: \"beforeState\",\n value: function beforeState() {\n if (this._beforeState !== undefined) return this._beforeState;\n if (!this.prev) this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: []\n };else {\n var seg = this.prev.consumedBy || this.prev;\n this._beforeState = seg.afterState();\n }\n return this._beforeState;\n }\n }, {\n key: \"afterState\",\n value: function afterState() {\n if (this._afterState !== undefined) return this._afterState;\n var beforeState = this.beforeState();\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: []\n };\n var ringsAfter = this._afterState.rings;\n var windingsAfter = this._afterState.windings;\n var mpsAfter = this._afterState.multiPolys; // calculate ringsAfter, windingsAfter\n\n for (var i = 0, iMax = this.rings.length; i < iMax; i++) {\n var ring = this.rings[i];\n var winding = this.windings[i];\n var index = ringsAfter.indexOf(ring);\n\n if (index === -1) {\n ringsAfter.push(ring);\n windingsAfter.push(winding);\n } else windingsAfter[index] += winding;\n } // calcualte polysAfter\n\n\n var polysAfter = [];\n var polysExclude = [];\n\n for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {\n if (windingsAfter[_i] === 0) continue; // non-zero rule\n\n var _ring = ringsAfter[_i];\n var poly = _ring.poly;\n if (polysExclude.indexOf(poly) !== -1) continue;\n if (_ring.isExterior) polysAfter.push(poly);else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly);\n\n var _index = polysAfter.indexOf(_ring.poly);\n\n if (_index !== -1) polysAfter.splice(_index, 1);\n }\n } // calculate multiPolysAfter\n\n\n for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {\n var mp = polysAfter[_i2].multiPoly;\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp);\n }\n\n return this._afterState;\n }\n /* Is this segment part of the final result? */\n\n }, {\n key: \"isInResult\",\n value: function isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false;\n if (this._isInResult !== undefined) return this._isInResult;\n var mpsBefore = this.beforeState().multiPolys;\n var mpsAfter = this.afterState().multiPolys;\n\n switch (operation.type) {\n case 'union':\n {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n var noBefores = mpsBefore.length === 0;\n var noAfters = mpsAfter.length === 0;\n this._isInResult = noBefores !== noAfters;\n break;\n }\n\n case 'intersection':\n {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n var least;\n var most;\n\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length;\n most = mpsAfter.length;\n } else {\n least = mpsAfter.length;\n most = mpsBefore.length;\n }\n\n this._isInResult = most === operation.numMultiPolys && least < most;\n break;\n }\n\n case 'xor':\n {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n var diff = Math.abs(mpsBefore.length - mpsAfter.length);\n this._isInResult = diff % 2 === 1;\n break;\n }\n\n case 'difference':\n {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n var isJustSubject = function isJustSubject(mps) {\n return mps.length === 1 && mps[0].isSubject;\n };\n\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);\n break;\n }\n\n default:\n throw new Error(\"Unrecognized operation type found \".concat(operation.type));\n }\n\n return this._isInResult;\n }\n }], [{\n key: \"fromRing\",\n value: function fromRing(pt1, pt2, ring) {\n var leftPt, rightPt, winding; // ordering the two points according to sweep line ordering\n\n var cmpPts = SweepEvent.comparePoints(pt1, pt2);\n\n if (cmpPts < 0) {\n leftPt = pt1;\n rightPt = pt2;\n winding = 1;\n } else if (cmpPts > 0) {\n leftPt = pt2;\n rightPt = pt1;\n winding = -1;\n } else throw new Error(\"Tried to create degenerate segment at [\".concat(pt1.x, \", \").concat(pt1.y, \"]\"));\n\n var leftSE = new SweepEvent(leftPt, true);\n var rightSE = new SweepEvent(rightPt, false);\n return new Segment(leftSE, rightSE, [ring], [winding]);\n }\n }]);\n\n return Segment;\n}();\n\nvar RingIn =\n/*#__PURE__*/\nfunction () {\n function RingIn(geomRing, poly, isExterior) {\n _classCallCheck(this, RingIn);\n\n this.poly = poly;\n this.isExterior = isExterior;\n this.segments = [];\n var prevPoint = geomRing[0];\n this.bbox = {\n ll: {\n x: prevPoint.x,\n y: prevPoint.y\n },\n ur: {\n x: prevPoint.x,\n y: prevPoint.y\n }\n };\n\n for (var i = 1, iMax = geomRing.length; i < iMax; i++) {\n var point = geomRing[i];\n this.segments.push(Segment.fromRing(prevPoint, point, this));\n if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x;\n if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y;\n if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x;\n if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y;\n prevPoint = point;\n }\n\n this.segments.push(Segment.fromRing(prevPoint, geomRing[0], this));\n }\n\n _createClass(RingIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.segments.length; i < iMax; i++) {\n var segment = this.segments[i];\n sweepEvents.push(segment.leftSE);\n sweepEvents.push(segment.rightSE);\n }\n\n return sweepEvents;\n }\n }]);\n\n return RingIn;\n}();\nvar PolyIn =\n/*#__PURE__*/\nfunction () {\n function PolyIn(geomPoly, multiPoly) {\n _classCallCheck(this, PolyIn);\n\n this.exteriorRing = new RingIn(geomPoly[0], this, true); // copy by value\n\n this.bbox = {\n ll: {\n x: this.exteriorRing.bbox.ll.x,\n y: this.exteriorRing.bbox.ll.y\n },\n ur: {\n x: this.exteriorRing.bbox.ur.x,\n y: this.exteriorRing.bbox.ur.y\n }\n };\n this.interiorRings = [];\n\n for (var i = 1, iMax = geomPoly.length; i < iMax; i++) {\n var ring = new RingIn(geomPoly[i], this, false);\n if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x;\n if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y;\n if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x;\n if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y;\n this.interiorRings.push(ring);\n }\n\n this.multiPoly = multiPoly;\n }\n\n _createClass(PolyIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = this.exteriorRing.getSweepEvents();\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringSweepEvents = this.interiorRings[i].getSweepEvents();\n\n for (var j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return PolyIn;\n}();\nvar MultiPolyIn =\n/*#__PURE__*/\nfunction () {\n function MultiPolyIn(geomMultiPoly) {\n _classCallCheck(this, MultiPolyIn);\n\n this.polys = [];\n this.bbox = {\n ll: {\n x: Number.POSITIVE_INFINITY,\n y: Number.POSITIVE_INFINITY\n },\n ur: {\n x: Number.NEGATIVE_INFINITY,\n y: Number.NEGATIVE_INFINITY\n }\n };\n\n for (var i = 0, iMax = geomMultiPoly.length; i < iMax; i++) {\n var poly = new PolyIn(geomMultiPoly[i], this);\n if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x;\n if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y;\n if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x;\n if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y;\n this.polys.push(poly);\n }\n\n this.isSubject = false;\n }\n\n _createClass(MultiPolyIn, [{\n key: \"markAsSubject\",\n value: function markAsSubject() {\n this.isSubject = true;\n }\n }, {\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polySweepEvents = this.polys[i].getSweepEvents();\n\n for (var j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return MultiPolyIn;\n}();\n\nvar RingOut =\n/*#__PURE__*/\nfunction () {\n _createClass(RingOut, null, [{\n key: \"factory\",\n\n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n value: function factory(allSegments) {\n var ringsOut = [];\n\n for (var i = 0, iMax = allSegments.length; i < iMax; i++) {\n var segment = allSegments[i];\n if (!segment.isInResult() || segment.ringOut) continue;\n var prevEvent = null;\n var event = segment.leftSE;\n var nextEvent = segment.rightSE;\n var events = [event];\n var startingPoint = event.point;\n var intersectionLEs = [];\n /* Walk the chain of linked events to form a closed ring */\n\n while (true) {\n prevEvent = event;\n event = nextEvent;\n events.push(event);\n /* Is the ring complete? */\n\n if (event.point === startingPoint) break;\n\n while (true) {\n var availableLEs = event.getAvailableLinkedEvents();\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n\n if (availableLEs.length === 0) {\n var firstPt = events[0].point;\n var lastPt = events[events.length - 1].point;\n throw new Error(\"Unable to complete output ring starting at [\".concat(firstPt.x, \",\") + \" \".concat(firstPt.y, \"]. Last matching segment found ends at\") + \" [\".concat(lastPt.x, \", \").concat(lastPt.y, \"].\"));\n }\n /* Only one way to go, so cotinue on the path */\n\n\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE;\n break;\n }\n /* We must have an intersection. Check for a completed loop */\n\n\n var indexLE = null;\n\n for (var j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j;\n break;\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n\n\n if (indexLE !== null) {\n var intersectionLE = intersectionLEs.splice(indexLE)[0];\n var ringEvents = events.splice(intersectionLE.index);\n ringEvents.unshift(ringEvents[0].otherSE);\n ringsOut.push(new RingOut(ringEvents.reverse()));\n continue;\n }\n /* register the intersection */\n\n\n intersectionLEs.push({\n index: events.length,\n point: event.point\n });\n /* Choose the left-most option to continue the walk */\n\n var comparator = event.getLeftmostComparator(prevEvent);\n nextEvent = availableLEs.sort(comparator)[0].otherSE;\n break;\n }\n }\n\n ringsOut.push(new RingOut(events));\n }\n\n return ringsOut;\n }\n }]);\n\n function RingOut(events) {\n _classCallCheck(this, RingOut);\n\n this.events = events;\n\n for (var i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this;\n }\n\n this.poly = null;\n }\n\n _createClass(RingOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n var prevPt = this.events[0].point;\n var points = [prevPt];\n\n for (var i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n var _pt = this.events[i].point;\n var _nextPt = this.events[i + 1].point;\n if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue;\n points.push(_pt);\n prevPt = _pt;\n } // ring was all (within rounding error of angle calc) colinear points\n\n\n if (points.length === 1) return null; // check if the starting point is necessary\n\n var pt = points[0];\n var nextPt = points[1];\n if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift();\n points.push(points[0]);\n var step = this.isExteriorRing() ? 1 : -1;\n var iStart = this.isExteriorRing() ? 0 : points.length - 1;\n var iEnd = this.isExteriorRing() ? points.length : -1;\n var orderedPoints = [];\n\n for (var _i = iStart; _i != iEnd; _i += step) {\n orderedPoints.push([points[_i].x, points[_i].y]);\n }\n\n return orderedPoints;\n }\n }, {\n key: \"isExteriorRing\",\n value: function isExteriorRing() {\n if (this._isExteriorRing === undefined) {\n var enclosing = this.enclosingRing();\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;\n }\n\n return this._isExteriorRing;\n }\n }, {\n key: \"enclosingRing\",\n value: function enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing();\n }\n\n return this._enclosingRing;\n }\n /* Returns the ring that encloses this one, if any */\n\n }, {\n key: \"_calcEnclosingRing\",\n value: function _calcEnclosingRing() {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n var leftMostEvt = this.events[0];\n\n for (var i = 1, iMax = this.events.length; i < iMax; i++) {\n var evt = this.events[i];\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt;\n }\n\n var prevSeg = leftMostEvt.segment.prevInResult();\n var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null; // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n\n if (!prevPrevSeg) return prevSeg.ringOut; // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut;\n } else return prevSeg.ringOut.enclosingRing();\n } // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n\n\n prevSeg = prevPrevSeg.prevInResult();\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n }\n }\n }]);\n\n return RingOut;\n}();\nvar PolyOut =\n/*#__PURE__*/\nfunction () {\n function PolyOut(exteriorRing) {\n _classCallCheck(this, PolyOut);\n\n this.exteriorRing = exteriorRing;\n exteriorRing.poly = this;\n this.interiorRings = [];\n }\n\n _createClass(PolyOut, [{\n key: \"addInterior\",\n value: function addInterior(ring) {\n this.interiorRings.push(ring);\n ring.poly = this;\n }\n }, {\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [this.exteriorRing.getGeom()]; // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (geom[0] === null) return null;\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringGeom = this.interiorRings[i].getGeom(); // interior ring was all (within rounding error of angle calc) colinear points\n\n if (ringGeom === null) continue;\n geom.push(ringGeom);\n }\n\n return geom;\n }\n }]);\n\n return PolyOut;\n}();\nvar MultiPolyOut =\n/*#__PURE__*/\nfunction () {\n function MultiPolyOut(rings) {\n _classCallCheck(this, MultiPolyOut);\n\n this.rings = rings;\n this.polys = this._composePolys(rings);\n }\n\n _createClass(MultiPolyOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polyGeom = this.polys[i].getGeom(); // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (polyGeom === null) continue;\n geom.push(polyGeom);\n }\n\n return geom;\n }\n }, {\n key: \"_composePolys\",\n value: function _composePolys(rings) {\n var polys = [];\n\n for (var i = 0, iMax = rings.length; i < iMax; i++) {\n var ring = rings[i];\n if (ring.poly) continue;\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else {\n var enclosingRing = ring.enclosingRing();\n if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing));\n enclosingRing.poly.addInterior(ring);\n }\n }\n\n return polys;\n }\n }]);\n\n return MultiPolyOut;\n}();\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nvar SweepLine =\n/*#__PURE__*/\nfunction () {\n function SweepLine(queue) {\n var comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare;\n\n _classCallCheck(this, SweepLine);\n\n this.queue = queue;\n this.tree = new SplayTree(comparator);\n this.segments = [];\n }\n\n _createClass(SweepLine, [{\n key: \"process\",\n value: function process(event) {\n var segment = event.segment;\n var newEvents = []; // if we've already been consumed by another segment,\n // clean up our body parts and get out\n\n if (event.consumedBy) {\n if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment);\n return newEvents;\n }\n\n var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);\n if (!node) throw new Error(\"Unable to find segment #\".concat(segment.id, \" \") + \"[\".concat(segment.leftSE.point.x, \", \").concat(segment.leftSE.point.y, \"] -> \") + \"[\".concat(segment.rightSE.point.x, \", \").concat(segment.rightSE.point.y, \"] \") + 'in SweepLine tree. Please submit a bug report.');\n var prevNode = node;\n var nextNode = node;\n var prevSeg = undefined;\n var nextSeg = undefined; // skip consumed segments still in tree\n\n while (prevSeg === undefined) {\n prevNode = this.tree.prev(prevNode);\n if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key;\n } // skip consumed segments still in tree\n\n\n while (nextSeg === undefined) {\n nextNode = this.tree.next(nextNode);\n if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key;\n }\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n var prevMySplitter = null;\n\n if (prevSeg) {\n var prevInter = prevSeg.getIntersection(segment);\n\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter;\n\n if (!prevSeg.isAnEndpoint(prevInter)) {\n var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);\n\n for (var i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n }\n } // Check for intersections against the next segment in the sweep line\n\n\n var nextMySplitter = null;\n\n if (nextSeg) {\n var nextInter = nextSeg.getIntersection(segment);\n\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter;\n\n if (!nextSeg.isAnEndpoint(nextInter)) {\n var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);\n\n for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {\n newEvents.push(_newEventsFromSplit[_i]);\n }\n }\n }\n } // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n\n\n if (prevMySplitter !== null || nextMySplitter !== null) {\n var mySplitter = null;\n if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else {\n var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);\n if (cmpSplitters < 0) mySplitter = prevMySplitter;\n if (cmpSplitters > 0) mySplitter = nextMySplitter; // the two splitters are the exact same point\n\n mySplitter = prevMySplitter;\n } // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n\n this.queue.remove(segment.rightSE);\n newEvents.push(segment.rightSE);\n\n var _newEventsFromSplit2 = segment.split(mySplitter);\n\n for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {\n newEvents.push(_newEventsFromSplit2[_i2]);\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.remove(segment);\n newEvents.push(event);\n } else {\n // done with left event\n this.segments.push(segment);\n segment.prev = prevSeg;\n }\n } else {\n // event.isRight\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n var inter = prevSeg.getIntersection(nextSeg);\n\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);\n\n for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {\n newEvents.push(_newEventsFromSplit3[_i3]);\n }\n }\n\n if (!nextSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);\n\n for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {\n newEvents.push(_newEventsFromSplit4[_i4]);\n }\n }\n }\n }\n\n this.tree.remove(segment);\n }\n\n return newEvents;\n }\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n\n }, {\n key: \"_splitSafely\",\n value: function _splitSafely(seg, pt) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.remove(seg);\n var rightSE = seg.rightSE;\n this.queue.remove(rightSE);\n var newEvents = seg.split(pt);\n newEvents.push(rightSE); // splitting can trigger consumption\n\n if (seg.consumedBy === undefined) this.tree.insert(seg);\n return newEvents;\n }\n }]);\n\n return SweepLine;\n}();\n\nvar Operation =\n/*#__PURE__*/\nfunction () {\n function Operation() {\n _classCallCheck(this, Operation);\n }\n\n _createClass(Operation, [{\n key: \"run\",\n value: function run(type, geom, moreGeoms) {\n operation.type = type;\n rounder.reset();\n /* Make a copy of the input geometry with rounded points as objects */\n\n var geoms = [pointsAsObjects(geom)];\n\n for (var i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n geoms.push(pointsAsObjects(moreGeoms[i]));\n }\n /* Clean inputs */\n\n\n for (var _i = 0, _iMax = geoms.length; _i < _iMax; _i++) {\n forceMultiPoly(geoms[_i]);\n cleanMultiPoly(geoms[_i]);\n }\n /* Convert inputs to MultiPoly objects, mark subject */\n\n\n var multipolys = [];\n\n for (var _i2 = 0, _iMax2 = geoms.length; _i2 < _iMax2; _i2++) {\n multipolys.push(new MultiPolyIn(geoms[_i2]));\n }\n\n multipolys[0].markAsSubject();\n operation.numMultiPolys = multipolys.length;\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n\n if (operation.type === 'difference') {\n // in place removal\n var subject = multipolys[0];\n var _i3 = 1;\n\n while (_i3 < multipolys.length) {\n if (getBboxOverlap(multipolys[_i3].bbox, subject.bbox) !== null) _i3++;else multipolys.splice(_i3, 1);\n }\n }\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n\n\n if (operation.type === 'intersection') {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (var _i4 = 0, _iMax3 = multipolys.length; _i4 < _iMax3; _i4++) {\n var mpA = multipolys[_i4];\n\n for (var j = _i4 + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return [];\n }\n }\n }\n /* Put segment endpoints in a priority queue */\n\n\n var queue = new SplayTree(SweepEvent.compare);\n\n for (var _i5 = 0, _iMax4 = multipolys.length; _i5 < _iMax4; _i5++) {\n var sweepEvents = multipolys[_i5].getSweepEvents();\n\n for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {\n queue.insert(sweepEvents[_j]);\n }\n }\n /* Pass the sweep line over those endpoints */\n\n\n var sweepLine = new SweepLine(queue);\n var prevQueueSize = queue.size;\n var node = queue.pop();\n\n while (node) {\n var evt = node.key;\n\n if (queue.size === prevQueueSize) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n var seg = evt.segment;\n throw new Error(\"Unable to pop() \".concat(evt.isLeft ? 'left' : 'right', \" SweepEvent \") + \"[\".concat(evt.point.x, \", \").concat(evt.point.y, \"] from segment #\").concat(seg.id, \" \") + \"[\".concat(seg.leftSE.point.x, \", \").concat(seg.leftSE.point.y, \"] -> \") + \"[\".concat(seg.rightSE.point.x, \", \").concat(seg.rightSE.point.y, \"] from queue. \") + 'Please file a bug report.');\n }\n\n var newEvents = sweepLine.process(evt);\n\n for (var _i6 = 0, _iMax5 = newEvents.length; _i6 < _iMax5; _i6++) {\n var _evt = newEvents[_i6];\n if (_evt.consumedBy === undefined) queue.insert(_evt);\n }\n\n prevQueueSize = queue.size;\n node = queue.pop();\n } // free some memory we don't need anymore\n\n\n rounder.reset();\n /* Collect and compile segments we're keeping into a multipolygon */\n\n var ringsOut = RingOut.factory(sweepLine.segments);\n var result = new MultiPolyOut(ringsOut);\n return result.getGeom();\n }\n }]);\n\n return Operation;\n}(); // singleton available by import\n\nvar operation = new Operation();\n\nvar union = function union(geom) {\n for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n moreGeoms[_key - 1] = arguments[_key];\n }\n\n return operation.run('union', geom, moreGeoms);\n};\n\nvar intersection$1 = function intersection(geom) {\n for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n moreGeoms[_key2 - 1] = arguments[_key2];\n }\n\n return operation.run('intersection', geom, moreGeoms);\n};\n\nvar xor = function xor(geom) {\n for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n moreGeoms[_key3 - 1] = arguments[_key3];\n }\n\n return operation.run('xor', geom, moreGeoms);\n};\n\nvar difference = function difference(subjectGeom) {\n for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n clippingGeoms[_key4 - 1] = arguments[_key4];\n }\n\n return operation.run('difference', subjectGeom, clippingGeoms);\n};\n\nvar index = {\n union: union,\n intersection: intersection$1,\n xor: xor,\n difference: difference\n};\n\nexport default index;\n","/* follows \"An implementation of top-down splaying\"\n * by D. Sleator <sleator@cs.cmu.edu> March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array<string>} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array<Key>}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array<Value>}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array<Key>} keys\n * @param {Array<Value>} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n","module.exports = require(\"@dra2020/util\");","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"util\"] = factory();\n\telse\n\t\troot[\"util\"] = factory();\n})(global, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./lib/all.ts\");\n","export * from './util';\nexport * from './countedhash';\nexport * from './indexedarray';\n","export class CountedHash\n{\n n: number;\n val: any;\n\n constructor()\n {\n this.n = 0;\n this.val = {};\n }\n\n get length(): number { return this.n; }\n\n test(id: string): boolean\n {\n return id != '' && this.val[id] !== undefined;\n }\n\n set(id: string): void\n {\n if (id != '' && ! this.test(id))\n {\n this.n++;\n this.val[id] = true;\n }\n }\n\n clear(id: string): void\n {\n if (this.test(id))\n {\n this.n--;\n delete this.val[id];\n }\n }\n\n empty(): void\n {\n this.n = 0;\n this.val = {};\n }\n\n asArray(): string[]\n {\n let a: string[] = [];\n\n this.forEach(id => { a.push(id) });\n\n return a;\n }\n\n asString(): string\n {\n for (var id in this.val) if (this.val.hasOwnProperty(id))\n return id;\n\n return '';\n }\n\n forEach(f: (id: string) => void): void\n {\n for (var id in this.val) if (this.val.hasOwnProperty(id))\n f(id);\n }\n}\n","export class IndexedArray\n{\n o: any;\n a: any[];\n\n constructor()\n {\n this.o = {};\n this.a = null;\n }\n\n ensure(): void\n {\n if (this.a === null)\n {\n this.a = [];\n for (let p in this.o) if (this.o.hasOwnProperty(p))\n this.a.push(p);\n this.a.sort((a: string, b: string) => { a = a.toUpperCase(); b = b.toUpperCase(); return a < b ? -1 : (a > b ? 1 : 0); });\n }\n }\n\n get length(): number { this.ensure(); return this.a.length; }\n\n test(s: string): boolean\n {\n return !!s && this.o[s] !== undefined;\n }\n\n set(s: string): void\n {\n if (!!s && !this.test(s))\n {\n this.o[s] = true;\n this.a = null;\n }\n }\n\n setAll(a: string[]): void\n {\n if (a && a.length)\n for (let i: number = 0; i < a.length; i++)\n this.set(a[i]);\n }\n\n clear(s: string): void\n {\n if (this.test(s))\n {\n delete this.o[s];\n this.a = null;\n }\n }\n\n at(i: number): string\n {\n this.ensure();\n if (i < 0 || i >= this.a.length)\n return undefined;\n return this.a[i];\n }\n\n empty(): void\n {\n this.o = {};\n this.a = null;\n }\n\n forEach(f: (s: string) => void): void\n {\n for (var s in this.o) if (this.o.hasOwnProperty(s))\n f(s);\n }\n}\n","export type DateString = string;\nexport function Now(): DateString { return (new Date()).toJSON(); }\n\nexport class Elapsed\n{\n tStart: any;\n tDur: any;\n\n constructor(bStart: boolean = true)\n {\n this.tStart = undefined;\n this.tDur = undefined;\n if (bStart) this.start();\n }\n\n start(): void\n {\n if (process)\n this.tStart = process.hrtime();\n else\n this.tStart = performance.now();\n }\n\n end(): void\n {\n if (this.tStart === undefined) this.start();\n if (process)\n this.tDur = process.hrtime(this.tStart);\n else\n this.tDur = performance.now() - this.tStart;\n }\n\n ms(): number\n {\n if (this.tDur === undefined) this.end();\n if (process)\n return Math.round((this.tDur[0]*1000) + (this.tDur[1]/1000000));\n else\n return this.tDur;\n }\n\n nano(): number\n {\n if (process)\n return (this.tDur[0]*1000000000) + this.tDur[1];\n else\n return this.tDur * 1000000;\n }\n}\n\nexport class Deadline\n{\n msDelta: number;\n elapsed: Elapsed;\n\n constructor(msDelta: number)\n {\n this.msDelta = msDelta;\n this.elapsed = new Elapsed();\n }\n\n done(): boolean\n {\n this.elapsed.end();\n return this.elapsed.ms() > this.msDelta;\n }\n}\n\nexport function createGuid(): string\n{\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n}\n\ntype LoopTest = WeakMap<any,boolean>;\n\nfunction _sizeof(a: any, loops: LoopTest): number\n{\n if (a === null || a === undefined) return 0;\n\n switch (typeof a)\n {\n default: return 0;\n case 'number': return 8;\n case 'boolean': return 4;\n case 'string': return a.length * 2;\n\n case 'object':\n {\n if (loops.has(a))\n return 0;\n else\n loops.set(a, true);\n\n let t: number = 0;\n if (Array.isArray(a))\n {\n for (let i: number = 0; i < a.length; i++)\n t += _sizeof(a[i], loops);\n t += 8; // length\n }\n else if (Buffer.isBuffer(a))\n {\n t = a.length;\n }\n else if (a.hasOwnProperty === undefined)\n return t;\n else\n {\n for (var key in a) if (a.hasOwnProperty && a.hasOwnProperty(key))\n {\n t += _sizeof(key, loops); // this is a good estimate of download size, but poor estimate of internal size\n // because of JS object templating vs. naive hashtables\n t += _sizeof(a[key], loops);\n }\n }\n return t;\n }\n }\n}\n\nexport function sizeof(a: any): number\n{\n let loops: LoopTest = new WeakMap();\n let n: number = _sizeof(a, loops);\n return n;\n}\n\nexport function depthof(a: any): number\n{\n if (a === null || a === undefined) return 1;\n\n switch (typeof a)\n {\n default: return 1;\n case 'number': return 1;\n case 'boolean': return 1;\n case 'string': return 1;\n\n case 'object':\n {\n let d: number = 0;\n if (Array.isArray(a))\n return a.length > 0 ? (1 + depthof(a[0])) : 2; // still return 2 for empty array\n else if (Buffer.isBuffer(a))\n return 2;\n else if (a.hasOwnProperty === undefined)\n return 1;\n else\n {\n for (var key in a) if (a.hasOwnProperty(key))\n return 1 + depthof(a[key]);\n return 2; // or 2 for empty object\n }\n }\n }\n}\nexport function isEmpty(o: any): boolean\n{\n if (o === null || o === undefined) return true;\n for (var p in o) if (o.hasOwnProperty(p)) return false;\n return true;\n}\n\nexport function countKeys(o: any): number\n{\n if (o === undefined || typeof o !== 'object') return -1;\n\n let count: number = 0;\n for (let p in o) if (o.hasOwnProperty(p))\n count++;\n return count;\n}\n\nexport function nthProperty(o: any, n: number = 0): any\n{\n for (let p in o) if (o.hasOwnProperty(p))\n {\n if (n <= 0) return o[p];\n n--;\n }\n return undefined;\n}\n\nexport function partialEqual(o: any, subset: any): boolean\n{\n for (let p in subset) if (subset.hasOwnProperty(p))\n if (o[p] !== subset[p])\n return false;\n return true;\n}\n\nexport function deepEqual(o1: any, o2: any): boolean\n{\n if (typeof o1 !== typeof o2) return false;\n if (typeof o1 !== 'object') return o1 === o2;\n\n // Special case array\n if (Array.isArray(o1))\n {\n if (! Array.isArray(o2)) return false;\n if (o1.length != o2.length) return false;\n for (let i: number = 0; i < o1.length; i++)\n if (! deepEqual(o1[i], o2[i]))\n return false;\n return true;\n }\n\n // Special case object\n if (o1.hasOwnProperty === undefined || o2.hasOwnProperty === undefined)\n return o1 === o2;\n\n for (let p in o1) if (o1.hasOwnProperty(p))\n {\n if (o2[p] === undefined)\n return false;\n if (! deepEqual(o1[p], o2[p]))\n return false;\n }\n // If any properties in o2 aren't in o1, not equal\n for (let p in o2) if (o2.hasOwnProperty(p))\n if (o1[p] === undefined)\n return false;\n\n return true;\n}\n\nconst Months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];\n\nexport function prettyDate(d: Date): string\n{\n if (d == null) return 'unknown';\n\n let mmm = Months[d.getMonth()];\n let dd = d.getDate();\n let yyyy = d.getFullYear();\n let hh = d.getHours();\n let m = d.getMinutes();\n let mm = m < 10 ? `0${m}` : String(m);\n let ampm = hh >= 12 ? 'PM' : 'AM';\n if (hh > 12) hh -= 12;\n\n return `${mmm} ${dd}, ${yyyy} at ${hh}:${mm} ${ampm}`;\n}\n\nexport function textToHtml(sText: string): string\n{\n let lines: string[] = sText.split('\\n');\n let aHtml: string[] = [];\n let inTable: boolean = false;\n aHtml.push('<body>');\n for (let i: number = 0; i < lines.length; i++)\n {\n let line = lines[i];\n let isRow: boolean = line.indexOf('|') === 0;\n if (inTable && !isRow)\n {\n aHtml.push('</tbody></table>');\n inTable = false;\n }\n if (isRow && !inTable)\n {\n inTable = true;\n aHtml.push('<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\"><tbody>');\n }\n if (isRow)\n {\n let cells = line.split('|');\n if (cells.length > 2)\n {\n aHtml.push('<tr>');\n for (let j: number = 1; j < cells.length-1; j++)\n aHtml.push(`<td>${cells[j]}</td>`);\n aHtml.push('</tr>');\n }\n }\n else\n aHtml.push(`<div>${line}&nbsp;</div>`);\n }\n if (inTable)\n aHtml.push('</tbody></table>');\n aHtml.push('</body>');\n return aHtml.join('');\n}\n\nexport function shallowCopy(src: any): any\n{\n if (src === null || src === undefined) return src;\n\n switch (typeof src)\n {\n case 'boolean':\n case 'number':\n case 'string':\n case 'symbol':\n case 'function':\n default:\n return src;\n\n case 'object':\n if (Array.isArray(src))\n return src.slice();\n else\n {\n let copy: any = {};\n\n for (var p in src) if (src.hasOwnProperty(p))\n copy[p] = src[p];\n return copy;\n }\n }\n}\n\nexport function shallowAssign(o1: any, o2: any): any\n{\n if (o1 === null || o1 === undefined) o1 = {};\n if (o2 === null || o2 === undefined) return o1;\n if (typeof o2 !== 'object' || typeof o1 !== 'object') return o1;\n\n for (var p in o2) if (o2.hasOwnProperty(p))\n o1[p] = o2[p];\n return o1;\n}\n\nexport function shallowAssignImmutable(o1: any, o2: any): any\n{\n if (o1 === null || o1 === undefined) o1 = {};\n if (o2 === null || o2 === undefined) return o1;\n if (typeof o2 !== 'object' || typeof o1 !== 'object') return o1;\n\n // First determine whether o2 changes any properties, if it has, make new instance\n let oNew: any = o1;\n for (let p in o2) if (o2.hasOwnProperty(p))\n {\n if (o1[p] != o2[p])\n {\n oNew = shallowCopy(o1);\n break;\n }\n }\n if (oNew !== o1)\n shallowAssign(oNew, o2);\n return oNew;\n}\n\nexport function shallowEqual(o1: any, o2: any): boolean\n{\n if (o1 === undefined || o2 === undefined || typeof o1 !== 'object' || typeof o2 !== 'object')\n return o1 === o2;\n\n if (Array.isArray(o1) && Array.isArray(o2))\n {\n if (o1.length != o2.length) return false;\n for (let i: number = 0; i < o1.length; i++)\n if (o1[i] !== o2[i]) return false;\n return true;\n }\n else\n {\n let p: any;\n\n for (p in o1) if (o1.hasOwnProperty(p))\n if (o1[p] !== o2[p]) return false;\n for (p in o2) if (o2.hasOwnProperty(p))\n if (o1[p] === undefined) return false;\n return true;\n }\n}\n\nexport function deepCopy(src: any): any\n{\n // Beware typeof oddities\n if (src === null || src === undefined) return src;\n\n if (typeof src === 'object')\n {\n if (Array.isArray(src))\n {\n let dst: any[] = [];\n\n for (let i: number = 0; i < src.length; i++)\n dst.push(deepCopy(src[i]));\n return dst;\n }\n else\n {\n if (src.hasOwnProperty === undefined)\n return src;\n\n let dst: any = {};\n for (var p in src) if (src.hasOwnProperty(p))\n dst[p] = deepCopy(src[p]);\n return dst;\n }\n }\n else\n return src;\n}\n\nexport function precisionRound(n: number, p: number): number\n{\n let f: number = Math.pow(10, p);\n return Math.round(n * f) / f;\n}\n\nexport function percentString(num: number, den: number, precision: number = 0): string\n{\n if (den == 0)\n return '(-)';\n\n let p: number = precisionRound((num/den) * 100, precision);\n\n return String(p) + '%';\n}\n\nexport function hash(s: string): number\n{\n let hash: number = 5381;\n let i: number = s.length;\n\n while (i)\n hash = (hash * 33) ^ s.charCodeAt(--i);\n\n /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n * integers. Since we want the results to be always positive, convert the\n * signed int to an unsigned by doing an unsigned bitshift. */\n return hash >>> 0;\n}\n\nexport function hashObject(o: any): number\n{\n return hash(o ? JSON.stringify(o) : '');\n}\n\nconst HexTable: string[] = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ];\nexport function toHex(n: number): string\n{\n if (n < 0 || n > 255) throw('only 0 to 255 supported now');\n n = Math.floor(n);\n return HexTable[n >> 4] + HexTable[n & 15];\n}\n\nexport function toRGBA(color: string, alpha: number): string\n{\n let r: number;\n let g: number;\n let b: number;\n\n switch (color)\n {\n case 'white':\n r = 255; g = 255; b = 255;\n break;\n\n case 'black':\n r = 0; g = 0; b = 0;\n break;\n\n default:\n r = parseInt(color.substr(1, 2), 16);\n g = parseInt(color.substr(3, 2), 16);\n b = parseInt(color.substr(5, 2), 16);\n break;\n }\n\n return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${String(alpha)})`;\n}\n\nexport function toRGBAIntensity(color: string, intensity: number, alpha: number): string\n{\n // for now assume color is black\n let g: number = precisionRound(255 * intensity, 0);\n return `rgba(${String(g)}, ${String(g)}, ${String(g)}, ${String(alpha)})`;\n}\n\n// Geo functions\nexport function distance(x0: number, y0: number, x1: number, y1: number): number\n{\n return Math.hypot(x0 - x1, y0 - y1);\n}\n\nexport function deg2rad(num: number): number { return num * Math.PI / 180; }\nexport function rad2deg(num: number): number { return num / Math.PI * 180; }\n\n// Restricts lon to range [-180..180]\nexport function wrapLon(lon: number): number\n{\n let worlds = Math.floor((lon + 180) / 360);\n return lon - (worlds * 360);\n}\n","\n\nclass ResizeableBuffer{\n constructor(size=100){\n this.size = size\n this.length = 0\n this.buf = Buffer.alloc(size)\n }\n prepend(val){\n const length = this.length++\n if(length === this.size){\n this.resize()\n }\n const buf = this.clone()\n this.buf[0] = val\n buf.copy(this.buf,1, 0, length)\n }\n append(val){\n const length = this.length++\n if(length === this.size){\n this.resize()\n }\n this.buf[length] = val\n }\n clone(){\n return Buffer.from(this.buf.slice(0, this.length))\n }\n resize(){\n const length = this.length\n this.size = this.size * 2\n const buf = Buffer.alloc(this.size)\n this.buf.copy(buf,0, 0, length)\n this.buf = buf\n }\n toString(){\n return this.buf.slice(0, this.length).toString()\n }\n toJSON(){\n return this.toString()\n }\n reset(){\n this.length = 0\n }\n}\n\nmodule.exports = ResizeableBuffer\n","\n/*\nCSV Parse\n\nPlease look at the [project documentation](https://csv.js.org/parse/) for additional\ninformation.\n*/\n\nconst { Transform } = require('stream')\nconst ResizeableBuffer = require('./ResizeableBuffer')\n\nconst cr = 13\nconst nl = 10\nconst space = 32\nconst tab = 9\nconst bom_utf8 = Buffer.from([239, 187, 191])\n\nclass Parser extends Transform {\n constructor(opts = {}){\n super({...{readableObjectMode: true}, ...opts})\n const options = {}\n // Merge with user options\n for(let opt in opts){\n options[underscore(opt)] = opts[opt]\n }\n // Normalize option `bom`\n if(options.bom === undefined || options.bom === null || options.bom === false){\n options.bom = false\n }else if(options.bom !== true){\n throw new CsvError('CSV_INVALID_OPTION_BOM', [\n 'Invalid option bom:', 'bom must be true,',\n `got ${JSON.stringify(options.bom)}`\n ])\n }\n // Normalize option `cast`\n let fnCastField = null\n if(options.cast === undefined || options.cast === null || options.cast === false || options.cast === ''){\n options.cast = undefined\n }else if(typeof options.cast === 'function'){\n fnCastField = options.cast\n options.cast = true\n }else if(options.cast !== true){\n throw new CsvError('CSV_INVALID_OPTION_CAST', [\n 'Invalid option cast:', 'cast must be true or a function,',\n `got ${JSON.stringify(options.cast)}`\n ])\n }\n // Normalize option `cast_date`\n if(options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === ''){\n options.cast_date = false\n }else if(options.cast_date === true){\n options.cast_date = function(value){\n const date = Date.parse(value)\n return !isNaN(date) ? new Date(date) : value\n }\n }else if(typeof options.cast_date !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', [\n 'Invalid option cast_date:', 'cast_date must be true or a function,',\n `got ${JSON.stringify(options.cast_date)}`\n ])\n }\n // Normalize option `columns`\n let fnFirstLineToHeaders = null\n if(options.columns === true){\n // Fields in the first line are converted as-is to columns\n fnFirstLineToHeaders = undefined\n }else if(typeof options.columns === 'function'){\n fnFirstLineToHeaders = options.columns\n options.columns = true\n }else if(Array.isArray(options.columns)){\n options.columns = normalizeColumnsArray(options.columns)\n }else if(options.columns === undefined || options.columns === null || options.columns === false){\n options.columns = false\n }else{\n throw new CsvError('CSV_INVALID_OPTION_COLUMNS', [\n 'Invalid option columns:',\n 'expect an object, a function or true,',\n `got ${JSON.stringify(options.columns)}`\n ])\n }\n // Normalize option `comment`\n if(options.comment === undefined || options.comment === null || options.comment === false || options.comment === ''){\n options.comment = null\n }else{\n if(typeof options.comment === 'string'){\n options.comment = Buffer.from(options.comment)\n }\n if(!Buffer.isBuffer(options.comment)){\n throw new CsvError('CSV_INVALID_OPTION_COMMENT', [\n 'Invalid option comment:',\n 'comment must be a buffer or a string,',\n `got ${JSON.stringify(options.comment)}`\n ])\n }\n }\n // Normalize option `delimiter`\n if(options.delimiter === undefined || options.delimiter === null || options.delimiter === false){\n options.delimiter = Buffer.from(',')\n }else if(typeof options.delimiter === 'string' && options.delimiter.length !== 0){\n options.delimiter = Buffer.from(options.delimiter)\n }else if(\n (Buffer.isBuffer(options.delimiter) && options.delimiter.length === 0) ||\n (typeof options.delimiter === 'string' && options.delimiter.length === 0) ||\n (!Buffer.isBuffer(options.delimiter) && typeof options.delimiter !== 'string')\n ){\n throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [\n 'Invalid option delimiter:',\n 'delimiter must be a non empty string or buffer,',\n `got ${JSON.stringify(options.delimiter)}`\n ])\n }\n // Normalize option `escape`\n if(options.escape === undefined || options.escape === null){\n options.escape = Buffer.from('\"')\n }else if(typeof options.escape === 'string'){\n options.escape = Buffer.from(options.escape)\n }\n if(!Buffer.isBuffer(options.escape)){\n throw new Error(`Invalid Option: escape must be a buffer or a string, got ${JSON.stringify(options.escape)}`)\n }else if(options.escape.length !== 1){\n throw new Error(`Invalid Option Length: escape must be one character, got ${options.escape.length}`)\n }else{\n options.escape = options.escape[0]\n }\n // Normalize option `from`\n if(options.from === undefined || options.from === null){\n options.from = 1\n }else{\n if(typeof options.from === 'string' && /\\d+/.test(options.from)){\n options.from = parseInt(options.from)\n }\n if(Number.isInteger(options.from)){\n if(options.from < 0){\n throw new Error(`Invalid Option: from must be a positive integer, got ${JSON.stringify(opts.from)}`)\n }\n }else{\n throw new Error(`Invalid Option: from must be an integer, got ${JSON.stringify(options.from)}`)\n }\n }\n // Normalize option `from_line`\n if(options.from_line === undefined || options.from_line === null){\n options.from_line = 1\n }else{\n if(typeof options.from_line === 'string' && /\\d+/.test(options.from_line)){\n options.from_line = parseInt(options.from_line)\n }\n if(Number.isInteger(options.from_line)){\n if(options.from_line <= 0){\n throw new Error(`Invalid Option: from_line must be a positive integer greater than 0, got ${JSON.stringify(opts.from_line)}`)\n }\n }else{\n throw new Error(`Invalid Option: from_line must be an integer, got ${JSON.stringify(opts.from_line)}`)\n }\n }\n // Normalize option `info`\n if(options.info === undefined || options.info === null || options.info === false){\n options.info = false\n }else if(options.info !== true){\n throw new Error(`Invalid Option: info must be true, got ${JSON.stringify(options.info)}`)\n }\n // Normalize option `max_record_size`\n if(options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false){\n options.max_record_size = 0\n }else if(Number.isInteger(options.max_record_size) && options.max_record_size >= 0){\n // Great, nothing to do\n }else if(typeof options.max_record_size === 'string' && /\\d+/.test(options.max_record_size)){\n options.max_record_size = parseInt(options.max_record_size)\n }else{\n throw new Error(`Invalid Option: max_record_size must be a positive integer, got ${JSON.stringify(options.max_record_size)}`)\n }\n // Normalize option `objname`\n if(options.objname === undefined || options.objname === null || options.objname === false){\n options.objname = undefined\n }else if(Buffer.isBuffer(options.objname)){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty buffer`)\n }\n options.objname = options.objname.toString()\n }else if(typeof options.objname === 'string'){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty string`)\n }\n // Great, nothing to do\n }else{\n throw new Error(`Invalid Option: objname must be a string or a buffer, got ${options.objname}`)\n }\n // Normalize option `on_record`\n if(options.on_record === undefined || options.on_record === null){\n options.on_record = undefined\n }else if(typeof options.on_record !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', [\n 'Invalid option `on_record`:',\n 'expect a function,',\n `got ${JSON.stringify(options.on_record)}`\n ])\n }\n // Normalize option `quote`\n if(options.quote === null || options.quote === false || options.quote === ''){\n options.quote = null\n }else{\n if(options.quote === undefined || options.quote === true){\n options.quote = Buffer.from('\"')\n }else if(typeof options.quote === 'string'){\n options.quote = Buffer.from(options.quote)\n }\n if(!Buffer.isBuffer(options.quote)){\n throw new Error(`Invalid Option: quote must be a buffer or a string, got ${JSON.stringify(options.quote)}`)\n }else if(options.quote.length !== 1){\n throw new Error(`Invalid Option Length: quote must be one character, got ${options.quote.length}`)\n }else{\n options.quote = options.quote[0]\n }\n }\n // Normalize option `raw`\n if(options.raw === undefined || options.raw === null || options.raw === false){\n options.raw = false\n }else if(options.raw !== true){\n throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`)\n }\n // Normalize option `record_delimiter`\n if(!options.record_delimiter){\n options.record_delimiter = []\n }else if(!Array.isArray(options.record_delimiter)){\n options.record_delimiter = [options.record_delimiter]\n }\n options.record_delimiter = options.record_delimiter.map( function(rd){\n if(typeof rd === 'string'){\n rd = Buffer.from(rd)\n }\n return rd\n })\n // Normalize option `relax`\n if(typeof options.relax === 'boolean'){\n // Great, nothing to do\n }else if(options.relax === undefined || options.relax === null){\n options.relax = false\n }else{\n throw new Error(`Invalid Option: relax must be a boolean, got ${JSON.stringify(options.relax)}`)\n }\n // Normalize option `relax_column_count`\n if(typeof options.relax_column_count === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count === undefined || options.relax_column_count === null){\n options.relax_column_count = false\n }else{\n throw new Error(`Invalid Option: relax_column_count must be a boolean, got ${JSON.stringify(options.relax_column_count)}`)\n }\n if(typeof options.relax_column_count_less === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_less === undefined || options.relax_column_count_less === null){\n options.relax_column_count_less = false\n }else{\n throw new Error(`Invalid Option: relax_column_count_less must be a boolean, got ${JSON.stringify(options.relax_column_count_less)}`)\n }\n if(typeof options.relax_column_count_more === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_more === undefined || options.relax_column_count_more === null){\n options.relax_column_count_more = false\n }else{\n throw new Error(`Invalid Option: relax_column_count_more must be a boolean, got ${JSON.stringify(options.relax_column_count_more)}`)\n }\n // Normalize option `skip_empty_lines`\n if(typeof options.skip_empty_lines === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_empty_lines === undefined || options.skip_empty_lines === null){\n options.skip_empty_lines = false\n }else{\n throw new Error(`Invalid Option: skip_empty_lines must be a boolean, got ${JSON.stringify(options.skip_empty_lines)}`)\n }\n // Normalize option `skip_lines_with_empty_values`\n if(typeof options.skip_lines_with_empty_values === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_lines_with_empty_values === undefined || options.skip_lines_with_empty_values === null){\n options.skip_lines_with_empty_values = false\n }else{\n throw new Error(`Invalid Option: skip_lines_with_empty_values must be a boolean, got ${JSON.stringify(options.skip_lines_with_empty_values)}`)\n }\n // Normalize option `skip_lines_with_error`\n if(typeof options.skip_lines_with_error === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_lines_with_error === undefined || options.skip_lines_with_error === null){\n options.skip_lines_with_error = false\n }else{\n throw new Error(`Invalid Option: skip_lines_with_error must be a boolean, got ${JSON.stringify(options.skip_lines_with_error)}`)\n }\n // Normalize option `rtrim`\n if(options.rtrim === undefined || options.rtrim === null || options.rtrim === false){\n options.rtrim = false\n }else if(options.rtrim !== true){\n throw new Error(`Invalid Option: rtrim must be a boolean, got ${JSON.stringify(options.rtrim)}`)\n }\n // Normalize option `ltrim`\n if(options.ltrim === undefined || options.ltrim === null || options.ltrim === false){\n options.ltrim = false\n }else if(options.ltrim !== true){\n throw new Error(`Invalid Option: ltrim must be a boolean, got ${JSON.stringify(options.ltrim)}`)\n }\n // Normalize option `trim`\n if(options.trim === undefined || options.trim === null || options.trim === false){\n options.trim = false\n }else if(options.trim !== true){\n throw new Error(`Invalid Option: trim must be a boolean, got ${JSON.stringify(options.trim)}`)\n }\n // Normalize options `trim`, `ltrim` and `rtrim`\n if(options.trim === true && opts.ltrim !== false){\n options.ltrim = true\n }else if(options.ltrim !== true){\n options.ltrim = false\n }\n if(options.trim === true && opts.rtrim !== false){\n options.rtrim = true\n }else if(options.rtrim !== true){\n options.rtrim = false\n }\n // Normalize option `to`\n if(options.to === undefined || options.to === null){\n options.to = -1\n }else{\n if(typeof options.to === 'string' && /\\d+/.test(options.to)){\n options.to = parseInt(options.to)\n }\n if(Number.isInteger(options.to)){\n if(options.to <= 0){\n throw new Error(`Invalid Option: to must be a positive integer greater than 0, got ${JSON.stringify(opts.to)}`)\n }\n }else{\n throw new Error(`Invalid Option: to must be an integer, got ${JSON.stringify(opts.to)}`)\n }\n }\n // Normalize option `to_line`\n if(options.to_line === undefined || options.to_line === null){\n options.to_line = -1\n }else{\n if(typeof options.to_line === 'string' && /\\d+/.test(options.to_line)){\n options.to_line = parseInt(options.to_line)\n }\n if(Number.isInteger(options.to_line)){\n if(options.to_line <= 0){\n throw new Error(`Invalid Option: to_line must be a positive integer greater than 0, got ${JSON.stringify(opts.to_line)}`)\n }\n }else{\n throw new Error(`Invalid Option: to_line must be an integer, got ${JSON.stringify(opts.to_line)}`)\n }\n }\n this.info = {\n comment_lines: 0,\n empty_lines: 0,\n invalid_field_length: 0,\n lines: 1,\n records: 0\n }\n this.options = options\n this.state = {\n bomSkipped: false,\n castField: fnCastField,\n commenting: false,\n enabled: options.from_line === 1,\n escaping: false,\n escapeIsQuote: options.escape === options.quote,\n expectedRecordLength: options.columns === null ? 0 : options.columns.length,\n field: new ResizeableBuffer(20),\n firstLineToHeaders: fnFirstLineToHeaders,\n info: Object.assign({}, this.info),\n previousBuf: undefined,\n quoting: false,\n stop: false,\n rawBuffer: new ResizeableBuffer(100),\n record: [],\n recordHasError: false,\n record_length: 0,\n recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 2 : Math.max(...options.record_delimiter.map( (v) => v.length)),\n trimChars: [Buffer.from(' ')[0], Buffer.from('\\t')[0]],\n wasQuoting: false,\n wasRowDelimiter: false\n }\n }\n // Implementation of `Transform._transform`\n _transform(buf, encoding, callback){\n if(this.state.stop === true){\n return\n }\n const err = this.__parse(buf, false)\n if(err !== undefined){\n this.state.stop = true\n }\n callback(err)\n }\n // Implementation of `Transform._flush`\n _flush(callback){\n if(this.state.stop === true){\n return\n }\n const err = this.__parse(undefined, true)\n callback(err)\n }\n // Central parser implementation\n __parse(nextBuf, end){\n const {bom, comment, escape, from_line, info, ltrim, max_record_size, quote, raw, relax, rtrim, skip_empty_lines, to, to_line} = this.options\n let {record_delimiter} = this.options\n const {bomSkipped, previousBuf, rawBuffer, escapeIsQuote} = this.state\n let buf\n if(previousBuf === undefined){\n if(nextBuf === undefined){\n // Handle empty string\n this.push(null)\n return\n }else{\n buf = nextBuf\n }\n }else if(previousBuf !== undefined && nextBuf === undefined){\n buf = previousBuf\n }else{\n buf = Buffer.concat([previousBuf, nextBuf])\n }\n // Handle UTF BOM\n if(bomSkipped === false){\n if(bom === false){\n this.state.bomSkipped = true\n }else if(buf.length < 3){\n // No enough data\n if(end === false){\n // Wait for more data\n this.state.previousBuf = buf\n return\n }\n // skip BOM detect because data length < 3\n }else{\n if(bom_utf8.compare(buf, 0, 3) === 0){\n // Skip BOM\n buf = buf.slice(3)\n }\n this.state.bomSkipped = true\n }\n }\n const bufLen = buf.length\n let pos\n for(pos = 0; pos < bufLen; pos++){\n // Ensure we get enough space to look ahead\n // There should be a way to move this out of the loop\n if(this.__needMoreData(pos, bufLen, end)){\n break\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++\n if(info === true && this.state.record.length === 0 && this.state.field.length === 0 && this.state.wasQuoting === false){\n this.state.info = Object.assign({}, this.info)\n }\n this.state.wasRowDelimiter = false\n }\n if(to_line !== -1 && this.info.lines > to_line){\n this.state.stop = true\n this.push(null)\n return\n }\n // Auto discovery of record_delimiter, unix, mac and windows supported\n if(this.state.quoting === false && record_delimiter.length === 0){\n const record_delimiterCount = this.__autoDiscoverRowDelimiter(buf, pos)\n if(record_delimiterCount){\n record_delimiter = this.options.record_delimiter\n }\n }\n const chr = buf[pos]\n if(raw === true){\n rawBuffer.append(chr)\n }\n if((chr === cr || chr === nl) && this.state.wasRowDelimiter === false ){\n this.state.wasRowDelimiter = true\n }\n // Previous char was a valid escape char\n // treat the current char as a regular char\n if(this.state.escaping === true){\n this.state.escaping = false\n }else{\n // Escape is only active inside quoted fields\n // We are quoting, the char is an escape chr and there is a chr to escape\n if(this.state.quoting === true && chr === escape && pos + 1 < bufLen){\n if(escapeIsQuote){\n if(buf[pos+1] === quote){\n this.state.escaping = true\n continue\n }\n }else{\n this.state.escaping = true\n continue\n }\n }\n // Not currently escaping and chr is a quote\n // TODO: need to compare bytes instead of single char\n if(this.state.commenting === false && chr === quote){\n if(this.state.quoting === true){\n const nextChr = buf[pos+1]\n const isNextChrTrimable = rtrim && this.__isCharTrimable(nextChr)\n // const isNextChrComment = nextChr === comment\n const isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos+1, nextChr)\n const isNextChrDelimiter = this.__isDelimiter(nextChr, buf, pos+1)\n const isNextChrRowDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRowDelimiter(buf, pos+1) : this.__isRecordDelimiter(nextChr, buf, pos+1)\n // Escape a quote\n // Treat next char as a regular character\n // TODO: need to compare bytes instead of single char\n if(chr === escape && nextChr === quote){\n pos++\n }else if(!nextChr || isNextChrDelimiter || isNextChrRowDelimiter || isNextChrComment || isNextChrTrimable){\n this.state.quoting = false\n this.state.wasQuoting = true\n continue\n }else if(relax === false){\n const err = this.__error(\n new CsvError('CSV_INVALID_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n `got \"${String.fromCharCode(nextChr)}\"`,\n `at line ${this.info.lines}`,\n 'instead of delimiter, row delimiter, trimable character',\n '(if activated) or comment',\n ], this.__context())\n )\n if(err !== undefined) return err\n }else{\n this.state.quoting = false\n this.state.wasQuoting = true\n // continue\n this.state.field.prepend(quote)\n }\n }else{\n if(this.state.field.length !== 0){\n // In relax mode, treat opening quote preceded by chrs as regular\n if( relax === false ){\n const err = this.__error(\n new CsvError('INVALID_OPENING_QUOTE', [\n 'Invalid Opening Quote:',\n `a quote is found inside a field at line ${this.info.lines}`,\n ], this.__context(), {\n field: this.state.field,\n })\n )\n if(err !== undefined) return err\n }\n }else{\n this.state.quoting = true\n continue\n }\n }\n }\n if(this.state.quoting === false){\n let recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos)\n if(recordDelimiterLength !== 0){\n // Do not emit comments which take a full line\n const skipCommentLine = this.state.commenting && (this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0)\n if(skipCommentLine){\n this.info.comment_lines++\n // Skip full comment line\n }else{\n // Skip if line is empty and skip_empty_lines activated\n if(skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0){\n this.info.empty_lines++\n pos += recordDelimiterLength - 1\n continue\n }\n // Activate records emition if above from_line\n if(this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1: 0 ) >= from_line){\n this.state.enabled = true\n this.__resetField()\n this.__resetRow()\n pos += recordDelimiterLength - 1\n continue\n }else{\n const errField = this.__onField()\n if(errField !== undefined) return errField\n const errRecord = this.__onRow()\n if(errRecord !== undefined) return errRecord\n }\n if(to !== -1 && this.info.records >= to){\n this.state.stop = true\n this.push(null)\n return\n }\n }\n this.state.commenting = false\n pos += recordDelimiterLength - 1\n continue\n }\n if(this.state.commenting){\n continue\n }\n const commentCount = comment === null ? 0 : this.__compareBytes(comment, buf, pos, chr)\n if(commentCount !== 0){\n this.state.commenting = true\n continue\n }\n let delimiterLength = this.__isDelimiter(chr, buf, pos)\n if(delimiterLength !== 0){\n const errField = this.__onField()\n if(errField !== undefined) return errField\n pos += delimiterLength - 1\n continue\n }\n }\n }\n if(this.state.commenting === false){\n if(max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size){\n const err = this.__error(\n new CsvError('CSV_MAX_RECORD_SIZE', [\n 'Max Record Size:',\n 'record exceed the maximum number of tolerated bytes',\n `of ${max_record_size}`,\n `at line ${this.info.lines}`,\n ], this.__context())\n )\n if(err !== undefined) return err\n }\n }\n\n const lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(chr)\n // rtrim in non quoting is handle in __onField\n const rappend = rtrim === false || this.state.wasQuoting === false\n if( lappend === true && rappend === true ){\n this.state.field.append(chr)\n }else if(rtrim === true && !this.__isCharTrimable(chr)){\n const err = this.__error(\n new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n 'found non trimable byte after quote',\n `at line ${this.info.lines}`,\n ], this.__context())\n )\n if(err !== undefined) return err\n }\n }\n if(end === true){\n // Ensure we are not ending in a quoting state\n if(this.state.quoting === true){\n const err = this.__error(\n new CsvError('CSV_QUOTE_NOT_CLOSED', [\n 'Quote Not Closed:',\n `the parsing is finished with an opening quote at line ${this.info.lines}`,\n ], this.__context())\n )\n if(err !== undefined) return err\n }else{\n // Skip last line if it has no characters\n if(this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0){\n const errField = this.__onField()\n if(errField !== undefined) return errField\n const errRecord = this.__onRow()\n if(errRecord !== undefined) return errRecord\n }else if(this.state.wasRowDelimiter === true){\n this.info.empty_lines++\n }else if(this.state.commenting === true){\n this.info.comment_lines++\n }\n }\n }else{\n this.state.previousBuf = buf.slice(pos)\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++\n this.state.wasRowDelimiter = false\n }\n }\n // Helper to test if a character is a space or a line delimiter\n __isCharTrimable(chr){\n return chr === space || chr === tab || chr === cr || chr === nl\n }\n __onRow(){\n const {columns, info, from, relax_column_count, relax_column_count_less, relax_column_count_more, raw, skip_lines_with_empty_values} = this.options\n const {enabled, record} = this.state\n if(enabled === false){\n return this.__resetRow()\n }\n // Convert the first line into column names\n const recordLength = record.length\n if(columns === true){\n if(isRecordEmpty(record)){\n this.__resetRow()\n return\n }\n return this.__firstLineToColumns(record)\n }\n if(columns === false && this.info.records === 0){\n this.state.expectedRecordLength = recordLength\n }\n if(recordLength !== this.state.expectedRecordLength){\n if(relax_column_count === true || \n (relax_column_count_less === true && recordLength < this.state.expectedRecordLength) ||\n (relax_column_count_more === true && recordLength > this.state.expectedRecordLength) ){\n this.info.invalid_field_length++\n }else{\n if(columns === false){\n const err = this.__error(\n new CsvError('CSV_INCONSISTENT_RECORD_LENGTH', [\n 'Invalid Record Length:',\n `expect ${this.state.expectedRecordLength},`,\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.__context(), {\n record: record,\n })\n )\n if(err !== undefined) return err\n }else{\n const err = this.__error(\n // CSV_INVALID_RECORD_LENGTH_DONT_MATCH_COLUMNS\n new CsvError('CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH', [\n 'Invalid Record Length:',\n `columns length is ${columns.length},`, // rename columns\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.__context(), {\n record: record,\n })\n )\n if(err !== undefined) return err\n }\n }\n }\n if(skip_lines_with_empty_values === true){\n if(isRecordEmpty(record)){\n this.__resetRow()\n return\n }\n }\n if(this.state.recordHasError === true){\n this.__resetRow()\n this.state.recordHasError = false\n return\n }\n this.info.records++\n if(from === 1 || this.info.records >= from){\n if(columns !== false){\n const obj = {}\n // Transform record array to an object\n for(let i in record){\n if(columns[i] === undefined || columns[i].disabled) continue\n obj[columns[i].name] = record[i]\n }\n const {objname} = this.options\n if(objname === undefined){\n if(raw === true || info === true){\n this.__push(Object.assign(\n {record: obj},\n (raw === true ? {raw: this.state.rawBuffer.toString()}: {}),\n (info === true ? {info: this.state.info}: {})\n ))\n }else{\n this.__push(obj)\n }\n }else{\n if(raw === true || info === true){\n this.__push(Object.assign(\n {record: [obj[objname], obj]},\n raw === true ? {raw: this.state.rawBuffer.toString()}: {},\n info === true ? {info: this.state.info}: {}\n ))\n }else{\n this.__push([obj[objname], obj])\n }\n }\n }else{\n if(raw === true || info === true){\n this.__push(Object.assign(\n {record: record},\n raw === true ? {raw: this.state.rawBuffer.toString()}: {},\n info === true ? {info: this.state.info}: {}\n ))\n }else{\n this.__push(record)\n }\n }\n }\n this.__resetRow()\n }\n __firstLineToColumns(record){\n const {firstLineToHeaders} = this.state\n try{\n const headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record)\n if(!Array.isArray(headers)){\n return this.__error(\n new CsvError('CSV_INVALID_COLUMN_MAPPING', [\n 'Invalid Column Mapping:',\n 'expect an array from column function,',\n `got ${JSON.stringify(headers)}`\n ], this.__context(), {\n headers: headers,\n })\n )\n }\n const normalizedHeaders = normalizeColumnsArray(headers)\n this.state.expectedRecordLength = normalizedHeaders.length\n this.options.columns = normalizedHeaders\n this.__resetRow()\n return\n }catch(err){\n return err\n }\n }\n __resetRow(){\n if(this.options.raw === true){\n this.state.rawBuffer.reset()\n }\n this.state.record = []\n this.state.record_length = 0\n }\n __onField(){\n const {cast, rtrim, max_record_size} = this.options\n const {enabled, wasQuoting} = this.state\n // Short circuit for the from_line options\n if(enabled === false){ /* this.options.columns !== true && */\n return this.__resetField()\n }\n let field = this.state.field.toString()\n if(rtrim === true && wasQuoting === false){\n field = field.trimRight()\n }\n if(cast === true){\n const [err, f] = this.__cast(field)\n if(err !== undefined) return err\n field = f\n }\n this.state.record.push(field)\n // Increment record length if record size must not exceed a limit\n if(max_record_size !== 0 && typeof field === 'string'){\n this.state.record_length += field.length\n }\n this.__resetField()\n }\n __resetField(){\n this.state.field.reset()\n this.state.wasQuoting = false\n }\n __push(record){\n const {on_record} = this.options\n if(on_record !== undefined){\n const context = this.__context()\n record = on_record.call(null, record, context)\n if(record === undefined || record === null){ return }\n }\n this.push(record)\n }\n // Return a tuple with the error and the casted value\n __cast(field){\n const {columns, relax_column_count} = this.options\n const isColumns = Array.isArray(columns)\n // Dont loose time calling cast\n // because the final record is an object\n // and this field can't be associated to a key present in columns\n if( isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length ){\n return [undefined, undefined]\n }\n const context = this.__context()\n if(this.state.castField !== null){\n try{\n return [undefined, this.state.castField.call(null, field, context)]\n }catch(err){\n return [err]\n }\n }\n if(this.__isFloat(field)){\n return [undefined, parseFloat(field)]\n }else if(this.options.cast_date !== false){\n return [undefined, this.options.cast_date.call(null, field, context)]\n }\n return [undefined, field]\n }\n // Keep it in case we implement the `cast_int` option\n // __isInt(value){\n // // return Number.isInteger(parseInt(value))\n // // return !isNaN( parseInt( obj ) );\n // return /^(\\-|\\+)?[1-9][0-9]*$/.test(value)\n // }\n __isFloat(value){\n return (value - parseFloat( value ) + 1) >= 0 // Borrowed from jquery\n }\n __compareBytes(sourceBuf, targetBuf, pos, firtByte){\n if(sourceBuf[0] !== firtByte) return 0\n const sourceLength = sourceBuf.length\n for(let i = 1; i < sourceLength; i++){\n if(sourceBuf[i] !== targetBuf[pos+i]) return 0\n }\n return sourceLength\n }\n __needMoreData(i, bufLen, end){\n if(end){\n return false\n }\n const {comment, delimiter} = this.options\n const {quoting, recordDelimiterMaxLength} = this.state\n const numOfCharLeft = bufLen - i - 1\n const requiredLength = Math.max(\n // Skip if the remaining buffer smaller than comment\n comment ? comment.length : 0,\n // Skip if the remaining buffer smaller than row delimiter\n recordDelimiterMaxLength,\n // Skip if the remaining buffer can be row delimiter following the closing quote\n // 1 is for quote.length\n quoting ? (1 + recordDelimiterMaxLength) : 0,\n // Skip if the remaining buffer can be delimiter\n delimiter.length,\n // Skip if the remaining buffer can be escape sequence\n // 1 is for escape.length\n 1\n )\n return numOfCharLeft < requiredLength\n }\n __isDelimiter(chr, buf, pos){\n const {delimiter} = this.options\n const delLength = delimiter.length\n if(delimiter[0] !== chr) return 0\n for(let i = 1; i < delLength; i++){\n if(delimiter[i] !== buf[pos+i]) return 0\n }\n return delimiter.length\n }\n __isRecordDelimiter(chr, buf, pos){\n const {record_delimiter} = this.options\n const recordDelimiterLength = record_delimiter.length\n loop1: for(let i = 0; i < recordDelimiterLength; i++){\n const rd = record_delimiter[i]\n const rdLength = rd.length\n if(rd[0] !== chr){\n continue\n }\n for(let j = 1; j < rdLength; j++){\n if(rd[j] !== buf[pos+j]){\n continue loop1\n }\n }\n return rd.length\n }\n return 0\n }\n __autoDiscoverRowDelimiter(buf, pos){\n const chr = buf[pos]\n if(chr === cr){\n if(buf[pos+1] === nl){\n this.options.record_delimiter.push(Buffer.from('\\r\\n'))\n this.state.recordDelimiterMaxLength = 2\n return 2\n }else{\n this.options.record_delimiter.push(Buffer.from('\\r'))\n this.state.recordDelimiterMaxLength = 1\n return 1\n }\n }else if(chr === nl){\n this.options.record_delimiter.push(Buffer.from('\\n'))\n this.state.recordDelimiterMaxLength = 1\n return 1\n }\n return 0\n }\n __error(msg){\n const {skip_lines_with_error} = this.options\n const err = typeof msg === 'string' ? new Error(msg) : msg\n if(skip_lines_with_error){\n this.state.recordHasError = true\n this.emit('skip', err)\n return undefined\n }else{\n return err\n }\n }\n __context(){\n const {columns} = this.options\n const isColumns = Array.isArray(columns)\n return {\n column: isColumns === true ?\n ( columns.length > this.state.record.length ?\n columns[this.state.record.length].name :\n null\n ) :\n this.state.record.length,\n empty_lines: this.info.empty_lines,\n header: columns === true,\n index: this.state.record.length,\n invalid_field_length: this.info.invalid_field_length,\n quoting: this.state.wasQuoting,\n lines: this.info.lines,\n records: this.info.records\n }\n }\n}\n\nconst parse = function(){\n let data, options, callback\n for(let i in arguments){\n const argument = arguments[i]\n const type = typeof argument\n if(data === undefined && (typeof argument === 'string' || Buffer.isBuffer(argument))){\n data = argument\n }else if(options === undefined && isObject(argument)){\n options = argument\n }else if(callback === undefined && type === 'function'){\n callback = argument\n }else{\n throw new CsvError('CSV_INVALID_ARGUMENT', [\n 'Invalid argument:',\n `got ${JSON.stringify(argument)} at index ${i}`\n ])\n }\n }\n const parser = new Parser(options)\n if(callback){\n const records = options === undefined || options.objname === undefined ? [] : {}\n parser.on('readable', function(){\n let record\n while((record = this.read()) !== null){\n if(options === undefined || options.objname === undefined){\n records.push(record)\n }else{\n records[record[0]] = record[1]\n }\n }\n })\n parser.on('error', function(err){\n callback(err, undefined, parser.info)\n })\n parser.on('end', function(){\n callback(undefined, records, parser.info)\n })\n }\n if(data !== undefined){\n parser.write(data)\n parser.end()\n }\n return parser\n}\n\nclass CsvError extends Error {\n constructor(code, message, ...contexts) {\n if(Array.isArray(message)) message = message.join(' ')\n super(message)\n Error.captureStackTrace(this, CsvError)\n this.code = code\n for(const context of contexts){\n for(const key in context){\n const value = context[key]\n this[key] = Buffer.isBuffer(value) ? value.toString() : value == null ? value : JSON.parse(JSON.stringify(value))\n }\n }\n }\n}\n\nparse.Parser = Parser\n\nparse.CsvError = CsvError\n\nmodule.exports = parse\n\nconst underscore = function(str){\n return str.replace(/([A-Z])/g, function(_, match){\n return '_' + match.toLowerCase()\n })\n}\n\nconst isObject = function(obj){\n return (typeof obj === 'object' && obj !== null && !Array.isArray(obj))\n}\n\nconst isRecordEmpty = function(record){\n return record.every( (field) => field == null || field.toString && field.toString().trim() === '' )\n}\n\nconst normalizeColumnsArray = function(columns){\n const normalizedColumns = [];\n\n for(let i=0; i< columns.length; i++){\n const column = columns[i]\n if(column === undefined || column === null || column === false){\n normalizedColumns[i] = { disabled: true }\n }else if(typeof column === 'string'){\n normalizedColumns[i] = { name: column }\n }else if(isObject(column)){\n if(typeof column.name !== 'string'){\n throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', [\n 'Option columns missing name:',\n `property \"name\" is required at position ${i}`,\n 'when column is an object literal'\n ])\n }\n normalizedColumns[i] = column\n }else{\n throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', [\n 'Invalid column definition:',\n 'expect a string or a literal object,',\n `got ${JSON.stringify(column)} at position ${i}`\n ])\n }\n }\n return normalizedColumns;\n}\n","\nconst parse = require('.')\n\nmodule.exports = function(data, options={}){\n if(typeof data === 'string'){\n data = Buffer.from(data)\n }\n const records = options && options.objname ? {} : []\n const parser = new parse.Parser(options)\n parser.push = function(record){\n if(options.objname === undefined)\n records.push(record)\n else{\n records[record[0]] = record[1]\n }\n }\n const err1 = parser.__parse(data, false)\n if(err1 !== undefined) throw err1\n const err2 = parser.__parse(undefined, true)\n if(err2 !== undefined) throw err2\n return records\n}\n","import SplayTree from 'splaytree';\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\nvar isInBbox = function isInBbox(bbox, point) {\n return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;\n};\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\n\nvar getBboxOverlap = function getBboxOverlap(b1, b2) {\n // check if the bboxes overlap at all\n if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) return null; // find the middle two X values\n\n var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;\n var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x; // find the middle two Y values\n\n var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;\n var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y; // put those middle values together to get the overlap\n\n return {\n ll: {\n x: lowerX,\n y: lowerY\n },\n ur: {\n x: upperX,\n y: upperY\n }\n };\n};\n\n/* Javascript doesn't do integer math. Everything is\n * floating point with percision Number.EPSILON.\n *\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON\n */\nvar epsilon = Number.EPSILON; // IE Polyfill\n\nif (epsilon === undefined) epsilon = Math.pow(2, -52);\nvar EPSILON_SQ = epsilon * epsilon;\n/* FLP comparator */\n\nvar cmp = function cmp(a, b) {\n // check if they're both 0\n if (-epsilon < a && a < epsilon) {\n if (-epsilon < b && b < epsilon) {\n return 0;\n }\n } // check if they're flp equal\n\n\n var ab = a - b;\n\n if (ab * ab < EPSILON_SQ * a * b) {\n return 0;\n } // normal comparison\n\n\n return a < b ? -1 : 1;\n};\n\n/**\n * This class rounds incoming values sufficiently so that\n * floating points problems are, for the most part, avoided.\n *\n * Incoming points are have their x & y values tested against\n * all previously seen x & y values. If either is 'too close'\n * to a previously seen value, it's value is 'snapped' to the\n * previously seen value.\n *\n * All points should be rounded by this class before being\n * stored in any data structures in the rest of this algorithm.\n */\n\nvar PtRounder =\n/*#__PURE__*/\nfunction () {\n function PtRounder() {\n _classCallCheck(this, PtRounder);\n\n this.reset();\n }\n\n _createClass(PtRounder, [{\n key: \"reset\",\n value: function reset() {\n this.xRounder = new CoordRounder();\n this.yRounder = new CoordRounder();\n }\n }, {\n key: \"round\",\n value: function round(x, y) {\n return {\n x: this.xRounder.round(x),\n y: this.yRounder.round(y)\n };\n }\n }]);\n\n return PtRounder;\n}();\n\nvar CoordRounder =\n/*#__PURE__*/\nfunction () {\n function CoordRounder() {\n _classCallCheck(this, CoordRounder);\n\n this.tree = new SplayTree(); // preseed with 0 so we don't end up with values < Number.EPSILON\n\n this.round(0);\n } // Note: this can rounds input values backwards or forwards.\n // You might ask, why not restrict this to just rounding\n // forwards? Wouldn't that allow left endpoints to always\n // remain left endpoints during splitting (never change to\n // right). No - it wouldn't, because we snap intersections\n // to endpoints (to establish independence from the segment\n // angle for t-intersections).\n\n\n _createClass(CoordRounder, [{\n key: \"round\",\n value: function round(coord) {\n var node = this.tree.add(coord);\n var prevNode = this.tree.prev(node);\n\n if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {\n this.tree.remove(coord);\n return prevNode.key;\n }\n\n var nextNode = this.tree.next(node);\n\n if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {\n this.tree.remove(coord);\n return nextNode.key;\n }\n\n return coord;\n }\n }]);\n\n return CoordRounder;\n}(); // singleton available by import\n\n\nvar rounder = new PtRounder();\n\n/* Cross Product of two vectors with first point at origin */\n\nvar crossProduct = function crossProduct(a, b) {\n return a.x * b.y - a.y * b.x;\n};\n/* Dot Product of two vectors with first point at origin */\n\nvar dotProduct = function dotProduct(a, b) {\n return a.x * b.x + a.y * b.y;\n};\n/* Comparator for two vectors with same starting point */\n\nvar compareVectorAngles = function compareVectorAngles(basePt, endPt1, endPt2) {\n var v1 = {\n x: endPt1.x - basePt.x,\n y: endPt1.y - basePt.y\n };\n var v2 = {\n x: endPt2.x - basePt.x,\n y: endPt2.y - basePt.y\n };\n var kross = crossProduct(v1, v2);\n return cmp(kross, 0);\n};\nvar length = function length(v) {\n return Math.sqrt(dotProduct(v, v));\n};\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar sineOfAngle = function sineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar cosineOfAngle = function cosineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar horizontalIntersection = function horizontalIntersection(pt, v, y) {\n if (v.y === 0) return null;\n return {\n x: pt.x + v.x / v.y * (y - pt.y),\n y: y\n };\n};\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar verticalIntersection = function verticalIntersection(pt, v, x) {\n if (v.x === 0) return null;\n return {\n x: x,\n y: pt.y + v.y / v.x * (x - pt.x)\n };\n};\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar intersection = function intersection(pt1, v1, pt2, v2) {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x);\n if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x);\n if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y);\n if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y); // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n var kross = crossProduct(v1, v2);\n if (kross == 0) return null;\n var ve = {\n x: pt2.x - pt1.x,\n y: pt2.y - pt1.y\n };\n var d1 = crossProduct(ve, v1) / kross;\n var d2 = crossProduct(ve, v2) / kross; // take the average of the two calculations to minimize rounding error\n\n var x1 = pt1.x + d2 * v1.x,\n x2 = pt2.x + d1 * v2.x;\n var y1 = pt1.y + d2 * v1.y,\n y2 = pt2.y + d1 * v2.y;\n var x = (x1 + x2) / 2;\n var y = (y1 + y2) / 2;\n return {\n x: x,\n y: y\n };\n};\n\nvar SweepEvent =\n/*#__PURE__*/\nfunction () {\n _createClass(SweepEvent, null, [{\n key: \"compare\",\n // for ordering sweep events in the sweep event queue\n value: function compare(a, b) {\n // favor event with a point that the sweep line hits first\n var ptCmp = SweepEvent.comparePoints(a.point, b.point);\n if (ptCmp !== 0) return ptCmp; // the points are the same, so link them if needed\n\n if (a.point !== b.point) a.link(b); // favor right events over left\n\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1; // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n\n return Segment.compare(a.segment, b.segment);\n } // for ordering points in sweep line order\n\n }, {\n key: \"comparePoints\",\n value: function comparePoints(aPt, bPt) {\n if (aPt.x < bPt.x) return -1;\n if (aPt.x > bPt.x) return 1;\n if (aPt.y < bPt.y) return -1;\n if (aPt.y > bPt.y) return 1;\n return 0;\n } // Warning: 'point' input will be modified and re-used (for performance)\n\n }]);\n\n function SweepEvent(point, isLeft) {\n _classCallCheck(this, SweepEvent);\n\n if (point.events === undefined) point.events = [this];else point.events.push(this);\n this.point = point;\n this.isLeft = isLeft; // this.segment, this.otherSE set by factory\n }\n\n _createClass(SweepEvent, [{\n key: \"link\",\n value: function link(other) {\n if (other.point === this.point) {\n throw new Error('Tried to link already linked events');\n }\n\n var otherEvents = other.point.events;\n\n for (var i = 0, iMax = otherEvents.length; i < iMax; i++) {\n var evt = otherEvents[i];\n this.point.events.push(evt);\n evt.point = this.point;\n }\n\n this.checkForConsuming();\n }\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n\n }, {\n key: \"checkForConsuming\",\n value: function checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n // Compare each pair of events to see if other events also match\n var numEvents = this.point.events.length;\n\n for (var i = 0; i < numEvents; i++) {\n var evt1 = this.point.events[i];\n if (evt1.segment.consumedBy !== undefined) continue;\n\n for (var j = i + 1; j < numEvents; j++) {\n var evt2 = this.point.events[j];\n if (evt2.consumedBy !== undefined) continue;\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue;\n evt1.segment.consume(evt2.segment);\n }\n }\n }\n }, {\n key: \"getAvailableLinkedEvents\",\n value: function getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n var events = [];\n\n for (var i = 0, iMax = this.point.events.length; i < iMax; i++) {\n var evt = this.point.events[i];\n\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt);\n }\n }\n\n return events;\n }\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n\n }, {\n key: \"getLeftmostComparator\",\n value: function getLeftmostComparator(baseEvent) {\n var _this = this;\n\n var cache = new Map();\n\n var fillCache = function fillCache(linkedEvent) {\n var nextEvent = linkedEvent.otherSE;\n cache.set(linkedEvent, {\n sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)\n });\n };\n\n return function (a, b) {\n if (!cache.has(a)) fillCache(a);\n if (!cache.has(b)) fillCache(b);\n\n var _cache$get = cache.get(a),\n asine = _cache$get.sine,\n acosine = _cache$get.cosine;\n\n var _cache$get2 = cache.get(b),\n bsine = _cache$get2.sine,\n bcosine = _cache$get2.cosine; // both on or above x-axis\n\n\n if (asine >= 0 && bsine >= 0) {\n if (acosine < bcosine) return 1;\n if (acosine > bcosine) return -1;\n return 0;\n } // both below x-axis\n\n\n if (asine < 0 && bsine < 0) {\n if (acosine < bcosine) return -1;\n if (acosine > bcosine) return 1;\n return 0;\n } // one above x-axis, one below\n\n\n if (bsine < asine) return -1;\n if (bsine > asine) return 1;\n return 0;\n };\n }\n }]);\n\n return SweepEvent;\n}();\n\n// segments and sweep events when all else is identical\n\nvar segmentId = 0;\n\nvar Segment =\n/*#__PURE__*/\nfunction () {\n _createClass(Segment, null, [{\n key: \"compare\",\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n value: function compare(a, b) {\n var alx = a.leftSE.point.x;\n var blx = b.leftSE.point.x;\n var arx = a.rightSE.point.x;\n var brx = b.rightSE.point.x; // check if they're even in the same vertical plane\n\n if (brx < alx) return 1;\n if (arx < blx) return -1;\n var aly = a.leftSE.point.y;\n var bly = b.leftSE.point.y;\n var ary = a.rightSE.point.y;\n var bry = b.rightSE.point.y; // is left endpoint of segment B the right-more?\n\n if (alx < blx) {\n // are the two segments in the same horizontal plane?\n if (bly < aly && bly < ary) return 1;\n if (bly > aly && bly > ary) return -1; // is the B left endpoint colinear to segment A?\n\n var aCmpBLeft = a.comparePoint(b.leftSE.point);\n if (aCmpBLeft < 0) return 1;\n if (aCmpBLeft > 0) return -1; // is the A right endpoint colinear to segment B ?\n\n var bCmpARight = b.comparePoint(a.rightSE.point);\n if (bCmpARight !== 0) return bCmpARight; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return -1;\n } // is left endpoint of segment A the right-more?\n\n\n if (alx > blx) {\n if (aly < bly && aly < bry) return -1;\n if (aly > bly && aly > bry) return 1; // is the A left endpoint colinear to segment B?\n\n var bCmpALeft = b.comparePoint(a.leftSE.point);\n if (bCmpALeft !== 0) return bCmpALeft; // is the B right endpoint colinear to segment A?\n\n var aCmpBRight = a.comparePoint(b.rightSE.point);\n if (aCmpBRight < 0) return 1;\n if (aCmpBRight > 0) return -1; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return 1;\n } // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n // consider the lower left-endpoint to come first\n\n\n if (aly < bly) return -1;\n if (aly > bly) return 1; // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n // is the A right endpoint more left-more?\n\n if (arx < brx) {\n var _bCmpARight = b.comparePoint(a.rightSE.point);\n\n if (_bCmpARight !== 0) return _bCmpARight;\n } // is the B right endpoint more left-more?\n\n\n if (arx > brx) {\n var _aCmpBRight = a.comparePoint(b.rightSE.point);\n\n if (_aCmpBRight < 0) return 1;\n if (_aCmpBRight > 0) return -1;\n }\n\n if (arx !== brx) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n var ay = ary - aly;\n var ax = arx - alx;\n var by = bry - bly;\n var bx = brx - blx;\n if (ay > ax && by < bx) return 1;\n if (ay < ax && by > bx) return -1;\n } // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n\n\n if (arx > brx) return 1;\n if (arx < brx) return -1; // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n // consider the lower right-endpoint to come first\n\n if (ary < bry) return -1;\n if (ary > bry) return 1; // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1; // identical segment, ie a === b\n\n return 0;\n }\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n\n }]);\n\n function Segment(leftSE, rightSE, rings, windings) {\n _classCallCheck(this, Segment);\n\n this.id = ++segmentId;\n this.leftSE = leftSE;\n leftSE.segment = this;\n leftSE.otherSE = rightSE;\n this.rightSE = rightSE;\n rightSE.segment = this;\n rightSE.otherSE = leftSE;\n this.rings = rings;\n this.windings = windings; // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n _createClass(Segment, [{\n key: \"replaceRightSE\",\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n value: function replaceRightSE(newRightSE) {\n this.rightSE = newRightSE;\n this.rightSE.segment = this;\n this.rightSE.otherSE = this.leftSE;\n this.leftSE.otherSE = this.rightSE;\n }\n }, {\n key: \"bbox\",\n value: function bbox() {\n var y1 = this.leftSE.point.y;\n var y2 = this.rightSE.point.y;\n return {\n ll: {\n x: this.leftSE.point.x,\n y: y1 < y2 ? y1 : y2\n },\n ur: {\n x: this.rightSE.point.x,\n y: y1 > y2 ? y1 : y2\n }\n };\n }\n /* A vector from the left point to the right */\n\n }, {\n key: \"vector\",\n value: function vector() {\n return {\n x: this.rightSE.point.x - this.leftSE.point.x,\n y: this.rightSE.point.y - this.leftSE.point.y\n };\n }\n }, {\n key: \"isAnEndpoint\",\n value: function isAnEndpoint(pt) {\n return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;\n }\n /* Compare this segment with a point.\n *\n * A point P is considered to be colinear to a segment if there\n * exists a distance D such that if we travel along the segment\n * from one * endpoint towards the other a distance D, we find\n * ourselves at point P.\n *\n * Return value indicates:\n *\n * 1: point lies above the segment (to the left of vertical)\n * 0: point is colinear to segment\n * -1: point lies below the segment (to the right of vertical)\n */\n\n }, {\n key: \"comparePoint\",\n value: function comparePoint(point) {\n if (this.isAnEndpoint(point)) return 0;\n var lPt = this.leftSE.point;\n var rPt = this.rightSE.point;\n var v = this.vector(); // Exactly vertical segments.\n\n if (lPt.x === rPt.x) {\n if (point.x === lPt.x) return 0;\n return point.x < lPt.x ? 1 : -1;\n } // Nearly vertical segments with an intersection.\n // Check to see where a point on the line with matching Y coordinate is.\n\n\n var yDist = (point.y - lPt.y) / v.y;\n var xFromYDist = lPt.x + yDist * v.x;\n if (point.x === xFromYDist) return 0; // General case.\n // Check to see where a point on the line with matching X coordinate is.\n\n var xDist = (point.x - lPt.x) / v.x;\n var yFromXDist = lPt.y + xDist * v.y;\n if (point.y === yFromXDist) return 0;\n return point.y < yFromXDist ? -1 : 1;\n }\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n\n }, {\n key: \"getIntersection\",\n value: function getIntersection(other) {\n // If bboxes don't overlap, there can't be any intersections\n var tBbox = this.bbox();\n var oBbox = other.bbox();\n var bboxOverlap = getBboxOverlap(tBbox, oBbox);\n if (bboxOverlap === null) return null; // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n var tlp = this.leftSE.point;\n var trp = this.rightSE.point;\n var olp = other.leftSE.point;\n var orp = other.rightSE.point; // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n\n var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;\n var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;\n var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;\n var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0; // do left endpoints match?\n\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp;\n if (!touchesThisRSE && touchesOtherRSE) return orp; // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n\n return null;\n } // does this left endpoint matches (other doesn't)\n\n\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x === orp.x && tlp.y === orp.y) return null;\n } // t-intersection on left endpoint\n\n\n return tlp;\n } // does other left endpoint matches (this doesn't)\n\n\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x === olp.x && trp.y === olp.y) return null;\n } // t-intersection on left endpoint\n\n\n return olp;\n } // trivial intersection on right endpoints\n\n\n if (touchesThisRSE && touchesOtherRSE) return null; // t-intersections on just one right endpoint\n\n if (touchesThisRSE) return trp;\n if (touchesOtherRSE) return orp; // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n\n var pt = intersection(tlp, this.vector(), olp, other.vector()); // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n\n if (pt === null) return null; // is the intersection found between the lines not on the segments?\n\n if (!isInBbox(bboxOverlap, pt)) return null; // round the the computed point if needed\n\n return rounder.round(pt.x, pt.y);\n }\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n\n }, {\n key: \"split\",\n value: function split(point) {\n var newEvents = [];\n var alreadyLinked = point.events !== undefined;\n var newLeftSE = new SweepEvent(point, true);\n var newRightSE = new SweepEvent(point, false);\n var oldRightSE = this.rightSE;\n this.replaceRightSE(newRightSE);\n newEvents.push(newRightSE);\n newEvents.push(newLeftSE);\n var newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice()); // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n\n if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {\n newSeg.swapEvents();\n }\n\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents();\n } // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n\n\n if (alreadyLinked) {\n newLeftSE.checkForConsuming();\n newRightSE.checkForConsuming();\n }\n\n return newEvents;\n }\n /* Swap which event is left and right */\n\n }, {\n key: \"swapEvents\",\n value: function swapEvents() {\n var tmpEvt = this.rightSE;\n this.rightSE = this.leftSE;\n this.leftSE = tmpEvt;\n this.leftSE.isLeft = true;\n this.rightSE.isLeft = false;\n\n for (var i = 0, iMax = this.windings.length; i < iMax; i++) {\n this.windings[i] *= -1;\n }\n }\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n\n }, {\n key: \"consume\",\n value: function consume(other) {\n var consumer = this;\n var consumee = other;\n\n while (consumer.consumedBy) {\n consumer = consumer.consumedBy;\n }\n\n while (consumee.consumedBy) {\n consumee = consumee.consumedBy;\n }\n\n var cmp = Segment.compare(consumer, consumee);\n if (cmp === 0) return; // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n\n if (cmp > 0) {\n var tmp = consumer;\n consumer = consumee;\n consumee = tmp;\n } // make sure a segment doesn't consume it's prev\n\n\n if (consumer.prev === consumee) {\n var _tmp = consumer;\n consumer = consumee;\n consumee = _tmp;\n }\n\n for (var i = 0, iMax = consumee.rings.length; i < iMax; i++) {\n var ring = consumee.rings[i];\n var winding = consumee.windings[i];\n var index = consumer.rings.indexOf(ring);\n\n if (index === -1) {\n consumer.rings.push(ring);\n consumer.windings.push(winding);\n } else consumer.windings[index] += winding;\n }\n\n consumee.rings = null;\n consumee.windings = null;\n consumee.consumedBy = consumer; // mark sweep events consumed as to maintain ordering in sweep event queue\n\n consumee.leftSE.consumedBy = consumer.leftSE;\n consumee.rightSE.consumedBy = consumer.rightSE;\n }\n /* The first segment previous segment chain that is in the result */\n\n }, {\n key: \"prevInResult\",\n value: function prevInResult() {\n if (this._prevInResult !== undefined) return this._prevInResult;\n if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult();\n return this._prevInResult;\n }\n }, {\n key: \"beforeState\",\n value: function beforeState() {\n if (this._beforeState !== undefined) return this._beforeState;\n if (!this.prev) this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: []\n };else {\n var seg = this.prev.consumedBy || this.prev;\n this._beforeState = seg.afterState();\n }\n return this._beforeState;\n }\n }, {\n key: \"afterState\",\n value: function afterState() {\n if (this._afterState !== undefined) return this._afterState;\n var beforeState = this.beforeState();\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: []\n };\n var ringsAfter = this._afterState.rings;\n var windingsAfter = this._afterState.windings;\n var mpsAfter = this._afterState.multiPolys; // calculate ringsAfter, windingsAfter\n\n for (var i = 0, iMax = this.rings.length; i < iMax; i++) {\n var ring = this.rings[i];\n var winding = this.windings[i];\n var index = ringsAfter.indexOf(ring);\n\n if (index === -1) {\n ringsAfter.push(ring);\n windingsAfter.push(winding);\n } else windingsAfter[index] += winding;\n } // calcualte polysAfter\n\n\n var polysAfter = [];\n var polysExclude = [];\n\n for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {\n if (windingsAfter[_i] === 0) continue; // non-zero rule\n\n var _ring = ringsAfter[_i];\n var poly = _ring.poly;\n if (polysExclude.indexOf(poly) !== -1) continue;\n if (_ring.isExterior) polysAfter.push(poly);else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly);\n\n var _index = polysAfter.indexOf(_ring.poly);\n\n if (_index !== -1) polysAfter.splice(_index, 1);\n }\n } // calculate multiPolysAfter\n\n\n for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {\n var mp = polysAfter[_i2].multiPoly;\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp);\n }\n\n return this._afterState;\n }\n /* Is this segment part of the final result? */\n\n }, {\n key: \"isInResult\",\n value: function isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false;\n if (this._isInResult !== undefined) return this._isInResult;\n var mpsBefore = this.beforeState().multiPolys;\n var mpsAfter = this.afterState().multiPolys;\n\n switch (operation.type) {\n case 'union':\n {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n var noBefores = mpsBefore.length === 0;\n var noAfters = mpsAfter.length === 0;\n this._isInResult = noBefores !== noAfters;\n break;\n }\n\n case 'intersection':\n {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n var least;\n var most;\n\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length;\n most = mpsAfter.length;\n } else {\n least = mpsAfter.length;\n most = mpsBefore.length;\n }\n\n this._isInResult = most === operation.numMultiPolys && least < most;\n break;\n }\n\n case 'xor':\n {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n var diff = Math.abs(mpsBefore.length - mpsAfter.length);\n this._isInResult = diff % 2 === 1;\n break;\n }\n\n case 'difference':\n {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n var isJustSubject = function isJustSubject(mps) {\n return mps.length === 1 && mps[0].isSubject;\n };\n\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);\n break;\n }\n\n default:\n throw new Error(\"Unrecognized operation type found \".concat(operation.type));\n }\n\n return this._isInResult;\n }\n }], [{\n key: \"fromRing\",\n value: function fromRing(pt1, pt2, ring) {\n var leftPt, rightPt, winding; // ordering the two points according to sweep line ordering\n\n var cmpPts = SweepEvent.comparePoints(pt1, pt2);\n\n if (cmpPts < 0) {\n leftPt = pt1;\n rightPt = pt2;\n winding = 1;\n } else if (cmpPts > 0) {\n leftPt = pt2;\n rightPt = pt1;\n winding = -1;\n } else throw new Error(\"Tried to create degenerate segment at [\".concat(pt1.x, \", \").concat(pt1.y, \"]\"));\n\n var leftSE = new SweepEvent(leftPt, true);\n var rightSE = new SweepEvent(rightPt, false);\n return new Segment(leftSE, rightSE, [ring], [winding]);\n }\n }]);\n\n return Segment;\n}();\n\nvar RingIn =\n/*#__PURE__*/\nfunction () {\n function RingIn(geomRing, poly, isExterior) {\n _classCallCheck(this, RingIn);\n\n if (!Array.isArray(geomRing) || geomRing.length === 0) {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n this.poly = poly;\n this.isExterior = isExterior;\n this.segments = [];\n\n if (typeof geomRing[0][0] !== 'number' || typeof geomRing[0][1] !== 'number') {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);\n this.bbox = {\n ll: {\n x: firstPoint.x,\n y: firstPoint.y\n },\n ur: {\n x: firstPoint.x,\n y: firstPoint.y\n }\n };\n var prevPoint = firstPoint;\n\n for (var i = 1, iMax = geomRing.length; i < iMax; i++) {\n if (typeof geomRing[i][0] !== 'number' || typeof geomRing[i][1] !== 'number') {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n var point = rounder.round(geomRing[i][0], geomRing[i][1]); // skip repeated points\n\n if (point.x === prevPoint.x && point.y === prevPoint.y) continue;\n this.segments.push(Segment.fromRing(prevPoint, point, this));\n if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x;\n if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y;\n if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x;\n if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y;\n prevPoint = point;\n } // add segment from last to first if last is not the same as first\n\n\n if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {\n this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));\n }\n }\n\n _createClass(RingIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.segments.length; i < iMax; i++) {\n var segment = this.segments[i];\n sweepEvents.push(segment.leftSE);\n sweepEvents.push(segment.rightSE);\n }\n\n return sweepEvents;\n }\n }]);\n\n return RingIn;\n}();\nvar PolyIn =\n/*#__PURE__*/\nfunction () {\n function PolyIn(geomPoly, multiPoly) {\n _classCallCheck(this, PolyIn);\n\n if (!Array.isArray(geomPoly)) {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n this.exteriorRing = new RingIn(geomPoly[0], this, true); // copy by value\n\n this.bbox = {\n ll: {\n x: this.exteriorRing.bbox.ll.x,\n y: this.exteriorRing.bbox.ll.y\n },\n ur: {\n x: this.exteriorRing.bbox.ur.x,\n y: this.exteriorRing.bbox.ur.y\n }\n };\n this.interiorRings = [];\n\n for (var i = 1, iMax = geomPoly.length; i < iMax; i++) {\n var ring = new RingIn(geomPoly[i], this, false);\n if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x;\n if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y;\n if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x;\n if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y;\n this.interiorRings.push(ring);\n }\n\n this.multiPoly = multiPoly;\n }\n\n _createClass(PolyIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = this.exteriorRing.getSweepEvents();\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringSweepEvents = this.interiorRings[i].getSweepEvents();\n\n for (var j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return PolyIn;\n}();\nvar MultiPolyIn =\n/*#__PURE__*/\nfunction () {\n function MultiPolyIn(geom, isSubject) {\n _classCallCheck(this, MultiPolyIn);\n\n if (!Array.isArray(geom)) {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n try {\n // if the input looks like a polygon, convert it to a multipolygon\n if (typeof geom[0][0][0] === 'number') geom = [geom];\n } catch (ex) {// The input is either malformed or has empty arrays.\n // In either case, it will be handled later on.\n }\n\n this.polys = [];\n this.bbox = {\n ll: {\n x: Number.POSITIVE_INFINITY,\n y: Number.POSITIVE_INFINITY\n },\n ur: {\n x: Number.NEGATIVE_INFINITY,\n y: Number.NEGATIVE_INFINITY\n }\n };\n\n for (var i = 0, iMax = geom.length; i < iMax; i++) {\n var poly = new PolyIn(geom[i], this);\n if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x;\n if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y;\n if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x;\n if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y;\n this.polys.push(poly);\n }\n\n this.isSubject = isSubject;\n }\n\n _createClass(MultiPolyIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polySweepEvents = this.polys[i].getSweepEvents();\n\n for (var j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return MultiPolyIn;\n}();\n\nvar RingOut =\n/*#__PURE__*/\nfunction () {\n _createClass(RingOut, null, [{\n key: \"factory\",\n\n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n value: function factory(allSegments) {\n var ringsOut = [];\n\n for (var i = 0, iMax = allSegments.length; i < iMax; i++) {\n var segment = allSegments[i];\n if (!segment.isInResult() || segment.ringOut) continue;\n var prevEvent = null;\n var event = segment.leftSE;\n var nextEvent = segment.rightSE;\n var events = [event];\n var startingPoint = event.point;\n var intersectionLEs = [];\n /* Walk the chain of linked events to form a closed ring */\n\n while (true) {\n prevEvent = event;\n event = nextEvent;\n events.push(event);\n /* Is the ring complete? */\n\n if (event.point === startingPoint) break;\n\n while (true) {\n var availableLEs = event.getAvailableLinkedEvents();\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n\n if (availableLEs.length === 0) {\n var firstPt = events[0].point;\n var lastPt = events[events.length - 1].point;\n throw new Error(\"Unable to complete output ring starting at [\".concat(firstPt.x, \",\") + \" \".concat(firstPt.y, \"]. Last matching segment found ends at\") + \" [\".concat(lastPt.x, \", \").concat(lastPt.y, \"].\"));\n }\n /* Only one way to go, so cotinue on the path */\n\n\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE;\n break;\n }\n /* We must have an intersection. Check for a completed loop */\n\n\n var indexLE = null;\n\n for (var j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j;\n break;\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n\n\n if (indexLE !== null) {\n var intersectionLE = intersectionLEs.splice(indexLE)[0];\n var ringEvents = events.splice(intersectionLE.index);\n ringEvents.unshift(ringEvents[0].otherSE);\n ringsOut.push(new RingOut(ringEvents.reverse()));\n continue;\n }\n /* register the intersection */\n\n\n intersectionLEs.push({\n index: events.length,\n point: event.point\n });\n /* Choose the left-most option to continue the walk */\n\n var comparator = event.getLeftmostComparator(prevEvent);\n nextEvent = availableLEs.sort(comparator)[0].otherSE;\n break;\n }\n }\n\n ringsOut.push(new RingOut(events));\n }\n\n return ringsOut;\n }\n }]);\n\n function RingOut(events) {\n _classCallCheck(this, RingOut);\n\n this.events = events;\n\n for (var i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this;\n }\n\n this.poly = null;\n }\n\n _createClass(RingOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n var prevPt = this.events[0].point;\n var points = [prevPt];\n\n for (var i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n var _pt = this.events[i].point;\n var _nextPt = this.events[i + 1].point;\n if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue;\n points.push(_pt);\n prevPt = _pt;\n } // ring was all (within rounding error of angle calc) colinear points\n\n\n if (points.length === 1) return null; // check if the starting point is necessary\n\n var pt = points[0];\n var nextPt = points[1];\n if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift();\n points.push(points[0]);\n var step = this.isExteriorRing() ? 1 : -1;\n var iStart = this.isExteriorRing() ? 0 : points.length - 1;\n var iEnd = this.isExteriorRing() ? points.length : -1;\n var orderedPoints = [];\n\n for (var _i = iStart; _i != iEnd; _i += step) {\n orderedPoints.push([points[_i].x, points[_i].y]);\n }\n\n return orderedPoints;\n }\n }, {\n key: \"isExteriorRing\",\n value: function isExteriorRing() {\n if (this._isExteriorRing === undefined) {\n var enclosing = this.enclosingRing();\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;\n }\n\n return this._isExteriorRing;\n }\n }, {\n key: \"enclosingRing\",\n value: function enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing();\n }\n\n return this._enclosingRing;\n }\n /* Returns the ring that encloses this one, if any */\n\n }, {\n key: \"_calcEnclosingRing\",\n value: function _calcEnclosingRing() {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n var leftMostEvt = this.events[0];\n\n for (var i = 1, iMax = this.events.length; i < iMax; i++) {\n var evt = this.events[i];\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt;\n }\n\n var prevSeg = leftMostEvt.segment.prevInResult();\n var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null; // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n\n if (!prevPrevSeg) return prevSeg.ringOut; // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut;\n } else return prevSeg.ringOut.enclosingRing();\n } // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n\n\n prevSeg = prevPrevSeg.prevInResult();\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n }\n }\n }]);\n\n return RingOut;\n}();\nvar PolyOut =\n/*#__PURE__*/\nfunction () {\n function PolyOut(exteriorRing) {\n _classCallCheck(this, PolyOut);\n\n this.exteriorRing = exteriorRing;\n exteriorRing.poly = this;\n this.interiorRings = [];\n }\n\n _createClass(PolyOut, [{\n key: \"addInterior\",\n value: function addInterior(ring) {\n this.interiorRings.push(ring);\n ring.poly = this;\n }\n }, {\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [this.exteriorRing.getGeom()]; // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (geom[0] === null) return null;\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringGeom = this.interiorRings[i].getGeom(); // interior ring was all (within rounding error of angle calc) colinear points\n\n if (ringGeom === null) continue;\n geom.push(ringGeom);\n }\n\n return geom;\n }\n }]);\n\n return PolyOut;\n}();\nvar MultiPolyOut =\n/*#__PURE__*/\nfunction () {\n function MultiPolyOut(rings) {\n _classCallCheck(this, MultiPolyOut);\n\n this.rings = rings;\n this.polys = this._composePolys(rings);\n }\n\n _createClass(MultiPolyOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polyGeom = this.polys[i].getGeom(); // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (polyGeom === null) continue;\n geom.push(polyGeom);\n }\n\n return geom;\n }\n }, {\n key: \"_composePolys\",\n value: function _composePolys(rings) {\n var polys = [];\n\n for (var i = 0, iMax = rings.length; i < iMax; i++) {\n var ring = rings[i];\n if (ring.poly) continue;\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else {\n var enclosingRing = ring.enclosingRing();\n if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing));\n enclosingRing.poly.addInterior(ring);\n }\n }\n\n return polys;\n }\n }]);\n\n return MultiPolyOut;\n}();\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nvar SweepLine =\n/*#__PURE__*/\nfunction () {\n function SweepLine(queue) {\n var comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare;\n\n _classCallCheck(this, SweepLine);\n\n this.queue = queue;\n this.tree = new SplayTree(comparator);\n this.segments = [];\n }\n\n _createClass(SweepLine, [{\n key: \"process\",\n value: function process(event) {\n var segment = event.segment;\n var newEvents = []; // if we've already been consumed by another segment,\n // clean up our body parts and get out\n\n if (event.consumedBy) {\n if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment);\n return newEvents;\n }\n\n var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);\n if (!node) throw new Error(\"Unable to find segment #\".concat(segment.id, \" \") + \"[\".concat(segment.leftSE.point.x, \", \").concat(segment.leftSE.point.y, \"] -> \") + \"[\".concat(segment.rightSE.point.x, \", \").concat(segment.rightSE.point.y, \"] \") + 'in SweepLine tree. Please submit a bug report.');\n var prevNode = node;\n var nextNode = node;\n var prevSeg = undefined;\n var nextSeg = undefined; // skip consumed segments still in tree\n\n while (prevSeg === undefined) {\n prevNode = this.tree.prev(prevNode);\n if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key;\n } // skip consumed segments still in tree\n\n\n while (nextSeg === undefined) {\n nextNode = this.tree.next(nextNode);\n if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key;\n }\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n var prevMySplitter = null;\n\n if (prevSeg) {\n var prevInter = prevSeg.getIntersection(segment);\n\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter;\n\n if (!prevSeg.isAnEndpoint(prevInter)) {\n var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);\n\n for (var i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n }\n } // Check for intersections against the next segment in the sweep line\n\n\n var nextMySplitter = null;\n\n if (nextSeg) {\n var nextInter = nextSeg.getIntersection(segment);\n\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter;\n\n if (!nextSeg.isAnEndpoint(nextInter)) {\n var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);\n\n for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {\n newEvents.push(_newEventsFromSplit[_i]);\n }\n }\n }\n } // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n\n\n if (prevMySplitter !== null || nextMySplitter !== null) {\n var mySplitter = null;\n if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else {\n var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);\n mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;\n } // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n\n this.queue.remove(segment.rightSE);\n newEvents.push(segment.rightSE);\n\n var _newEventsFromSplit2 = segment.split(mySplitter);\n\n for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {\n newEvents.push(_newEventsFromSplit2[_i2]);\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.remove(segment);\n newEvents.push(event);\n } else {\n // done with left event\n this.segments.push(segment);\n segment.prev = prevSeg;\n }\n } else {\n // event.isRight\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n var inter = prevSeg.getIntersection(nextSeg);\n\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);\n\n for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {\n newEvents.push(_newEventsFromSplit3[_i3]);\n }\n }\n\n if (!nextSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);\n\n for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {\n newEvents.push(_newEventsFromSplit4[_i4]);\n }\n }\n }\n }\n\n this.tree.remove(segment);\n }\n\n return newEvents;\n }\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n\n }, {\n key: \"_splitSafely\",\n value: function _splitSafely(seg, pt) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.remove(seg);\n var rightSE = seg.rightSE;\n this.queue.remove(rightSE);\n var newEvents = seg.split(pt);\n newEvents.push(rightSE); // splitting can trigger consumption\n\n if (seg.consumedBy === undefined) this.tree.insert(seg);\n return newEvents;\n }\n }]);\n\n return SweepLine;\n}();\n\nvar Operation =\n/*#__PURE__*/\nfunction () {\n function Operation() {\n _classCallCheck(this, Operation);\n }\n\n _createClass(Operation, [{\n key: \"run\",\n value: function run(type, geom, moreGeoms) {\n operation.type = type;\n rounder.reset();\n /* Convert inputs to MultiPoly objects */\n\n var multipolys = [new MultiPolyIn(geom, true)];\n\n for (var i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n multipolys.push(new MultiPolyIn(moreGeoms[i], false));\n }\n\n operation.numMultiPolys = multipolys.length;\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n\n if (operation.type === 'difference') {\n // in place removal\n var subject = multipolys[0];\n var _i = 1;\n\n while (_i < multipolys.length) {\n if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null) _i++;else multipolys.splice(_i, 1);\n }\n }\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n\n\n if (operation.type === 'intersection') {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) {\n var mpA = multipolys[_i2];\n\n for (var j = _i2 + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return [];\n }\n }\n }\n /* Put segment endpoints in a priority queue */\n\n\n var queue = new SplayTree(SweepEvent.compare);\n\n for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) {\n var sweepEvents = multipolys[_i3].getSweepEvents();\n\n for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {\n queue.insert(sweepEvents[_j]);\n }\n }\n /* Pass the sweep line over those endpoints */\n\n\n var sweepLine = new SweepLine(queue);\n var prevQueueSize = queue.size;\n var node = queue.pop();\n\n while (node) {\n var evt = node.key;\n\n if (queue.size === prevQueueSize) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n var seg = evt.segment;\n throw new Error(\"Unable to pop() \".concat(evt.isLeft ? 'left' : 'right', \" SweepEvent \") + \"[\".concat(evt.point.x, \", \").concat(evt.point.y, \"] from segment #\").concat(seg.id, \" \") + \"[\".concat(seg.leftSE.point.x, \", \").concat(seg.leftSE.point.y, \"] -> \") + \"[\".concat(seg.rightSE.point.x, \", \").concat(seg.rightSE.point.y, \"] from queue. \") + 'Please file a bug report.');\n }\n\n var newEvents = sweepLine.process(evt);\n\n for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) {\n var _evt = newEvents[_i4];\n if (_evt.consumedBy === undefined) queue.insert(_evt);\n }\n\n prevQueueSize = queue.size;\n node = queue.pop();\n } // free some memory we don't need anymore\n\n\n rounder.reset();\n /* Collect and compile segments we're keeping into a multipolygon */\n\n var ringsOut = RingOut.factory(sweepLine.segments);\n var result = new MultiPolyOut(ringsOut);\n return result.getGeom();\n }\n }]);\n\n return Operation;\n}(); // singleton available by import\n\nvar operation = new Operation();\n\nvar union = function union(geom) {\n for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n moreGeoms[_key - 1] = arguments[_key];\n }\n\n return operation.run('union', geom, moreGeoms);\n};\n\nvar intersection$1 = function intersection(geom) {\n for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n moreGeoms[_key2 - 1] = arguments[_key2];\n }\n\n return operation.run('intersection', geom, moreGeoms);\n};\n\nvar xor = function xor(geom) {\n for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n moreGeoms[_key3 - 1] = arguments[_key3];\n }\n\n return operation.run('xor', geom, moreGeoms);\n};\n\nvar difference = function difference(subjectGeom) {\n for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n clippingGeoms[_key4 - 1] = arguments[_key4];\n }\n\n return operation.run('difference', subjectGeom, clippingGeoms);\n};\n\nvar index = {\n union: union,\n intersection: intersection$1,\n xor: xor,\n difference: difference\n};\n\nexport default index;\n","//\n// THE NODE PACKAGE API\n//\n\nimport { doPreprocessData } from './preprocess'\nimport { doAnalyzePlan, doAnalyzeDistricts } from './analyze'\nimport {\n doConfigureScales, doAnalyzePostProcessing\n} from './results'\nimport {\n PlanAnalytics, DistrictStatistics,\n preparePlanAnalytics, prepareDistrictStatistics\n} from './results'\n\nimport * as D from './_data';\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nexport class AnalyticsSession {\n title: string;\n legislativeDistricts: boolean;\n config: T.Dict = {};\n\n bOneTimeProcessingDone = false;\n bPlanAnalyzed = false;\n bPostProcessingDone = false;\n testScales = {} as T.TestScales;\n tests = {} as T.TestEntries;\n\n state: D.State;\n counties: D.Counties;\n graph: D.Graph;\n features: D.Features;\n plan: D.Plan;\n districts: D.Districts;\n\n constructor(SessionRequest: T.SessionRequest) {\n this.title = SessionRequest['title'];\n this.legislativeDistricts = SessionRequest['legislativeDistricts'];\n this.config = this.processConfig(SessionRequest['config'])\n\n this.state = new D.State(this, SessionRequest['stateXX'], SessionRequest['nDistricts']);\n this.counties = new D.Counties(this, SessionRequest['counties']);\n this.graph = new D.Graph(this, SessionRequest['graph']);\n this.features = new D.Features(this, SessionRequest['data'], this.config['datasets']);\n this.plan = new D.Plan(this, SessionRequest['plan']);\n this.districts = new D.Districts(this, SessionRequest['districtShapes']);\n\n // NOTE: I've pulled these out of the individual analytics to here. Eventually,\n // we could want them to passed into an analytics session as data, along with\n // everything else. For now, this keeps branching out of the main code.\n doConfigureScales(this);\n }\n processConfig(config: T.Dict): T.Dict {\n // NOTE - Session settings are required:\n // - Analytics suites can be defaulted to all with [], but\n // - Dataset keys must be explicitly specified with 'dataset'\n\n // TODO - DASHBOARD: Remove this mechanism. Always run everything.\n let defaultSuites = [T.Suite.Legal, T.Suite.Fair, T.Suite.Best];\n\n // If the config passed in has no suites = [], use the default suites\n if (U.isArrayEmpty(config['suites'])) {\n config['suites'] = defaultSuites;\n }\n\n // Default the Census & redistricting cycle to 2010\n if (!(U.keyExists('cycle', config))) config['cycle'] = 2010;\n\n return config;\n }\n\n // Using the the data in the analytics session, calculate all the\n // analytics & validations, saving/updating the individual test results.\n analyzePlan(bLog: boolean = false): boolean {\n try {\n doPreprocessData(this, bLog);\n doAnalyzeDistricts(this, bLog);\n doAnalyzePlan(this, bLog);\n doAnalyzePostProcessing(this, bLog);\n }\n catch {\n console.log(\"Exception caught by analyzePlan()\");\n return false;\n }\n\n return true;\n }\n\n // NOTE - This assumes that analyzePlan() has been run!\n getPlanAnalytics(bLog: boolean = false): PlanAnalytics {\n return preparePlanAnalytics(this, bLog);\n }\n // NOTE - This assumes that analyzePlan() has been run!\n getDistrictStatistics(bLog: boolean = false): DistrictStatistics {\n return prepareDistrictStatistics(this, bLog);\n }\n // NOTE - This assumes that analyzePlan() has been run!\n getDiscontiguousDistrictFeatures(bLog: boolean = false): T.GeoFeatureCollection {\n // Get the (possibly empty) list of discontiguous district IDs\n let contiguousTest = this.getTest(T.Test.Contiguous) as T.TestEntry;\n let discontiguousDistrictIDs: number[] = contiguousTest['details']['discontiguousDistricts'] || [];\n\n // Convert them into a (possibly empty) list of features\n let discontiguousDistrictFeatures: T.GeoFeatureCollection = { type: 'FeatureCollection', features: [] };\n if (!(U.isArrayEmpty(discontiguousDistrictIDs))) {\n for (let id of discontiguousDistrictIDs) {\n let poly = this.districts.getDistrictShapeByID(id);\n\n if (poly) discontiguousDistrictFeatures.features.push(poly);\n }\n }\n\n return discontiguousDistrictFeatures;\n }\n\n\n // HELPERS USED INTERNALLY\n\n // Get an individual test, so you can drive UI with the results.\n getTest(testID: T.Test): T.TestEntry {\n // Get the existing test entries\n // T.Test is a numeric enum, so convert the string keys to numbers\n let testValues = U.getNumericObjectKeys(this.tests);\n\n // If there's no entry for this test, create & initialize one\n if (!(testValues.includes(testID))) {\n this.tests[testID] = {} as T.TestEntry;\n this.tests[testID]['score'] = undefined;\n this.tests[testID]['details'] = {};\n }\n\n // Return a pointer to the the test entry for this test\n return this.tests[testID];\n }\n\n // NOTE - Not sure why this has to be up here.\n populationDeviationThreshold(): number {\n return 1 - this.testScales[T.Test.PopulationDeviation]['scale'][0];\n }\n}\n\n","//\n// DATA ABSTRACTION LAYER\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\nimport { isConnected, isEmbedded } from './valid';\nimport { extractDistrictProperties } from './compact';\nimport { fptpWin } from './political'\n\n\n// DISTRICT STATISTICS\n\n// Indexes for statistics fields in Districts\n// NOTE - Not a const, so the number can be determined dynamically\nexport enum DistrictField {\n TotalPop, // Display\n PopDevPct, // Display\n bEqualPop, // Display\n bNotEmpty, // Display\n bContiguous, // Display\n bNotEmbedded, // Display\n CountySplits,\n DemVotes,\n RepVotes,\n TwoPartyVote, // Two-party total ()= Dem + Rep) not all votes!\n DemPct, // Display (also the \"VPI,\" by convention\")\n RepPct, // Display\n DemSeat,\n TotalVAP, // VAP or CVAP ...\n MinorityPop, // Derived\n WhitePop,\n BlackPop,\n HispanicPop,\n PacificPop,\n AsianPop,\n NativePop,\n WhitePct, // Display\n MinorityPct, // Display\n BlackPct, // Display\n HispanicPct, // Display\n PacificPct, // Display\n AsianPct, // Display\n NativePct // Display\n\n // 1 - MORE ...\n}\n\nexport class Districts {\n _session: AnalyticsSession;\n\n _shapes: T.GeoFeatureCollection;\n _geoProperties = {} as T.DistrictProperties;\n\n statistics: any[][];\n\n constructor(s: AnalyticsSession, ds: T.GeoFeatureCollection) {\n this._session = s;\n\n this._shapes = ds;\n this.statistics = this.initStatistics();\n }\n getDistrictShapeByID(id: number): T.GeoFeature | undefined {\n // NOTE - Find the district shape by ID (not index)\n // return this._shapes.features[id]; \n for (let f of this._shapes.features) {\n if (f.properties && (f.properties.id == id)) {\n return f;\n }\n }\n return undefined;\n }\n getGeoProperties(i: number): any {\n // Make sure the district shape exists & has geo properties\n if (i in this._geoProperties) return this._geoProperties[i];\n else return null;\n }\n setGeoProperties(i: number, p: T.DistrictShapeProperties): void { this._geoProperties[i] = p; }\n\n numberOfColumns(): number { return U.countEnumValues(DistrictField); }\n // +1 for dummy unassigned 0 \"district\" and +1 for N+1 summary \"district\" for\n // state-level values. Real districts are 1–N.\n numberOfRows(): number { return this._session.state.nDistricts + 2; }\n numberOfWorkingDistricts(): number { return this._session.state.nDistricts + 1; }\n\n // This is the core statistics 2D matrix:\n // Fields on the outside, districts on the inside\n initStatistics(): any[][] {\n let nRows = this.numberOfRows();\n let nCols = this.numberOfColumns();\n\n let outer = U.initArray(nCols, undefined);\n\n for (let i = 0; i < nCols; i++) {\n outer[i] = U.initArray(nRows, null);\n }\n\n return outer;\n }\n\n // This is the workhorse computational routine!\n //\n // TODO - OPTIMIZE for getting multiple properties from the same feature?\n // TODO - OPTIMIZE by only re-calc'ing districts that have changed?\n // In this case, special attention to getting county-splits right.\n // TODO - OPTIMIZE by async'ing this?\n // TODO - Is there a way to do this programmatically off data? Does it matter?\n recalcStatistics(bLog: boolean = false): void {\n // Compute these once per recalc cycle\n let targetSize = this._session.state.totalPop / this._session.state.nDistricts;\n let deviationThreshold = this._session.populationDeviationThreshold();\n let planByDistrict = this._session.plan.byDistrictID();\n let plan = this._session.plan;\n let graph = this._session.graph;\n\n // NOTE - SPLITTING\n // Add an extra 0th virtual county bucket for county-district splitting analysis \n let nCountyBuckets = this._session.counties.nCounties + 1;\n\n // INITIALIZE STATE VALUES THAT WILL BE ACCUMULATED\n\n let stateTPVote = 0;\n let stateDemVote = 0;\n let stateRepVote = 0;\n\n let stateVAPPop = 0;\n let stateWhitePop = 0;\n let stateMinorityPop = 0;\n let stateBlackPop = 0;\n let stateHispanicPop = 0;\n let statePacificPop = 0;\n let stateAsianPop = 0;\n let stateNativePop = 0;\n\n // NOTE - These plan-level booleans are set in their respective analytics:\n // - Equal population (bEqualPop)\n // - Complete (bNotEmpty)\n // - Contiguous (bContiguous)\n // - Free of holes (bNotEmbedded)\n\n // 2 - MORE ...\n\n // Loop over the districts (including the dummy unassigned one)\n for (let i = 0; i < this.numberOfWorkingDistricts(); i++) {\n\n // INITIALIZE DISTRICT VALUES THAT WILL BE ACCUMULATED (VS. DERIVED)\n\n let featurePop: number;\n let totalPop: number = 0;\n\n // NOTE - SPLITTING\n let countySplits: number[] = U.initArray(nCountyBuckets, 0);\n\n let demVotes: number = 0;\n let repVotes: number = 0;\n\n let totalVAP: number = 0;\n let whitePop: number = 0;\n let blackPop: number = 0;\n let hispanicPop: number = 0;\n let pacificPop: number = 0;\n let asianPop: number = 0;\n let nativePop: number = 0;\n\n // NOTE - Only report explicitly found validity issues\n let bNotEmpty = false;\n let bContiguous = true;\n let bNotEmbedded = true;\n let bEqualPop = true;\n\n // 3 - MORE ...\n\n // HACK - Because \"this\" gets ghosted inside the forEach loop below\n let outerThis = this;\n\n // Get the geoIDs assigned to the district\n // Guard against empty districts\n let geoIDs = this._session.plan.geoIDsForDistrictID(i);\n if (geoIDs && (geoIDs.size > 0)) {\n bNotEmpty = true;\n\n // ... loop over the geoIDs creating district-by-district statistics \n geoIDs.forEach(function (geoID: string): void {\n // Skip water-only features\n if (!(U.isWaterOnly(geoID))) {\n // Map from geoID to feature index\n let featureID = outerThis._session.features.featureID(geoID);\n let f: T.GeoFeature = outerThis._session.features.featureByIndex(featureID);\n\n if (f == undefined) {\n console.log(\"Skipping undefined feature in district statistics: GEOID =\", geoID, \"Feature ID =\", featureID);\n }\n else {\n // ACCUMULATE VALUES\n\n // Total population of each feature\n // NOTE - This result is used more than once\n featurePop = outerThis._session.features.fieldForFeature(f, Dataset.CENSUS, FeatureField.TotalPop);\n\n // Total district population\n totalPop += featurePop;\n\n // NOTE - SPLITTING\n // Total population by counties w/in a district,\n // except the dummy unassigned district 0\n if (i > 0) countySplits[outerThis.getCountyIndex(geoID)] += featurePop;\n\n // Democratic and Republican vote totals\n demVotes += outerThis._session.features.fieldForFeature(f, Dataset.ELECTION, FeatureField.DemVotes);\n repVotes += outerThis._session.features.fieldForFeature(f, Dataset.ELECTION, FeatureField.RepVotes);\n\n // Voting-age demographic breakdowns (or citizen voting-age)\n totalVAP += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.TotalPop);\n whitePop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.WhitePop);\n blackPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.BlackPop);\n hispanicPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.HispanicPop);\n pacificPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.PacificPop);\n asianPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.AsianPop);\n nativePop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.NativePop);\n\n // 4 - MORE ...\n }\n }\n else console.log(\"Skipping water-only feature in district statistics:\", geoID);\n });\n\n // COMPUTE DERIVED VALUES\n\n // Population deviation % and equal population (boolean) by district.\n // Don't set the values for the dummy unassigned district.\n let popDevPct = null;\n if (i > 0) {\n popDevPct = (totalPop - targetSize) / targetSize;\n bEqualPop = (popDevPct <= deviationThreshold);\n }\n\n // Total two-party (not total total!) votes, Democratic and Republican vote\n // shares, and Democratic first-past-the-post win (= 1) or loss (= 0).\n let totVotes: number;\n let demPct: number = 0;\n let repPct: number = 0;\n let DemSeat: number = 0;\n\n totVotes = demVotes + repVotes;\n if (totVotes > 0) {\n demPct = demVotes / totVotes;\n repPct = repVotes / totVotes;\n DemSeat = fptpWin(demPct);\n }\n\n // Total minority VAP\n let minorityPop = totalVAP - whitePop;\n\n // Voting-age demographic proportions (or citizen voting-age)\n let whitePct: number = 0;\n let minorityPct: number = 0;\n let blackPct: number = 0;\n let hispanicPct: number = 0;\n let pacificPct: number = 0;\n let asianPct: number = 0;\n let nativePct: number = 0;\n\n if (totalVAP > 0) {\n whitePct = whitePop / totalVAP;\n minorityPct = minorityPop / totalVAP;\n blackPct = blackPop / totalVAP;\n hispanicPct = hispanicPop / totalVAP;\n pacificPct = pacificPop / totalVAP;\n asianPct = asianPop / totalVAP;\n nativePct = nativePop / totalVAP;\n }\n\n // 5 - MORE ...\n\n // COMPUTE DISTRICT-LEVEL VALUES\n\n // Validations\n\n // Leave the default values for the dummy unassigned district,\n // and districts that are empty.\n if ((i > 0) && bNotEmpty) {\n bContiguous = isConnected(geoIDs, graph);\n bNotEmbedded = (!isEmbedded(i, planByDistrict[i], plan, graph));\n }\n\n // 6 - MORE ...\n\n { // UPDATE THE DISTRICT STATISTICS\n\n // NOTE - These are set below for both non-empty & empty districts:\n // this.statistics[DistrictField.bNotEmpty][i] = bNotEmpty;\n // this.statistics[DistrictField.bContiguous][i] = bContiguous;\n // this.statistics[DistrictField.bNotEmbedded][i] = bNotEmbedded;\n // this.statistics[DistrictField.TotalPop][i] = totalPop;\n // this.statistics[DistrictField.bEqualPop][i] = bEqualPop;\n this.statistics[DistrictField.PopDevPct][i] = popDevPct;\n\n this.statistics[DistrictField.DemVotes][i] = demVotes;\n this.statistics[DistrictField.RepVotes][i] = repVotes;\n this.statistics[DistrictField.TwoPartyVote][i] = totVotes;\n this.statistics[DistrictField.DemPct][i] = demPct;\n this.statistics[DistrictField.RepPct][i] = repPct;\n this.statistics[DistrictField.DemSeat][i] = DemSeat;\n\n this.statistics[DistrictField.WhitePop][i] = whitePop;\n this.statistics[DistrictField.MinorityPop][i] = minorityPop;\n this.statistics[DistrictField.BlackPop][i] = blackPop;\n this.statistics[DistrictField.HispanicPop][i] = hispanicPop;\n this.statistics[DistrictField.PacificPop][i] = pacificPop;\n this.statistics[DistrictField.AsianPop][i] = asianPop;\n this.statistics[DistrictField.NativePop][i] = nativePop;\n\n this.statistics[DistrictField.TotalVAP][i] = totalVAP;\n this.statistics[DistrictField.WhitePct][i] = whitePct;\n this.statistics[DistrictField.MinorityPct][i] = minorityPct;\n this.statistics[DistrictField.BlackPct][i] = blackPct;\n this.statistics[DistrictField.HispanicPct][i] = hispanicPct;\n this.statistics[DistrictField.PacificPct][i] = pacificPct;\n this.statistics[DistrictField.AsianPct][i] = asianPct;\n this.statistics[DistrictField.NativePct][i] = nativePct;\n }\n\n // 7 - MORE ...\n\n { // ACCUMULATE STATE STATISTICS FROM DISTRICT TOTALS\n stateTPVote += totVotes;\n stateDemVote += demVotes;\n stateRepVote += repVotes;\n\n stateVAPPop += totalVAP;\n stateWhitePop += whitePop;\n stateMinorityPop += minorityPop\n stateBlackPop += blackPop;\n stateHispanicPop += hispanicPop;\n statePacificPop += pacificPop;\n stateAsianPop += asianPop;\n stateNativePop += nativePop;\n }\n }\n else { // If a district is empty, zero these results (vs. null)\n this.statistics[DistrictField.PopDevPct][i] = 0.0;\n\n this.statistics[DistrictField.DemVotes][i] = 0;\n this.statistics[DistrictField.RepVotes][i] = 0;\n this.statistics[DistrictField.TwoPartyVote][i] = 0;\n this.statistics[DistrictField.DemPct][i] = 0;\n this.statistics[DistrictField.RepPct][i] = 0;\n this.statistics[DistrictField.DemSeat][i] = 0;\n\n this.statistics[DistrictField.WhitePop][i] = 0;\n this.statistics[DistrictField.MinorityPop][i] = 0;\n this.statistics[DistrictField.BlackPop][i] = 0;\n this.statistics[DistrictField.HispanicPop][i] = 0;\n this.statistics[DistrictField.PacificPop][i] = 0;\n this.statistics[DistrictField.AsianPop][i] = 0;\n this.statistics[DistrictField.NativePop][i] = 0;\n\n this.statistics[DistrictField.TotalVAP][i] = 0;\n this.statistics[DistrictField.WhitePct][i] = 0;\n this.statistics[DistrictField.MinorityPct][i] = 0;\n this.statistics[DistrictField.BlackPct][i] = 0;\n this.statistics[DistrictField.HispanicPct][i] = 0;\n this.statistics[DistrictField.PacificPct][i] = 0;\n this.statistics[DistrictField.AsianPct][i] = 0;\n this.statistics[DistrictField.NativePct][i] = 0;\n }\n\n { // UPDATE THESE DISTRICT STATISTICS, EVEN WHEN THEY ARE EMPTY\n this.statistics[DistrictField.TotalPop][i] = totalPop;\n\n this.statistics[DistrictField.bNotEmpty][i] = bNotEmpty;\n this.statistics[DistrictField.bContiguous][i] = bContiguous;\n this.statistics[DistrictField.bNotEmbedded][i] = bNotEmbedded;\n this.statistics[DistrictField.bEqualPop][i] = bEqualPop;\n\n this.statistics[DistrictField.CountySplits][i] = countySplits;\n }\n }\n\n // UPDATE STATE STATISTICS\n let summaryRow = this.numberOfRows() - 1;\n\n if (stateTPVote > 0) {\n this.statistics[DistrictField.DemPct][summaryRow] = stateDemVote / stateTPVote;\n this.statistics[DistrictField.RepPct][summaryRow] = stateRepVote / stateTPVote;\n }\n\n if (stateVAPPop > 0) {\n this.statistics[DistrictField.WhitePct][summaryRow] = stateWhitePop / stateVAPPop;\n this.statistics[DistrictField.MinorityPct][summaryRow] = stateMinorityPop / stateVAPPop;\n this.statistics[DistrictField.BlackPct][summaryRow] = stateBlackPop / stateVAPPop;\n this.statistics[DistrictField.HispanicPct][summaryRow] = stateHispanicPop / stateVAPPop;\n this.statistics[DistrictField.PacificPct][summaryRow] = statePacificPop / stateVAPPop;\n this.statistics[DistrictField.AsianPct][summaryRow] = stateAsianPop / stateVAPPop;\n this.statistics[DistrictField.NativePct][summaryRow] = stateNativePop / stateVAPPop;\n }\n }\n // NOTE - I did not roll these into district statistics, because creating the\n // district shapes themselves is the big district-by-district activity, these\n // calc's already work, and I'm not going to expose these values. Wrapping\n // the underlying function and exposing it here to illustrate the parallelism\n // with recalcStatistics(). These are called in tandem by doAnalyzeDistricts().\n extractDistrictShapeProperties(bLog: boolean = false): void {\n extractDistrictProperties(this._session, bLog)\n }\n getCountyIndex(geoID: string): number {\n let countyGeoID = U.parseGeoID(geoID)['county'] as string;\n let countyFIPS = U.getFIPSFromCountyGeoID(countyGeoID);\n let countyIndex = this._session.counties.indexFromFIPS(countyFIPS);\n\n return countyIndex;\n }\n}\n\n\n// CLASSES, ETC. FOR FEATURE & COUNTY DATA\n\n// Types of datasets by feature\nexport const enum Dataset {\n SHAPES = \"SHAPES\",\n CENSUS = \"CENSUS\",\n VAP = \"VAP\",\n ELECTION = \"ELECTION\"\n}\n\nexport type DatasetKeys = {\n SHAPES: string; // A shapefile\n CENSUS: string; // A total population Census dataset\n VAP: string; // A voting age (or citizen voting age) dataset\n ELECTION: string; // An election dataset\n}\n\n// Identifiers of fields for each feature in the datasets\nexport const enum FeatureField {\n TotalPop = \"Tot\",\n WhitePop = \"Wh\",\n BlackPop = \"BlC\",\n HispanicPop = \"His\",\n AsianPop = \"AsnC\",\n PacificPop = \"PacC\",\n NativePop = \"NatC\",\n DemVotes = \"D\",\n RepVotes = \"R\",\n TotalVotes = \"Tot\"\n}\n\n// Wrap data by feature, to abstract the specifics of the internal structure\nexport class Features {\n _session: AnalyticsSession;\n\n _data: T.GeoFeatureCollection;\n _keys: DatasetKeys;\n\n _featureIDs = {} as T.FeaturesByGeoID;\n\n constructor(s: AnalyticsSession, data: T.GeoFeatureCollection, keys: DatasetKeys) {\n this._session = s;\n\n this._data = data;\n this._keys = keys;\n }\n nFeatures(): number { return this._data.features.length; }\n featureByIndex(i: number): T.GeoFeature { return this._data.features[i]; }\n geoIDForFeature(f: any): string {\n // GEOIDs will be one of these properties\n let value = f.properties['GEOID10'] || f.properties['GEOID20'] || f.properties['GEOID'];\n return value;\n }\n fieldForFeature(f: any, dt: Dataset, fk: string): any {\n let dk: string = this._keys[dt];\n\n return _getFeatures(f, dk, fk);\n }\n resetDataset(d: Dataset, k: string): void {\n this._keys[d] = k;\n // TODO - RECALC: Does anything need to be recalc'd now when a dataset is changed?\n }\n mapGeoIDsToFeatureIDs(): void {\n for (let i: number = 0; i < this._session.features.nFeatures(); i++) {\n let f: T.GeoFeature = this._session.features.featureByIndex(i);\n let geoID: string = this._session.features.geoIDForFeature(f);\n\n this._featureIDs[geoID] = i;\n }\n }\n featureID(i: string): number { return this._featureIDs[i]; }\n}\n\n// NOTE - This accessor is cloned from fGetW() in dra-client/restrict.ts\n// f is a direct GeoJSON feature\n// p is a geoID\nfunction _getFeatures(f: any, datasetKey: string, p: string): any {\n // Echo parameters for debugging\n // console.log(\"f =\", f, \"k = \", datasetKey, \"p =\", p);\n\n // Shim to load sample data2.json from disk for command-line scaffolding\n if (f.properties && f.properties['datasets']) {\n return f.properties['datasets'][datasetKey][p];\n }\n\n // NOTE - The fGetW() code from dra-client below here ...\n\n // Direct property?\n if (f.properties && f.properties[p] !== undefined)\n return f.properties[p];\n\n // Joined property?\n let a: any[] = _fGetJoined(f);\n if (a) {\n for (let i: number = 0; i < a.length; i++) {\n let o: any = a[i];\n if (!datasetKey) {\n if (o[p] !== undefined)\n return o[p];\n }\n else {\n if (o['datasets'] && o['datasets'][datasetKey]) {\n let v = (o['datasets'][datasetKey][p]);\n if ((!(v == null)) && (!(v == undefined)))\n return o['datasets'][datasetKey][p];\n }\n }\n }\n }\n console.log(`${p} value undefined for ${f.properties['GEOID10']}!`);\n\n return undefined;\n}\n\nfunction _fGetJoined(f: any): any[] {\n return (f.properties && f.properties.joined) ? f.properties.joined : undefined;\n}\n\n// Wrap data by county, to abstract the specifics of the internal structure\nexport class Counties {\n _session: AnalyticsSession;\n\n _data: T.GeoFeatureCollection;\n _countyNameLookup: T.FIPSCodeToCountyNameMap = {};\n\n nCounties: number;\n index = {} as T.FIPSToOrdinalMap;\n totalPopulation: number[] = [];\n\n constructor(s: AnalyticsSession, data: T.GeoFeatureCollection) {\n this._session = s;\n\n this._data = data;\n this.nCounties = this._data.features.length;\n }\n countyByIndex(i: number): T.GeoFeature { return this._data.features[i]; }\n propertyForCounty(f: any, pk: string): any { return f.properties[pk]; }\n mapFIPSToName(fips: string, name: string): void { this._countyNameLookup[fips] = name; }\n nameFromFIPS(fips: string): string { return this._countyNameLookup[fips]; }\n indexFromFIPS(fips: string): number { return this.index[fips]; }\n}\n\n// CLASSES TO ORGANIZE AND/OR ABSTRACT OTHER DATA\n\nexport class State {\n _session: AnalyticsSession;\n\n xx: string;\n nDistricts: number;\n totalPop = 0;\n tooBigFIPS = [] as string[];\n tooBigName = [] as string[];\n expectedSplits = 0;\n expectedAffected = 0;\n\n constructor(s: AnalyticsSession, xx: string, n: number) {\n this._session = s;\n\n this.xx = xx;\n this.nDistricts = n;\n }\n}\n\nexport class Plan {\n _session: AnalyticsSession;\n\n // TODO - RECALC: Do these need to be updated, when the plan changes?\n _planByGeoID: T.PlanByGeoID;\n _planByDistrictID: T.PlanByDistrictID;\n\n districtIDs: number[];\n\n constructor(s: AnalyticsSession, p: T.PlanByGeoID) {\n this._session = s;\n\n\n this._planByGeoID = p;\n this._planByDistrictID = {} as T.PlanByDistrictID;\n\n this.districtIDs = []; // Set when the plan in inverted\n }\n // NOTE - DON'T remove water-only features from the plan, as they may be required\n // for contiguity. Just skip them in aggregating district statistics.\n // removeWaterOnlyFeatures(plan: T.PlanByGeoID): T.PlanByGeoID {\n // let newPlan = {} as T.PlanByGeoID;\n\n // for (let geoID in plan) {\n // // Remove water-only features\n // if (!(U.isWaterOnly(geoID))) {\n // newPlan[geoID] = plan[geoID];\n // }\n // else {\n // console.log(\"Removing water-only feature\", geoID);\n // }\n // }\n\n // return newPlan;\n // }\n invertPlan(): void {\n // NOTE - UNASSIGNED\n this._planByDistrictID = invertPlan(this._planByGeoID, this._session);\n this.districtIDs = U.getNumericObjectKeys(this._planByDistrictID);\n }\n initializeDistrict(i: number): void { this._planByDistrictID[i] = new Set(); }\n\n byGeoID(): T.PlanByGeoID { return this._planByGeoID; }\n byDistrictID(): T.PlanByDistrictID { return this._planByDistrictID; }\n districtForGeoID(i: string): number { return this._planByGeoID[i]; }\n geoIDsForDistrictID(i: number): Set<string> { return this._planByDistrictID[i]; }\n}\n\n// Invert a feature assignment structure to sets of ids by district\nexport function invertPlan(plan: T.PlanByGeoID, s?: AnalyticsSession): T.PlanByDistrictID {\n let invertedPlan = {} as T.PlanByDistrictID;\n\n // Add a dummy 'unassigned' district\n invertedPlan[S.NOT_ASSIGNED] = new Set();\n\n // NOTE - UNASSIGNED\n // The feature assignments coming from DRA do not include unassigned ones.\n // - In the DRA-calling context, there's an analytics session with a reference\n // to the features. Loop over all the features to find the unassigned ones,\n // and add them to the dummy unassigned district explicitly.\n // - In the CLI-calling context, there's no session (yet) but the plan is complete.\n if (!(s == undefined)) {\n for (let i: number = 0; i < s.features.nFeatures(); i++) {\n let f: T.GeoFeature = s.features.featureByIndex(i);\n let geoID: string = s.features.geoIDForFeature(f);\n\n // If the feature is NOT explicitly assigned to a district, add the geoID\n // to the dummy unassigned district 0.\n if (!(U.keyExists(geoID, plan))) invertedPlan[S.NOT_ASSIGNED].add(geoID);\n\n // NOTE - NOT skipping WATER-ONLY features here, because we're\n // not skipping them below when they are explicitly assigned in plans. Should\n // we skip them in both places?\n }\n }\n\n for (let geoID in plan) {\n let districtID = plan[geoID];\n\n // Make sure the set for the districtID exists\n if (!(U.objectContains(invertedPlan, districtID))) {\n invertedPlan[districtID] = new Set();\n }\n\n // Add the geoID to the districtID's set\n invertedPlan[districtID].add(geoID);\n\n if (U.isWaterOnly(geoID)) console.log(\"Water-only feature still in plan!\", geoID);\n }\n\n return invertedPlan;\n}\n\nexport class Graph {\n _session: AnalyticsSession;\n\n _graph: T.ContiguityGraph;\n\n constructor(s: AnalyticsSession, graph: T.ContiguityGraph) {\n this._session = s;\n\n this._graph = graph;\n }\n peerNeighbors(node: string): string[] {\n // Get the neighboring geoIDs connected to a geoID\n // Ignore the lengths of the shared borders (the values), for now\n\n // Protect against getting a GEOID that's not in the graph\n if (U.keyExists(node, this._graph)) {\n // NOTE - CONTIGUITY GRAPHS\n // Handle both unweighted & weighted neighbors\n let n = this._graph[node];\n let l = (n instanceof Array) ? n : U.getObjectKeys(n);\n\n return l;\n\n // return U.getObjectKeys(this._graph[node]);\n }\n else return [];\n\n // return U.getObjectKeys(this._graph[node]);\n }\n}\n\n\n","//\n// ANALYZE A PLAN\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\n\nimport { doIsComplete, doIsContiguous, doIsFreeOfHoles } from './valid'\nimport { doPopulationDeviation, doHasEqualPopulations } from './equal';\nimport { doReock, doPolsbyPopper } from './compact';\nimport {\n doFindCountiesSplitUnexpectedly, doFindSplitVTDs,\n doCountySplitting, doDistrictSplitting\n} from './cohesive';\nimport {\n doSeatsBias, doVotesBias,\n doResponsiveness, doResponsiveDistricts, doEfficiencyGap\n} from './political';\nimport { doMajorityMinorityDistricts } from './minority'\n\n// Compile district-level info for plan/map-level analytics\nexport function doAnalyzeDistricts(s: AnalyticsSession, bLog: boolean = false): void {\n s.districts.recalcStatistics(bLog);\n s.districts.extractDistrictShapeProperties(bLog);\n}\n\n// Calculate the analytics & validations and cache the results\n// NOTE - doAnalyzePlan() depends on doAnalyzeDistricts() having run first.\n// NOTE - I could make this table-driven, but I'm thinking that the explicit\n// calls might make chunking for aync easier.\nexport function doAnalyzePlan(s: AnalyticsSession, bLog: boolean = false): void {\n // TODO - Remove this mechanism. Always run all tests\n // Get the requested suites, and only execute those tests\n let requestedSuites = s.config['suites'];\n\n // Tests in the \"Legal\" suite, i.e., pass/ fail constraints\n if (requestedSuites.includes(T.Suite.Legal)) {\n s.tests[T.Test.Complete] = doIsComplete(s, bLog);\n\n s.tests[T.Test.Contiguous] = doIsContiguous(s, bLog);\n\n s.tests[T.Test.FreeOfHoles] = doIsFreeOfHoles(s, bLog);\n\n s.tests[T.Test.PopulationDeviation] = doPopulationDeviation(s, bLog);\n\n // NOTE - I can't check whether a population deviation is legal or not, until\n // the raw % is normalized. A zero (0) would mean \"too much\" / \"not legal,\" for\n // the given type of district (CD vs. LD). The EqualPopulation test is derived\n // from PopulationDeviation, as part of scorecard or test log preparation.\n\n // Create an empty test entry here though ...\n s.tests[T.Test.EqualPopulation] = s.getTest(T.Test.EqualPopulation) as T.TestEntry;\n }\n\n // Tests in the \"Fair\" suite\n if (requestedSuites.includes(T.Suite.Fair)) {\n s.tests[T.Test.SeatsBias] = doSeatsBias(s, bLog);\n\n s.tests[T.Test.VotesBias] = doVotesBias(s, bLog);\n\n s.tests[T.Test.Responsiveness] = doResponsiveness(s, bLog);\n\n s.tests[T.Test.ResponsiveDistricts] = doResponsiveDistricts(s, bLog);\n\n s.tests[T.Test.EfficiencyGap] = doEfficiencyGap(s, bLog);\n\n s.tests[T.Test.MajorityMinorityDistricts] = doMajorityMinorityDistricts(s, bLog);\n }\n\n // Tests in the \"Best\" suite, i.e., criteria for better/worse\n if (requestedSuites.includes(T.Suite.Best)) {\n s.tests[T.Test.Reock] = doReock(s, bLog);\n s.tests[T.Test.PolsbyPopper] = doPolsbyPopper(s, bLog);\n\n s.tests[T.Test.UnexpectedCountySplits] = doFindCountiesSplitUnexpectedly(s, bLog);\n s.tests[T.Test.VTDSplits] = doFindSplitVTDs(s, bLog);\n s.tests[T.Test.CountySplitting] = doCountySplitting(s, bLog);\n s.tests[T.Test.DistrictSplitting] = doDistrictSplitting(s, bLog);\n }\n\n // Enable a Test Log and Scorecard to be generated\n s.bPlanAnalyzed = true;\n s.bPostProcessingDone = false;\n}\n\n// Derive secondary analytics that are based on primary tests.\n// This concept allows Population Deviation to be a primary numeric test and\n// Equal Population to be secondary pass/fail validation.\n//\n// NOTE - Should this be conditionalized on the test suites requested? \n// Those are encapsulated in reports.ts right now, so not doing that.\nexport function doDeriveSecondaryTests(s: AnalyticsSession, bLog: boolean = false): void {\n s.tests[T.Test.EqualPopulation] = doHasEqualPopulations(s, bLog);\n}\n","//\n// SPLITTING of counties & districts\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n\n// CALCULATE ENHANCED SQRT ENTROPY METRIC\n\nexport function doCountySplitting(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.CountySplitting) as T.TestEntry;\n\n let CxD = s.districts.statistics[D.DistrictField.CountySplits].slice(0, -1);\n let countyTotals = s.counties.totalPopulation;\n let districtTotals = s.districts.statistics[D.DistrictField.TotalPop].slice(0, -1);\n\n let f = calcCountyFractions(CxD, countyTotals);\n let w = calcCountyWeights(countyTotals);\n\n let SqEnt_DC = countySplitting(f, w, bLog);\n\n let CxDreducedC = U.deepCopy(CxD);\n reduceCSplits(CxDreducedC, districtTotals);\n\n let fReduced = calcCountyFractions(CxDreducedC, countyTotals);\n let wReduced = calcCountyWeights(countyTotals);\n\n let SqEnt_DCreduced = countySplitting(fReduced, wReduced, bLog);\n\n test['score'] = SqEnt_DCreduced;\n test['details']['SqEnt_DC'] = SqEnt_DC;\n\n return test;\n}\n\nexport function doDistrictSplitting(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.DistrictSplitting) as T.TestEntry;\n\n let CxD = s.districts.statistics[D.DistrictField.CountySplits].slice(0, -1);\n let countyTotals = s.counties.totalPopulation;\n let districtTotals = s.districts.statistics[D.DistrictField.TotalPop].slice(0, -1);\n\n let g = calcDistrictFractions(CxD, districtTotals);\n let x = calcDistrictWeights(districtTotals);\n\n let SqEnt_CD = districtSplitting(g, x, bLog);\n\n let CxDreducedD = U.deepCopy(CxD);\n reduceDSplits(CxDreducedD, countyTotals);\n\n let gReduced = calcDistrictFractions(CxDreducedD, districtTotals);\n let xReduced = calcDistrictWeights(districtTotals);\n\n let SqEnt_CDreduced = districtSplitting(gReduced, xReduced, bLog);\n\n test['score'] = SqEnt_CDreduced;\n test['details']['SqEnt_CD'] = SqEnt_CD;\n\n return test;\n}\n\n\n// HELPERS\n\n// Loop over all the county-district combos, skipping the virtual district 0 \n// and virtual county 0.\n//\n// NOTE - The county-district splits and the county & district totals may all,\n// in general, be fractional/decimal numbers as opposed to integers, due to\n// dissaggregation & re-aggregation. Hence, comparisons need to approximate\n// equality.\n\n// Consolidate districts (rows) consisting of just one county (column)\n// UP into the dummy district (0).\nfunction reduceCSplits(CxDreducedC: number[][], districtTotals: number[]): void {\n let nD = CxDreducedC.length;\n let nC = CxDreducedC[0].length;\n\n for (let j = 1; j < nC; j++) {\n for (let i = 1; i < nD; i++) {\n let split_total = CxDreducedC[i][j];\n\n if (split_total > 0) {\n if (areRoughlyEqual(split_total, districtTotals[i])) {\n CxDreducedC[0][j] += split_total;\n CxDreducedC[i][j] = 0;\n }\n }\n }\n }\n}\n\n// Consolidate whole counties (columns) in a district (row) LEFT into the\n// dummy county (0).\nfunction reduceDSplits(CxDreducedD: number[][], countyTotals: number[]): void {\n let nD = CxDreducedD.length;\n let nC = CxDreducedD[0].length;\n\n for (let i = 1; i < nD; i++) {\n for (let j = 1; j < nC; j++) {\n let split_total = CxDreducedD[i][j];\n\n if (split_total > 0) {\n if (areRoughlyEqual(split_total, countyTotals[j])) {\n CxDreducedD[i][0] += split_total;\n CxDreducedD[i][j] = 0;\n }\n }\n }\n }\n}\n\nfunction calcCountyWeights(countyTotals: number[]): number[] {\n let nC: number = countyTotals.length;\n let cTotal: number = U.sumArray(countyTotals);\n\n let w: number[] = U.initArray(nC, 0.0);\n\n for (let j = 0; j < nC; j++) {\n w[j] = countyTotals[j] / cTotal;\n }\n\n return w;\n}\n\nfunction calcDistrictWeights(districtTotals: number[]): number[] {\n let nD = districtTotals.length;\n let dTotal: number = U.sumArray(districtTotals);\n\n let x: number[] = U.initArray(nD, 0.0);\n\n for (let i = 0; i < nD; i++) {\n x[i] = districtTotals[i] / dTotal;\n }\n\n return x;\n}\n\nfunction calcCountyFractions(CxDreducedD: number[][], countyTotals: number[]): number[][] {\n let nD = CxDreducedD.length;\n let nC = CxDreducedD[0].length;\n\n let f: number[][] = new Array(nD).fill(0.0).map(() => new Array(nC).fill(0.0));\n\n for (let j = 0; j < nC; j++) {\n for (let i = 0; i < nD; i++) {\n if (countyTotals[j] > 0) {\n f[i][j] = CxDreducedD[i][j] / countyTotals[j];\n }\n else {\n f[i][j] = 0.0;\n }\n }\n }\n\n return f;\n}\n\nfunction calcDistrictFractions(CxDreducedC: number[][], districtTotals: number[]): number[][] {\n let nD = CxDreducedC.length;\n let nC = CxDreducedC[0].length;\n\n let g: number[][] = new Array(nD).fill(0.0).map(() => new Array(nC).fill(0.0));\n\n for (let j = 0; j < nC; j++) {\n for (let i = 0; i < nD; i++) {\n if (districtTotals[i] > 0) {\n g[i][j] = CxDreducedC[i][j] / districtTotals[i];\n }\n else {\n g[i][j] = 0.0;\n }\n }\n }\n\n return g;\n}\n\n// Deal with decimal census \"counts\" due to disagg/re-agg\nfunction areRoughlyEqual(x: number, y: number): boolean {\n let delta = Math.abs(x - y);\n let result = (delta < S.EQUAL_TOLERANCE) ? true : false;\n\n return result;\n}\n\n// For all districts in a county, sum the split score.\nfunction countySplitScore(j: number, f: number[][], numD: number, bLog: boolean = false): number {\n let e = 0.0;\n\n for (let i = 0; i < numD; i++) {\n e += Math.sqrt(f[i][j]);\n }\n\n return e;\n}\n\n// For all counties, sum the weighted county splits.\nfunction countySplitting(f: number[][], w: number[], bLog: boolean = false): number {\n let numC = f[0].length;\n let numD = f.length;\n\n let e = 0.0;\n\n for (let j = 0; j < numC; j++) {\n let splitScore = countySplitScore(j, f, numD, bLog);\n e += w[j] * splitScore;\n\n if (bLog) console.log(\"County splitting =\", j, w[j], splitScore, e);\n }\n\n return U.trim(e, 3);\n}\n\n// For all counties in a district, sum the split score.\nfunction districtSplitScore(i: number, g: number[][], numC: number, bLog: boolean = false): number {\n let e = 0.0;\n\n for (let j = 0; j < numC; j++) {\n e += Math.sqrt(g[i][j]);\n }\n\n return e;\n}\n\n// For all districts, sum the weighted district splits.\nfunction districtSplitting(g: number[][], x: number[], bLog: boolean = false): number {\n let numC = g[0].length;\n let numD = g.length;\n\n let e = 0.0;\n\n for (let i = 0; i < numD; i++) {\n let splitScore = districtSplitScore(i, g, numC, bLog);\n e += x[i] * splitScore;\n\n if (bLog) console.log(\"District split score =\", i, x[i], splitScore, e);\n }\n\n return U.trim(e, 3);\n}\n\n\n// ANALYZE SIMPLE COUNTY & VTD SPLITTING\n\n/*\n \nSample results for NC 2016 dongressional plan\n________________________________________________________________________________\n \nState: NC\nCensus: 2010\nTotal population: 9,535,483\nNumber of districts: 13\nTarget district size: 733,499\nNumber of counties: 100\n \nEqual Population: 11.24% deviation\nCompactness: None\nProportionality: 27.67% gap\nCohesiveness: 11 unexpected splits, affecting 27.14% of the total population\n \nThese counties are split unexpectedly:\n \n • Bladen\n • Buncombe\n • Catawba\n • Cumberland\n • Durham\n • Guilford\n • Iredell\n • Johnston\n • Pitt\n • Rowan\n • Wilson\n \n*/\n\nexport function doFindCountiesSplitUnexpectedly(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.UnexpectedCountySplits) as T.TestEntry;\n\n // THE THREE VALUES TO DETERMINE FOR A PLAN\n let unexpectedSplits: number = 0;\n let unexpectedAffected: number = 0;\n let countiesSplitUnexpectedly = [];\n\n // FIRST, ANALYZE THE COUNTY SPLITTING FOR THE PLAN\n\n // Get the county-district pivot (\"splits\")\n let countiesByDistrict = s.districts.statistics[D.DistrictField.CountySplits];\n // countiesByDistrict = countiesByDistrict.slice(1, -1);\n\n // Find the single-county districts, i.e., districts NOT split across counties.\n // Ignore the dummy unassigned 0 and N+1 summary \"districts.\"\n let singleCountyDistricts = [];\n for (let d = 1; d <= s.state.nDistricts; d++) {\n // See if there's only one county partition\n let nCountiesInDistrict = 0;\n for (let c = 0; c < s.counties.nCounties; c++) {\n // Guard against empty district\n if (countiesByDistrict[d]) {\n if (countiesByDistrict[d][c] > 0) {\n nCountiesInDistrict += 1;\n if (nCountiesInDistrict > 1) {\n break;\n }\n }\n }\n }\n // If so, save the district\n if (nCountiesInDistrict == 1) {\n singleCountyDistricts.push(d);\n }\n }\n\n // Process the splits/partitions in the plan:\n // - Count the total # of partitions,\n // - Find the counties split across districts, and\n // - Accumulate the number people affected (except when single-county districts)\n let nPartitionsOverall: number = 0;\n let splitCounties = new Set(); // The counties that are split across districts\n let totalAffected: number = 0; // The total population affected by those splits\n\n for (let c = 0; c < s.counties.nCounties; c++) {\n let nCountyParts = 0;\n let subtotal = 0;\n\n for (let d = 1; d <= s.state.nDistricts; d++) {\n // Guard against empty district\n if (countiesByDistrict[d]) {\n if (countiesByDistrict[d][c] > 0) {\n nPartitionsOverall += 1;\n nCountyParts += 1;\n if (!(U.arrayContains(singleCountyDistricts, d))) {\n subtotal += countiesByDistrict[d][c];\n }\n }\n }\n }\n if (nCountyParts > 1) {\n splitCounties.add(c);\n totalAffected += subtotal;\n }\n }\n\n // Convert county ordinals to FIPS codes\n let splitCountiesFIPS = U.getSelectObjectKeys(s.counties.index, [...splitCounties]);\n\n // THEN TAKE ACCOUNT OF THE COUNTY SPLITTING THAT IS EXPECTED (REQUIRED)\n\n // Compute the total number of splits this way, in case any counties are split\n // more than once. I.e., it's not just len(all_counties_split).\n let nSplits = nPartitionsOverall - s.counties.nCounties;\n\n // Determine the number of *unexpected* splits. NOTE: Prevent negative numbers,\n // in case you have a plan the *doesn't* split counties that would have to be\n // split due to their size.\n unexpectedSplits = Math.max(0, nSplits - s.state.expectedSplits);\n\n // Subtract off the total population that *has* to be affected by splits,\n // because their counties are too big. NOTE: Again, prevent negative numbers, \n // in case you have a plan the *doesn't* split counties that would have to be\n // split due to their size.\n unexpectedAffected = U.trim(Math.max(0, totalAffected - s.state.expectedAffected) / s.state.totalPop);\n\n // Find the counties that are split *unexpectedly*. From all the counties that\n // are split, remove those that *have* to be split, because they are bigger than\n // a district.\n let countiesSplitUnexpectedlyFIPS = [];\n for (let fips of splitCountiesFIPS) {\n if (!(U.arrayContains(s.state.tooBigFIPS, fips))) {\n countiesSplitUnexpectedlyFIPS.push(fips);\n }\n }\n\n // ... and convert the FIPS codes to county names.\n for (let fips of countiesSplitUnexpectedlyFIPS) {\n countiesSplitUnexpectedly.push(s.counties.nameFromFIPS(fips));\n }\n countiesSplitUnexpectedly = countiesSplitUnexpectedly.sort();\n\n test['score'] = U.trim(unexpectedAffected);\n test['details']['unexpectedSplits'] = unexpectedSplits;\n test['details']['countiesSplitUnexpectedly'] = countiesSplitUnexpectedly;\n\n return test;\n}\n\nexport function doFindSplitVTDs(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.VTDSplits) as T.TestEntry;\n\n let splitVTDs: string[] = [];\n\n // TODO - SPLITTING: Flesh this out, using Terry's virtual VTD's ...\n\n test['score'] = splitVTDs.length;\n test['details']['splitVTDs'] = splitVTDs;\n\n return test;\n}\n\n","//\n// COMPACT\n//\n\nimport * as Poly from '@dra2020/poly';\n\nimport { gfArea, gfPerimeter, gfDiameter } from './geofeature';\n\nimport * as T from './types';\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\n\n// Measures of compactness compare district shapes to various ideally compact\n// benchmarks, such as circles. All else equal, more compact districts are better.\n// \n// There are four popular measures of compactness. They either focus on how\n// dispersed or how indented a shapes are.\n//\n// These first two measures are the most important:\n// \n// Reock is the primary measure of the dispersion of district shapes, calculated\n// as “the area of the district to the area of the minimum spanning circle that\n// can enclose the district.”\n//\n// R = A / A(Minimum Bounding Circle)\n// R = A / (π * (D / 2)^2)\n//\n// R = 4A / πD^2\n//\n// where A is the area of the district and D is the diameter of the minimum\n// bounding circle.\n//\n// Polsby-Popper is the primary measure of the indendentation of district shapes,\n// calculated as the “the ratio of the area of the district to the area of a circle\n// whose circumference is equal to the perimeter of the district.”\n//\n// PP = A / A(C)\n//\n// where C is that circle. In other words:\n//\n// P = 2πRc and A(C) = π(P / 2π)^2\n//\n// where P is the perimeter of the district and Rc is the radius of the circle.\n//\n// Hence, the measure simplifies to:\n//\n// PP = 4π * (A / P^2)\n// \n// I propose that we use these two, normalize them, and weight equally to determine\n// our compactness value.\n// \n// These second two measures may be used to complement the primary ones above:\n// \n// Convex Hull is a secondary measure of the dispersion of district shapes, calculated\n// as “the ratio of the district area to the area of the minimum convex bounding\n// polygon (also known as a convex hull) enclosing the district.”\n//\n// CH = A / A(Convex Hull)\n// \n// where a convex hull is the minimum perimeter that encloses all points in a shape,\n// basically the shortest unstretched rubber band that fits around the shape.\n//\n// Schwartzberg is a secondary measure of the degree of indentation of district\n// shapes, calculated as “the ratio of the perimeter of the district to the circumference\n// of a circle whose area is equal to the area of the district.”\n//\n// S = 1 / (P / C)\n//\n// where P is the perimeter of the district and C is the circumference of the circle.\n// The radius of the circle is:\n//\n// Rc = SQRT(A / π)\n//\n// So, the circumference of the circle is:\n//\n// C = 2πRc or C = 2π * SQRT(A / π)\n//\n// Hence:\n//\n// S = 1 (P / 2π * SQRT(A / π))\n//\n// S = (2π * SQRT(A / π)) / P\n//\n// All these measures produce values between 0 and 1, with 0 being the least compact\n// and 1 being the most compact. Sometimes these values are multiplied by 100 to\n// give values between 0 and 100.\n// \n// For each measure, the compactness of a set of Congressional districts is the\n// average of that measure for all the districts.\n//\n\n// Calculate Reock compactness:\n// reock = (4 * a) / (math.pi * d**2)\n// NOTE - Depends on extractDistrictProperties running first\nexport function doReock(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Reock) as T.TestEntry;\n\n // Calculate Reock scores by district\n let scores: number[] = [];\n\n for (let districtID = 1; districtID <= s.state.nDistricts; districtID++) {\n let districtProps = s.districts.getGeoProperties(districtID);\n // Guard against no shape and no properties\n if (districtProps) {\n let a = districtProps[T.DistrictShapeProperty.Area];\n let d = districtProps[T.DistrictShapeProperty.Diameter];\n\n let reock = (4 * a) / (Math.PI * d ** 2);\n\n // Save each district score\n scores.push(reock);\n\n // Echo the results by district\n if (bLog) console.log(\"Reock for district\", districtID, \"=\", reock);\n }\n }\n\n // Populate the test entry ... for the shapes that exist!\n let averageReock = U.avgArray(scores);\n\n test['score'] = U.trim(averageReock);\n test['details'] = {}; // TODO - Any details?\n\n return test;\n}\n\n// Calculate Polsby-Popper compactness measures:\n// polsby_popper = (4 * math.pi) * (a / p**2)\n// NOTE - Depends on extractDistrictProperties running first\nexport function doPolsbyPopper(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.PolsbyPopper) as T.TestEntry;\n\n // Calculate Polsby-Popper scores by district\n let scores: number[] = [];\n\n for (let districtID = 1; districtID <= s.state.nDistricts; districtID++) {\n let districtProps = s.districts.getGeoProperties(districtID);\n // Guard against no shape and no properties\n if (districtProps) {\n let a = districtProps[T.DistrictShapeProperty.Area];\n let p = districtProps[T.DistrictShapeProperty.Perimeter];\n\n let polsbyPopper = (4 * Math.PI) * (a / p ** 2);\n\n // Save each district score\n scores.push(polsbyPopper);\n\n // Echo the results by district\n if (bLog) console.log(\"Polsby-Popper for district\", districtID, \"=\", polsbyPopper);\n }\n }\n\n // Populate the test entry ... for the shapes that exist!\n let averagePolsbyPopper = U.avgArray(scores);\n\n test['score'] = U.trim(averagePolsbyPopper);\n test['details'] = {}; // TODO - Any details?\n\n return test;\n}\n\n\n// HELPER TO EXTRACT PROPERTIES OF DISTRICT SHAPES\n\nexport function extractDistrictProperties(s: AnalyticsSession, bLog: boolean = false): void {\n // NOTE - I am assuming that district IDs are integers 1–N\n for (let i = 1; i <= s.state.nDistricts; i++) {\n let poly = s.districts.getDistrictShapeByID(i);\n\n // Guard against no shape for empty districts AND null shapes\n let polyOptions = { noLatitudeCorrection: true }\n let bNull = (!Poly.polyNormalize(poly, polyOptions));\n\n if (poly && (!bNull)) {\n // TODO - OPTIMIZE: Bundle these calls?\n let area: number = gfArea(poly);\n let perimeter: number = gfPerimeter(poly);\n let diameter: number = gfDiameter(poly);\n\n let props: T.DistrictShapeProperties = [0, 0, 0]; // TODO - TERRY?!?\n props[T.DistrictShapeProperty.Area] = area;\n props[T.DistrictShapeProperty.Diameter] = diameter;\n props[T.DistrictShapeProperty.Perimeter] = perimeter;\n\n s.districts.setGeoProperties(i, props);\n\n if (bLog) console.log(\"District\", i, \"A =\", area, \"P =\", perimeter, \"D =\", diameter);\n }\n }\n}\n\n\n// SAVE THESE NOTES, IN CASE WE NEED TO REWORK HOW WE PERFORM THESE CALCS.\n// THEY REFLECT HOW I DID THEM IN PYTHON.\n//\n// THE COMPACTNESS ANALYTICS NEED THE FOLLOWING DATA,\n// IN ADDITION TO THE MAP (IDEALLY, GEO_IDS INDEXED BY DISTRICT_ID)\n//\n// Shapes by geo_id\n//\n// If we need/want to speed compactness calculations up, we'll need\n// to calculate the perimeters and diameters (and areas) of districts implicitly,\n// which will require identifying district boundaries initially and updating\n// them incrementally as districts are (re)assigned.\n//\n// A district's boundary info is the set/list of features that constitute the\n// district's border along with each boundary feature's neighbors. Hence, this\n// requires a contiguity graph with the lengths of shared edges between features\n// precomputed.\n//\n// NOTE - I can write up (if not implement) the logic for determining what shapes\n// constitute a district's boundary. There are a few nuances.\n//\n// If we have to optimize like this when we generalize to mixed maps, the\n// determination of \"neighbors in the map\" and the length of shared borders\n// (for determining a district perimeters) becomes more complicated and dynamic.\n//\n// NOTE - Again, I can write up (if not implement) the logic for both of these.\n// They are a bit tricky and require special preprocessing of the summary level\n// hierarchy (which I also have a script for that we can repurpose).\n","//\n// EQUAL POPULATION\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n\nexport function doPopulationDeviation(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.PopulationDeviation) as T.TestEntry;\n\n // Compute the min, max, and average district populations,\n // excluding the dummy 'unassigned' 0 and N+1 summary \"districts.\"\n let totPopByDistrict = s.districts.statistics[D.DistrictField.TotalPop];\n totPopByDistrict = totPopByDistrict.slice(1, -1);\n\n let min = U.minArray(totPopByDistrict);\n let max = U.maxArray(totPopByDistrict);\n let total = U.sumArray(totPopByDistrict);\n\n // Calculate the raw population deviation.\n // The target size is the average population.\n let avg = total / s.state.nDistricts;\n let popDev = (max - min) / avg;\n\n // Round the raw value to the desired level of precision\n popDev = U.trim(popDev);\n\n // Populate the test entry\n test['score'] = popDev;\n test['details'] = { 'maxDeviation': max - min };\n\n // Populate the N+1 summary \"district\" in district.statistics\n let totalPop = s.districts.statistics[D.DistrictField.TotalPop];\n let popDevPct = s.districts.statistics[D.DistrictField.PopDevPct];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n totalPop[summaryRow] = avg; // aka \"target size\"\n popDevPct[summaryRow] = popDev;\n\n return test;\n}\n\n// NOTE - This validity check is *derived* and depends on population deviation %\n// being computed (above) and normalized in test log & scorecard generation.\nexport function doHasEqualPopulations(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.EqualPopulation) as T.TestEntry;\n\n // Get the normalized population deviation %\n let popDevTest = s.getTest(T.Test.PopulationDeviation);\n let popDevPct = popDevTest['score'] as number;\n let popDevNormalized: number = popDevTest['normalizedScore'] as number;\n\n // Populate the test entry\n if (popDevNormalized > 0) {\n test['score'] = true;\n }\n else {\n test['score'] = false;\n }\n test['details']['deviation'] = popDevPct;\n test['details']['thresholds'] = popDevTest['details']['scale'];\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bEqualPop = s.districts.statistics[D.DistrictField.bEqualPop];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bEqualPop[summaryRow] = test['score'];\n\n return test;\n}\n","//\n// GEO-FEATURES UTILITIES\n//\n\nimport * as Poly from '@dra2020/poly';\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\n\n// CARTESIAN SHIMS OVER 'POLY' FUNCTIONS\n\n// TODO - POLY: Confirm Cartesian calculations\nexport function gfArea(poly: any): number {\n let area: number = _polygonArea(poly);\n\n return area;\n}\n\n// Algorithm for the area of a simple/single planar polygon:\n// https://algorithmtutor.com/Computational-Geometry/Area-of-a-polygon-given-a-set-of-points/\n// https://mathopenref.com/coordpolygonarea2.html\n//\n// function polygonArea(X, Y, numPoints) \n// { \n// area = 0; // Accumulates area in the loop\n// j = numPoints-1; // The last vertex is the 'previous' one to the first\n\n// for (i=0; i<numPoints; i++)\n// { area = area + (X[j]+X[i]) * (Y[j]-Y[i]); \n// j = i; //j is previous vertex to i\n// }\n// return area/2;\n// }\n\n// Reimplemented to use polygons vs. X & Y vectors\nfunction _polygonSimpleArea(p: any): number {\n let area = 0; // Accumulates area in the loop\n let n = p.length;\n let j = n - 1; // The last vertex is the 'previous' one to the first\n\n for (let i = 0; i < n; i++) {\n area = area + (p[j][0] + p[i][0]) * (p[j][1] - p[i][1]);\n // area = area + (X[j] + X[i]) * (Y[j] - Y[i]);\n j = i; // j is previous vertex to i\n }\n return Math.abs(area / 2);\n}\n\n// Generalizes the above for MultiPolygons -- cloned from polyArea() in 'poly'\nfunction _polygonArea(poly: any): number {\n let polyOptions = { noLatitudeCorrection: true } // NO-OP?\n poly = Poly.polyNormalize(poly, polyOptions); // TODO - POLY: Discuss w/ Terry\n\n let a: number = 0;\n\n // A MultiPolygon is a set of polygons\n for (let i: number = 0; poly && i < poly.length; i++) {\n // A single polygon is an exterior ring with interior holes. Holes are subtracted.\n let p = poly[i];\n for (let j: number = 0; j < p.length; j++) {\n let sp = p[j];\n a += _polygonSimpleArea(sp) * (j == 0 ? 1 : -1);\n }\n }\n\n return a;\n}\n\n// TODO - POLY: Confirm Cartesian calculations w/ Terry\n// The perimeter calculation already just computes cartesian distance if you\n// pass in the noLatitudeCorrection flag. You would need to divide by \n// Poly.EARTH_RADIUS to go from the returned units of meters to Lat/Lon “units”.\n\nexport function gfPerimeter(poly: any): number {\n let perimeter: number = _polygonPerimeter(poly);\n\n return perimeter;\n}\n\n// TODO - POLY: Confirm Cartesian calculations w/ Terry\n// Cloned from polyPerimeter() in 'poly' and revised to use Cartesian distance\n// NOTE: No conversion of degrees to radians!\nfunction _polygonPerimeter(poly: any): number {\n let polyOptions = { noLatitudeCorrection: true } // Cartesian distance\n poly = Poly.polyNormalize(poly, polyOptions);\n\n let perimeter: number = 0;\n for (let i: number = 0; poly && i < poly.length; i++) {\n // Ignore holes so only look at first polyline\n let p: any = poly[i][0];\n for (let j: number = 0; j < p.length - 1; j++)\n perimeter += _distance(p[j][0], p[j][1], p[j + 1][0], p[j + 1][1]);\n\n if (p.length > 2 && (p[0][0] != p[p.length - 1][0] || p[0][1] != p[p.length - 1][1]))\n perimeter += _distance(p[0][0], p[0][1], p[p.length - 1][0], p[p.length - 1][1]);\n }\n\n return perimeter;\n}\n\nfunction _distance(x1: number, y1: number, x2: number, y2: number): number {\n let dLat = y2 - y1;\n let dLon = x2 - x1;\n let d: number;\n\n d = Math.sqrt((dLat * dLat) + (dLon * dLon));\n\n return d;\n}\n\n// TODO - POLY: Confirm Cartesian calculations w/ Terry\n// As I mentioned, the polyCircle code was already just treating the coordinate\n// system as Cartesian. I then did polyFromCircle to convert it to a polygon that\n// then could be passed to polyArea in order to take into account the projection.\n// If instead, you compute area directly from the circle as PI R squared, then\n// you should have your cartesian circular area.\n\nexport function gfDiameter(poly: any): number {\n let polyOptions = { noLatitudeCorrection: true } // NO-OP\n\n let circle = Poly.polyToCircle(poly, polyOptions) as Poly.Circle;\n let diameter: number = circle.r * 2;\n\n return diameter;\n}\n","//\n// PROTECTS MINORITIES\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\n\nimport demographicDefs from '../static/demographic-defns.json';\nimport majorityMinority from '../static/majority-minority.json';\nimport stateContacts from '../static/state-contacts.json';\nimport vraSection5 from '../static/vra5-preclearance.json';\n\nexport function doMajorityMinorityDistricts(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.MajorityMinorityDistricts) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating # of majority-minority districts ...\");\n\n return test;\n}\n\n\n// Sources for majority-minority info:\n// - https://en.wikipedia.org/wiki/List_of_majority-minority_United_States_congressional_districts\n// TODO - 2020: Update/revise this, when the update comes out in September:\n// - http://www.ncsl.org/Portals/1/Documents/Redistricting/Redistricting_2010.pdf\n","//\n// FAIR/PROPORTIONAL\n//\n\nimport { strict as assert } from 'assert';\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n// Partisan analytics need the following data:\n//\n// An \"election model\" by geo_id, where each item has 4 pieces of data:\n//\n// { geo_id, Democratic votes, Republican votes, Total votes }\n//\n// NOTE: D + R <= Total, because there could be third-party or write-in votes.\n//\n// An election model can simply represent one election, e.g., President 2012,\n// or combine multiple elections in some fashion. An election model is used to\n// computer a single index of the likely partisan weight / lean / preference\n// for the districts in a plan. An election model and the associated index go\n// hand in hand. So much so that the index frequently stands in as the name for\n// both, e.g., Cook's PVI is one example, Nagle's 7s, Hofeller's Formula, NDRC's\n// DPI.\n//\n// I'm labelling this general concept a \"Voter Preference Index (VPI),\" a\n// conscious +1 letter play on Cook's \"PVI\" acronymn.\n\n\n// MEASURING BIAS & RESPONSIVENESS (NAGLE'S METHOD)\n\nexport function doSeatsBias(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.SeatsBias) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating seats bias ...\");\n\n return test;\n}\n\nexport function doVotesBias(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.VotesBias) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating votes bias ...\");\n\n return test;\n}\n\nexport function doResponsiveness(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Responsiveness) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating responsiveness ...\");\n\n return test;\n}\n\nexport function doResponsiveDistricts(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.ResponsiveDistricts) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating # of responsive districts ...\");\n\n return test;\n}\n\n\n// OTHER MEASURES OF PARTISAN BIAS\n\n// TODO - PARTISAN: This formula might need to be inverted for D vs. R +/-\n// TODO - Normalize the results.\nexport function doEfficiencyGap(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n if (bLog) console.log(\"TODO - Calculating the efficiency gap ...\");\n\n let test = s.getTest(T.Test.EfficiencyGap) as T.TestEntry;\n\n // Get partisan statistics by districts.\n // Use Democratic votes, seats, and shares by convention.\n let DVotes = s.districts.statistics[D.DistrictField.DemVotes];\n let DSeats = s.districts.statistics[D.DistrictField.DemSeat];\n let TPVotes = s.districts.statistics[D.DistrictField.TwoPartyVote];\n\n // Exclude the dummy unassigned '0' and N+1 summary \"districts\"\n DVotes = DVotes.slice(1, -1);\n DSeats = DSeats.slice(1, -1);\n TPVotes = TPVotes.slice(1, -1);\n\n // Calculate D vote share & D seat share\n let DVoteShare = U.sumArray(DVotes) / U.sumArray(TPVotes);\n let DSeatShare = U.sumArray(DSeats) / s.state.nDistricts;\n\n // Finally, calculate the Efficiency Gap\n let efficiencyGap = (DSeatShare - 0.5) - (2.0 * (DVoteShare - 0.5));\n\n // Round the raw value to the desired level of precision\n efficiencyGap = U.trim(efficiencyGap);\n\n // Populate the test entry\n test['score'] = efficiencyGap;\n // test['normalizedScore'] = 0; /* TODO - Normalize the raw score */\n test['details'] = {}; /* TODO - Add details, if any */\n\n return test;\n}\n\n\n// HELPERS\n\nexport function fptpWin(demPct: number): number {\n // Vote shares should be fractions in the range [0.0 – 1.0]\n assert((demPct <= 1.0) && (demPct >= 0.));\n\n return ((demPct > 0.5) ? 1 : 0);\n}\n","//\n// PREPROCESS DATA\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n\n// NOTE - Do preprocessing separately, so the constructor returns quickly.\nexport function doPreprocessData(s: AnalyticsSession, bLog: boolean = false): void {\n // If necessary, do one-time preprocessing\n if (!s.bOneTimeProcessingDone) {\n doPreprocessCountyFeatures(s, bLog);\n doPreprocessCensus(s, bLog);\n doPreprocessElection(s, bLog);\n s.bOneTimeProcessingDone = true;\n }\n\n // NOTE - UNASSIGNED: Made both the planByGeoID & DistrictID are right\n // Invert the plan by district ID\n s.plan.invertPlan();\n\n // Create a map of geoIDs to feature IDs\n s.features.mapGeoIDsToFeatureIDs();\n}\n\n// CREATE A FIPS CODE TO COUNTY NAME LOOKUP\n\nfunction doPreprocessCountyFeatures(s: AnalyticsSession, bLog: boolean = false): void {\n for (let i: number = 0; i < s.counties.nCounties; i++) {\n\n let county = s.counties.countyByIndex(i);\n\n let fips = s.counties.propertyForCounty(county, 'COUNTYFP');\n let name = s.counties.propertyForCounty(county, 'NAME');\n\n s.counties.mapFIPSToName(fips, name);\n }\n}\n\n\n// ANALYZE THE CENSUS BY COUNTY\n\nfunction doPreprocessCensus(s: AnalyticsSession, bLog: boolean = false): void {\n // The county-splitting analytic needs the following info, using NC as an example:\n // '_stateTotal' = The total state population, e.g., 9,535,483 for NC's 2010 Census\n // 'totalByCounty' = The total population by county FIPS code\n\n // SUM TOTAL POPULATION BY COUNTY\n\n let totalByCounty: T.GeoIDTotal = {};\n\n // NOTE - This works w/o GEOIDs, because you're looping over all features.\n for (let i: number = 0; i < s.features.nFeatures(); i++) {\n let f: T.GeoFeature = s.features.featureByIndex(i);\n let geoID: string = s.features.geoIDForFeature(f);\n // Skip water-only features\n if (!(U.isWaterOnly(geoID))) {\n let value: number = s.features.fieldForFeature(f, D.Dataset.CENSUS, D.FeatureField.TotalPop);\n\n // Sum total population across the state\n s.state.totalPop += value;\n\n // Get the county FIPS code for the feature\n let county = U.parseGeoID(geoID)['county'] as string;\n let countyFIPS = U.getFIPSFromCountyGeoID(county);\n // If a subtotal for the county doesn't exist, initialize one\n if (!(U.keyExists(countyFIPS, totalByCounty))) {\n totalByCounty[countyFIPS] = 0;\n }\n // Sum total population by county\n totalByCounty[countyFIPS] += value;\n }\n // else {\n // console.log(\"Skipping water-only feature in Census preprocessing:\", geoID);\n // }\n }\n // NOTE - The above could be replaced, if I got totals on county.geojson.\n\n\n // CREATE A FIPS CODE-ORDINAL MAP\n\n // Get the county FIPS codes\n let fipsCodes = U.getObjectKeys(totalByCounty);\n // Sort the results\n fipsCodes = fipsCodes.sort();\n\n // NOTE - SPLITTING\n // Add a dummy county, for county-district splitting analysis\n fipsCodes.unshift('000');\n\n // Create the ID-ordinal map\n for (let i in fipsCodes) {\n s.counties.index[fipsCodes[i]] = Number(i);\n }\n\n\n // MAKE AN ARRAY OF TOTAL POPULATIONS BY COUNTY INDEX\n\n // Add an extra 0th virtual county bucket for county-district splitting analysis \n let nCountyBuckets = s.counties.nCounties + 1;\n let countyTotals: number[] = U.initArray(nCountyBuckets, 0);\n\n for (let fipsCode in totalByCounty) {\n let i = s.counties.indexFromFIPS(fipsCode);\n\n countyTotals[i] = totalByCounty[fipsCode];\n }\n\n s.counties.totalPopulation = countyTotals;\n\n\n // ANALYZE THE COUNTIES\n\n // 'target_size': 733499, # calc as total / districts\n let targetSize = Math.round(s.state.totalPop / s.state.nDistricts);\n\n // Find counties that are bigger than the target district size.\n // 'too_big' = The counties that are bigger than a district, e.g., ['Mecklenburg', 'Wake']\n // 'too_big_fips' = Their FIPS codes, e.g., ['119', '183']\n // 'expected_splits' = The # of counties that are bigger than a single district, e.g., 2\n // 'expected_affected' = The # of people whose district must be split, e.g., 353,623\n\n let tooBigFIPS = [];\n let tooBigName = [];\n let expectedSplits = 0;\n let expectedAffected = 0;\n\n // Loop over the counties\n for (let county in fipsCodes) {\n let fipsCode = fipsCodes[county];\n\n // NOTE - SPLITTING\n // Skip the dummy county\n if (fipsCode == '000') continue;\n\n let countyAffected = 0;\n\n // Find the number of required splits, assuming target district size.\n let rawQuotient = totalByCounty[fipsCode] / (targetSize + 1);\n let remainder = rawQuotient % 1;\n let quotient = rawQuotient - remainder;\n let countySplits = quotient;\n\n if (countySplits > 0) {\n countyAffected = totalByCounty[fipsCode] % targetSize;\n tooBigFIPS.push(fipsCode);\n tooBigName.push(s.counties.nameFromFIPS(fipsCode));\n }\n\n expectedSplits += countySplits;\n expectedAffected += countyAffected;\n }\n\n s.state.tooBigFIPS = tooBigFIPS;\n s.state.tooBigName = tooBigName;\n s.state.expectedSplits = expectedSplits;\n s.state.expectedAffected = expectedAffected;\n}\n\n\n// PREPROCESS ELECTION RESULTS\n\nfunction doPreprocessElection(s: AnalyticsSession, bLog: boolean = false): void {\n if (bLog) console.log(\"TODO - Preprocessing election data ...\");\n}\n\n","//\n// TEMPLATES FOR UNFORMATTED ANALYTICS RESULTS\n// \n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\nimport { doDeriveSecondaryTests } from './analyze';\n\nimport allStateReqs from '../static/state-reqs.json';\nimport stateNames from '../static/state-names.json';\n\n// PLAN ANALYTICS\n\nexport type RequirementsCategory = {\n score: T.TriState;\n metrics: {\n complete: T.TriState;\n contiguous: T.TriState;\n freeOfHoles: T.TriState;\n equalPopulation: T.TriState;\n };\n details: {\n unassignedFeatures: string[]; // A possibly empty list of GEOIDs\n emptyDistricts: number[]; // A possibly empty list of district IDs\n discontiguousDistricts: number[]; // Ditto\n embeddedDistricts: number[]; // Ditto\n populationDeviation: number; // A fraction [0.0 – 1.0] to represent as a %\n deviationThreshold: number; // A fraction [0.0 – 1.0] to represent as a % \n };\n datasets: T.Datasets;\n resources: {\n stateReqs: string;\n };\n};\n\nexport type CompactnessCategory = {\n score: number; // An integer score [0–100]\n metrics: {\n reock: number; // A decimal number [0.0–1.0]\n polsby: number; // A decimal number [0.0–1.0]\n };\n details: {\n // None at this time\n };\n datasets: T.Datasets;\n resources: {\n // None at this time\n };\n};\n\nexport type SplittingCategory = {\n score: number; // An integer score [0–100]\n metrics: {\n sqEnt_DCreduced: number, // A decimal number [1.0 – < 2.0]\n sqEnt_CDreduced: number // A decimal number [1.0 – < 2.0]\n };\n details: {\n countiesSplitUnexpectedly: string[], // A possibly empty list of county names\n unexpectedAffected: number, // A fraction [0.0 – 1.0] to represent as a %\n nSplitVTDs: number, // An integer, possibly 0\n splitVTDs: string[] // A possibly empty list of GEOIDs\n };\n datasets: T.Datasets;\n resources: {\n // None at this time\n };\n};\n\n// TODO - PARTISAN: This category is still under development.\n// We haven't settled on metrics yet. This is just an example.\nexport type PartisanCategory = {\n score: number; // An integer score [0–100]\n metrics: {\n partisanBias: 0.15, // TBD\n responsiveness: 2.0 // TBD\n };\n details: {\n // TODO - Need to flesh this out\n };\n datasets: T.Datasets;\n resources: {\n planScore?: string;\n };\n};\n\n// TODO - MINORITY: This category is still under development.\n// We haven't settled on metrics yet. This is just a (likely) example.\nexport type MinorityCategory = {\n score: null; // Explicitly NOT scored\n metrics: {\n nBlack37to50: number, // Integer >= 0; two-digit maximum\n nBlackMajority: number, // Ditto\n nHispanic37to50: number, // Ditto\n nHispanicMajority: number, // Ditto\n nPacific37to50: number, // Ditto\n nPacificMajority: number, // Ditto\n nAsian37to50: number, // Ditto\n nAsianMajority: number, // Ditto\n nNative37to50: number, // Ditto\n nNativeMajority: number, // Ditto\n nMinority37to50: number, // Ditto\n nMinorityMajority: number, // Ditto\n\n averageDVoteShare: number // A fraction [0.0 – 1.0] to represent as a %\n };\n details: {\n vap: true, // true = using VAP data; false = CVAP data\n comboCategories: true // true = using combo fields; false = mutually exclusive\n };\n datasets: T.Datasets;\n resources: {\n // TODO - Add these ...\n };\n};\n\nexport type PlanAnalytics = {\n requirements: RequirementsCategory;\n compactness: CompactnessCategory;\n // TODO - Don't show these categories yet\n splitting: SplittingCategory;\n partisan: PartisanCategory;\n minority: MinorityCategory;\n}\n\n\n// Example\n\nlet sampleRequirements: RequirementsCategory = {\n score: T.TriState.Red,\n metrics: {\n complete: T.TriState.Green,\n contiguous: T.TriState.Red,\n freeOfHoles: T.TriState.Yellow,\n equalPopulation: T.TriState.Red\n },\n details: {\n unassignedFeatures: [],\n emptyDistricts: [],\n discontiguousDistricts: [2],\n embeddedDistricts: [],\n populationDeviation: 0.6748,\n deviationThreshold: 0.75 / 100\n },\n datasets: {\n census: \"2010 Census Total Population\"\n },\n resources: {\n stateReqs: \"https://www.brennancenter.org/sites/default/files/publications/2019_06_50States_FINALsinglepages_20.pdf\"\n }\n}\n\nlet sampleCompactness: CompactnessCategory = {\n score: 60,\n metrics: {\n reock: 0.3773,\n polsby: 0.3815\n },\n details: {},\n datasets: {\n shapes: \"2010 VTD shapes\"\n },\n resources: {}\n}\n\nlet sampleSplitting: SplittingCategory = {\n score: 73,\n metrics: {\n sqEnt_DCreduced: 1.531,\n sqEnt_CDreduced: 1.760\n },\n details: {\n countiesSplitUnexpectedly: [\n \"Bladen\", \"Buncombe\", \"Catawba\", \"Cumberland\", \"Durham\", \"Guilford\", \"Iredell\", \"Johnston\", \"Pitt\", \"Rowan\", \"Wilson\"\n ],\n unexpectedAffected: 0.3096,\n nSplitVTDs: 12,\n splitVTDs: [\"VTD-01\", \"VTD-02\", \"VTD-03\", \"VTD-04\", \"VTD-05\", \"VTD-06\", \"VTD-07\", \"VTD-08\", \"VTD-09\", \"VTD-10\", \"VTD-11\", \"VTD-12\"]\n },\n datasets: {},\n resources: {}\n}\n\n// TODO - PARTISAN: This category is still being fleshed out.\nlet samplePartisan: PartisanCategory = {\n score: 100,\n metrics: {\n partisanBias: 0.15,\n responsiveness: 2.0\n },\n details: {},\n datasets: {\n election: \"2016 Presidential, US Senate, Governor, and AG election results\"\n },\n resources: {\n planScore: \"https://planscore.org/plan.html?20180219T202039.596761160Z\"\n }\n}\n\n// TODO - MINORITY: This category is still being fleshed out.\nlet sampleMinority: MinorityCategory = {\n score: null,\n metrics: {\n nBlack37to50: 1,\n nBlackMajority: 12,\n nHispanic37to50: 0,\n nHispanicMajority: 0,\n nPacific37to50: 0,\n nPacificMajority: 0,\n nAsian37to50: 0,\n nAsianMajority: 0,\n nNative37to50: 0,\n nNativeMajority: 0,\n nMinority37to50: 0,\n nMinorityMajority: 0,\n\n averageDVoteShare: 0.90\n },\n details: {\n vap: true,\n comboCategories: true\n },\n datasets: {\n vap: \"2010 Voting Age Population\"\n },\n resources: {}\n}\n\nexport const samplePlanAnalytics: PlanAnalytics = {\n requirements: sampleRequirements,\n compactness: sampleCompactness,\n // TODO - Don't show these categories yet\n splitting: sampleSplitting,\n partisan: samplePartisan,\n minority: sampleMinority\n}\n\nexport function preparePlanAnalytics(s: AnalyticsSession, bLog: boolean = false): PlanAnalytics {\n if (!(s.bPostProcessingDone)) {\n doAnalyzePostProcessing(s);\n }\n\n // REQUIREMENTS CATEGORY\n let paRequirements: RequirementsCategory;\n\n {\n let completeTest = s.getTest(T.Test.Complete) as T.TestEntry;\n let contiguousTest = s.getTest(T.Test.Contiguous) as T.TestEntry;\n let freeOfHolesTest = s.getTest(T.Test.FreeOfHoles) as T.TestEntry;\n let equalPopulationTest = s.getTest(T.Test.EqualPopulation) as T.TestEntry;\n\n // Combine individual checks into an overall score\n\n // TODO - DASHBOARD: Until we add three-state support top to bottom in\n // requirements/validations, map booleans to tri-states here.\n let completeMetric = U.mapBooleanToTriState(completeTest['score'] as boolean);\n let contiguousMetric = U.mapBooleanToTriState(contiguousTest['score'] as boolean);\n let freeOfHolesMetric = U.mapBooleanToTriState(freeOfHolesTest['score'] as boolean);\n let equalPopulationMetric = U.mapBooleanToTriState(equalPopulationTest['score'] as boolean);\n\n let reqScore: T.TriState = T.TriState.Green;\n let checks = [completeMetric, contiguousMetric, freeOfHolesMetric, equalPopulationMetric];\n if (checks.includes(T.TriState.Yellow)) reqScore = T.TriState.Yellow;\n if (checks.includes(T.TriState.Red)) reqScore = T.TriState.Red;\n\n // Get values to support details entries\n let unassignedFeaturesDetail = U.deepCopy(completeTest['details']['unassignedFeatures']) || [];\n let emptyDistrictsDetail = U.deepCopy(completeTest['details']['emptyDistricts']) || [];\n let discontiguousDistrictsDetail = U.deepCopy(contiguousTest['details']['discontiguousDistricts']) || [];\n let embeddedDistrictsDetail = U.deepCopy(freeOfHolesTest['details']['embeddedDistricts']) || [];\n\n let populationDeviationDetail = U.deepCopy(equalPopulationTest['details']['deviation']);\n let deviationThresholdDetail = U.trim(s.populationDeviationThreshold());\n\n let xx: string = s.state.xx;\n // TODO - JSON: Is there a better / easier way to work with the variable?\n let stateReqsDict: T.Dict = allStateReqs;\n let reqLinkToStateReqs: string = stateReqsDict[xx];\n\n // Populate the category\n paRequirements = {\n score: reqScore,\n metrics: {\n complete: completeMetric,\n contiguous: contiguousMetric,\n freeOfHoles: freeOfHolesMetric,\n equalPopulation: equalPopulationMetric\n },\n details: {\n unassignedFeatures: unassignedFeaturesDetail,\n emptyDistricts: emptyDistrictsDetail,\n discontiguousDistricts: discontiguousDistrictsDetail,\n embeddedDistricts: embeddedDistrictsDetail,\n populationDeviation: populationDeviationDetail,\n deviationThreshold: deviationThresholdDetail\n },\n datasets: {\n census: U.deepCopy(s.config['descriptions']['CENSUS']),\n },\n resources: {\n stateReqs: reqLinkToStateReqs\n }\n }\n }\n\n // COMPACTNESS CATEGORY\n let paCompactness: CompactnessCategory;\n {\n let reockWeight = 0.5;\n let polsbyWeight = 1.0 - reockWeight;\n\n let reockTest = s.getTest(T.Test.Reock) as T.TestEntry;\n let polsbyTest = s.getTest(T.Test.PolsbyPopper) as T.TestEntry;\n\n let normalizedReock = reockTest['normalizedScore'] as number;\n let normalizedPolsby = reockTest['normalizedScore'] as number;\n let compactnessScore = U.trim((reockWeight * normalizedReock) + (polsbyWeight * normalizedPolsby), 0);\n\n let reockMetric = U.deepCopy(reockTest['score'] as number);\n let polsbyMetric = U.deepCopy(polsbyTest['score'] as number);\n\n // Populate the category\n paCompactness = {\n score: compactnessScore,\n metrics: {\n reock: reockMetric,\n polsby: polsbyMetric\n },\n details: {\n // None at this time\n },\n datasets: {\n // NOTE - DATASETS\n shapes: U.deepCopy(s.config['descriptions']['SHAPES'])\n // shapes: \"2010 VTD shapes\"\n },\n resources: {\n // None at this time\n }\n }\n }\n\n // SPLITTING CATEGORY\n\n let paSplitting: SplittingCategory\n\n {\n let unexpectedCountySplittingTest = s.getTest(T.Test.UnexpectedCountySplits) as T.TestEntry;\n let VTDSplitsTest = s.getTest(T.Test.VTDSplits) as T.TestEntry;\n let countySplittingTest = s.getTest(T.Test.CountySplitting) as T.TestEntry;\n let districtSplittingTest = s.getTest(T.Test.DistrictSplitting) as T.TestEntry;\n\n let unexpectedAffectedMetric = U.deepCopy(unexpectedCountySplittingTest['score']);\n let countiesSplitUnexpectedlyDetail = U.deepCopy(unexpectedCountySplittingTest['details']['countiesSplitUnexpectedly']);\n\n let nVTDSplitsMetric = U.deepCopy(VTDSplitsTest['score']);\n let splitVTDsDetail = U.deepCopy(VTDSplitsTest['details']['splitVTDs']);\n\n let SqEnt_DCreducedMetric = U.deepCopy(countySplittingTest['score']);\n let SqEnt_CDreducedMetric = U.deepCopy(districtSplittingTest['score']);\n\n let countySplittingNormalized = countySplittingTest['normalizedScore'] as number;\n let districtSplittingNormalized = districtSplittingTest['normalizedScore'] as number;\n let splittingScore = U.trim((S.COUNTY_SPLITTING_WEIGHT * countySplittingNormalized) +\n + (S.DISTRICT_SPLITTING_WEIGHT * districtSplittingNormalized), 0);\n\n paSplitting = {\n score: splittingScore,\n metrics: {\n sqEnt_DCreduced: SqEnt_DCreducedMetric,\n sqEnt_CDreduced: SqEnt_CDreducedMetric\n // NOTE - The un-reduced raw values\n // sqEnt_DC : SqEnt_DCMetric,\n // sqEnt_CD : SqEnt_CDMetric\n },\n details: {\n countiesSplitUnexpectedly: countiesSplitUnexpectedlyDetail,\n unexpectedAffected: unexpectedAffectedMetric,\n nSplitVTDs: nVTDSplitsMetric,\n splitVTDs: splitVTDsDetail\n },\n datasets: {\n // None at this time\n },\n resources: {\n // None at this time\n }\n }\n }\n\n // PARTISAN CATEGORY\n //\n // TODO - PARTISAN: This category is still being fleshed out. Just an example below.\n let paPartisan: PartisanCategory;\n\n {\n paPartisan = {\n score: 100,\n metrics: {\n partisanBias: 0.15,\n responsiveness: 2.0\n },\n details: {},\n datasets: {\n election: \"2016 Presidential, US Senate, Governor, and AG election results\"\n },\n resources: {\n planScore: \"https://planscore.org/plan.html?20180219T202039.596761160Z\"\n }\n }\n }\n\n // MINORITY CATEGORY\n //\n // TODO - MINORITY: This category is still being fleshed out. Just an example below.\n let paMinority: MinorityCategory;\n\n {\n paMinority = {\n score: null,\n metrics: {\n nBlack37to50: 1,\n nBlackMajority: 12,\n nHispanic37to50: 0,\n nHispanicMajority: 0,\n nPacific37to50: 0,\n nPacificMajority: 0,\n nAsian37to50: 0,\n nAsianMajority: 0,\n nNative37to50: 0,\n nNativeMajority: 0,\n nMinority37to50: 0,\n nMinorityMajority: 0,\n\n averageDVoteShare: 0.90\n },\n details: {\n vap: true,\n comboCategories: true\n },\n datasets: {\n vap: \"2010 Voting Age Population\"\n },\n resources: {}\n }\n }\n\n // PLAN ANALYTICS\n let pa: PlanAnalytics = {\n requirements: paRequirements,\n compactness: paCompactness,\n // TODO - Not implemented yet\n splitting: paSplitting,\n partisan: paPartisan,\n minority: paMinority\n }\n\n return pa;\n}\n\n\n// DISTRICT STATISTICS\n\n// Indexes for the fields in the rows of the DistrictStatistics table\nexport const enum DistrictColumn { // Column headers:\n DistrictID, // 'ID'\n TotalPop, // 'Total'\n PopDevPct, // 'Δ%'\n bEqualPop, // Don't display. Use this to conditionally color PopDevPct.\n bNotEmpty, // Don't display. TotalPop = 0 shows empty districts.\n bContiguous, // Some TBD glyph suggesting contiguity\n bNotEmbedded, // Some TBD glyph suggesting embedded\n DemPct, // 'Dem'\n RepPct, // 'Rep'\n WhitePct, // 'White'\n MinorityPct, // 'Minority'\n BlackPct, // 'Black'\n HispanicPct, // 'Hispanic'\n PacificPct, // 'Pacific'\n AsianPct, // 'Asian'\n NativePct // 'Native\n}\n\nexport type DistrictRow = [\n number, // DistrictID\n number, // TotalPop\n number, // PopDevPct\n T.TriState | null, // bEqualPop\n T.TriState | null, // bNotEmpty\n T.TriState | null, // bContiguous\n T.TriState | null, // bNotEmbedded\n number, // DemPct\n number, // RepPct\n number, // WhitePct\n number, // MinorityPct\n number, // BlackPct\n number, // HispanicPct\n number, // PacificPct\n number, // AsianPct\n number // NativePct\n];\n\nexport type DistrictStatistics = {\n table: DistrictRow[];\n details: {}; // None at this time\n datasets: T.Datasets;\n resources: {}; // None at this time\n}\n\n// Example\n\nexport const sampleDistrictStatistics: DistrictStatistics = {\n table: [\n // District 0 is the dummy unassigned district\n [0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n [1, 653133, -0.0950, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Green, 0.4177, 0.5823, 0.8631, 0.1369, 0.0734, 0.0360, 0.0009, 0.0235, 0.0064],\n [2, 620961, -0.1396, T.TriState.Green, T.TriState.Red, T.TriState.Red, T.TriState.Green, 0.8820, 0.1180, 0.3129, 0.6871, 0.6169, 0.0391, 0.0013, 0.0310, 0.0099],\n [3, 971777, 0.3465, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Green, 0.7261, 0.2739, 0.5174, 0.4826, 0.1745, 0.1572, 0.0020, 0.1531, 0.0090],\n [4, 863420, 0.1964, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Green, 0.8957, 0.1043, 0.1734, 0.8266, 0.6489, 0.1348, 0.0020, 0.0496, 0.0127],\n [5, 805029, 0.1155, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Yellow, 0.5743, 0.4257, 0.6587, 0.3413, 0.2494, 0.0363, 0.0012, 0.0536, 0.0081],\n [6, 824741, 0.1428, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Red, 0.5341, 0.4659, 0.7045, 0.2955, 0.1619, 0.0526, 0.0018, 0.0782, 0.0090],\n [7, 549714, -0.2383, T.TriState.Green, T.TriState.Green, T.TriState.Green, T.TriState.Green, 0.5025, 0.4975, 0.6906, 0.3094, 0.2468, 0.0319, 0.0013, 0.0258, 0.0111],\n [8, 484777, -0.3283, T.TriState.Green, T.TriState.Green, T.TriState.Green, T.TriState.Green, 0.4105, 0.5895, 0.8370, 0.1630, 0.1074, 0.0316, 0.0013, 0.0197, 0.0077],\n // District N+1 is the dummy state-summary district\n [9, 721694, 0.6748, T.TriState.Green, T.TriState.Red, T.TriState.Red, T.TriState.Red, 0.6293, 0.3707, 0.5722, 0.4278, 0.2925, 0.0729, 0.0015, 0.0618, 0.0093]\n ],\n details: {},\n datasets: {\n shapes: \"2010 VTD shapes\",\n census: \"2010 Census Total Population\",\n vap: \"2010 Voting Age Population\",\n election: \"2016 Presidential, US Senate, Governor, and AG election results\"\n },\n resources: {}\n}\n\n// Create a DistrictStatistics instance, deep copying the underlying values.\nexport function prepareDistrictStatistics(s: AnalyticsSession, bLog: boolean = false): DistrictStatistics {\n if (!(s.bPostProcessingDone)) {\n doAnalyzePostProcessing(s);\n }\n\n let dsTable: DistrictRow[] = [];\n for (let i = 0; i < s.districts.numberOfRows(); i++) {\n let rawRow = [\n i,\n s.districts.statistics[D.DistrictField.TotalPop][i],\n s.districts.statistics[D.DistrictField.PopDevPct][i],\n s.districts.statistics[D.DistrictField.bEqualPop][i],\n s.districts.statistics[D.DistrictField.bNotEmpty][i],\n s.districts.statistics[D.DistrictField.bContiguous][i],\n s.districts.statistics[D.DistrictField.bNotEmbedded][i],\n s.districts.statistics[D.DistrictField.DemPct][i],\n s.districts.statistics[D.DistrictField.RepPct][i],\n s.districts.statistics[D.DistrictField.WhitePct][i],\n s.districts.statistics[D.DistrictField.MinorityPct][i],\n s.districts.statistics[D.DistrictField.BlackPct][i],\n s.districts.statistics[D.DistrictField.HispanicPct][i],\n s.districts.statistics[D.DistrictField.PacificPct][i],\n s.districts.statistics[D.DistrictField.AsianPct][i],\n s.districts.statistics[D.DistrictField.NativePct][i]\n ];\n\n // TODO - DASHBOARD: Until we add three-state support top to bottom in\n // requirements/validations, map booleans to tri-states here.\n rawRow[DistrictColumn.bEqualPop] = U.mapBooleanToTriState(rawRow[DistrictColumn.bEqualPop]);\n rawRow[DistrictColumn.bNotEmpty] = U.mapBooleanToTriState(rawRow[DistrictColumn.bNotEmpty]);\n rawRow[DistrictColumn.bContiguous] = U.mapBooleanToTriState(rawRow[DistrictColumn.bContiguous]);\n rawRow[DistrictColumn.bNotEmbedded] = U.mapBooleanToTriState(rawRow[DistrictColumn.bNotEmbedded]);\n\n let readyRow: DistrictRow = U.deepCopy(rawRow);\n dsTable.push(readyRow);\n }\n\n let dsDetails = {\n // None at this time\n };\n\n let dsDatasets: T.Datasets = {\n shapes: \"2010 VTD shapes\",\n census: U.deepCopy(s.config['descriptions']['CENSUS']),\n vap: U.deepCopy(s.config['descriptions']['VAP']),\n election: U.deepCopy(s.config['descriptions']['ELECTION'])\n }\n\n let dsResources = {\n // None at this time\n };\n\n let ds: DistrictStatistics = {\n table: dsTable,\n details: dsDetails,\n datasets: dsDatasets,\n resources: dsResources\n };\n\n return ds;\n}\n\n\n// META-DATA FOR TESTS/ANALYTICS\n// \n// NOTE - This structure is a vestige of having created a metadata-driven\n// scorecard w/in district-analytics at first. It works for creating the\n// unstyled results structures, so it isn't a high priority to rationalize.\n\nenum TestType {\n PassFail,\n Percentage,\n Number\n}\n\nconst completeDefn: T.Dict = {\n ID: T.Test.Complete,\n name: \"Complete\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst contiguousDefn: T.Dict = {\n ID: T.Test.Contiguous,\n name: \"Contiguous\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst freeOfHolesDefn: T.Dict = {\n ID: T.Test.FreeOfHoles,\n name: \"Free of Holes\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst equalPopulationDefn: T.Dict = {\n ID: T.Test.EqualPopulation,\n name: \"Equal Population\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst populationDeviationDefn: T.Dict = {\n ID: T.Test.PopulationDeviation,\n name: \"Population Deviation\",\n normalize: true,\n externalType: TestType.Percentage,\n suites: [T.Suite.Legal, T.Suite.Best] // Both so EqualPopulation can be assessed\n};\n\nconst reockDefn: T.Dict = {\n ID: T.Test.Reock,\n name: \"Reock\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\nconst polsbyPopperDefn: T.Dict = {\n ID: T.Test.PolsbyPopper,\n name: \"Polsby-Popper\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst unexpectedCountySplitsDefn: T.Dict = {\n ID: T.Test.UnexpectedCountySplits,\n name: \"Unexpected County Splits\",\n normalize: false,\n externalType: TestType.Percentage,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst VTDSplitsDefn: T.Dict = {\n ID: T.Test.VTDSplits,\n name: \"VTD Splits\",\n normalize: false,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst countySplittingDefn: T.Dict = {\n ID: T.Test.CountySplitting,\n name: \"County Splitting\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst districtSplittingDefn: T.Dict = {\n ID: T.Test.DistrictSplitting,\n name: \"District Splitting\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\nconst efficiencyGapDefn: T.Dict = {\n ID: T.Test.EfficiencyGap,\n name: \"Efficiency Gap\",\n normalize: false, // TODO - Normalize this!\n externalType: TestType.Percentage,\n suites: [T.Suite.Fair]\n};\n\n// A structure to hold test definitions\ntype TestDefns = {\n [category: number]: any;\n}\n\n// All the tests that have been defined (can be reported on)\nconst testDefns = {\n [T.Test.Complete]: completeDefn,\n [T.Test.Contiguous]: contiguousDefn,\n [T.Test.FreeOfHoles]: freeOfHolesDefn,\n [T.Test.EqualPopulation]: equalPopulationDefn,\n [T.Test.PopulationDeviation]: populationDeviationDefn,\n [T.Test.Reock]: reockDefn,\n [T.Test.PolsbyPopper]: polsbyPopperDefn,\n // NOTE - SPLITTING\n [T.Test.UnexpectedCountySplits]: unexpectedCountySplitsDefn,\n [T.Test.VTDSplits]: VTDSplitsDefn,\n [T.Test.CountySplitting]: countySplittingDefn,\n [T.Test.DistrictSplitting]: districtSplittingDefn,\n\n // TODO - More tests ...\n\n [T.Test.EfficiencyGap]: efficiencyGapDefn\n} as TestDefns;\n\n\n// NORMALIZE RAW ANALYTICS\n// Raw numeric analytics, such as population deviation, compactness, etc. are\n// normalized as part of creating a scorecard, so the code to normalize results\n// is encapsulated here.\n\n// Configure scale parameters for normalizing each raw test result\n// This needs to be separate from the scorecard configuration info above,\n// because some scales need access to the analytics session object.\nexport function doConfigureScales(s: AnalyticsSession): void {\n // Scale defn for PopulationDeviation\n const CDLimit = 0.75 / 100; // Deviation threshold for CD's\n const LDLimit = 10.00 / 100; // Deviation threshold for LD's\n\n const CDGoodEnough = 0.20 / 100;\n const LDGoodEnough = (CDGoodEnough / CDLimit) * LDLimit;\n const popDevScale = (s.legislativeDistricts) ? [1.0 - LDLimit, 1.0 - LDGoodEnough] : [1.0 - CDLimit, 1.0 - CDGoodEnough];\n // const scale = [1.0 - CDLimit, 1.0 - CDGoodEnough];\n\n s.testScales[T.Test.PopulationDeviation] = { scale: popDevScale, bInvertRaw: true };\n\n s.testScales[T.Test.Reock] = { scale: [0.25, 0.50] };\n s.testScales[T.Test.PolsbyPopper] = { scale: [0.10, 0.50] };\n\n const nDistricts = s.state.nDistricts;\n const nCounties = s.counties.nCounties;\n\n // NOTE - SPLITTING: Experiment w/ this multiplier. Only allowing the expected\n // number of county splits seems too stringent, empirically. \n const allowableCountySplitsMultiplier = 1.5;\n const nAllowableSplits = Math.min(allowableCountySplitsMultiplier * (nDistricts - 1));\n const countySplittingThreshold = ((nAllowableSplits * 1.71) + ((nCounties - nAllowableSplits) * 1.0)) / nCounties;\n const countySplittingScale = [1.0, countySplittingThreshold];\n s.testScales[T.Test.CountySplitting] = { scale: countySplittingScale, bInvertScaled: true };\n\n const districtSplittingThreshold = 1.5;\n const districtSplittingScale = [1.0, districtSplittingThreshold];\n s.testScales[T.Test.DistrictSplitting] = { scale: districtSplittingScale, bInvertScaled: true };\n\n // TODO - More analytics ...\n}\n\n// Postprocess analytics - Normalize numeric results and derive secondary tests.\n// Do this after analytics have been run and before preparing a test log or scorecard. \nexport function doAnalyzePostProcessing(s: AnalyticsSession, bLog: boolean = false): void {\n // Normalize the raw scores for all the numerics tests\n let testResults = U.getNumericObjectKeys(testDefns);\n\n for (let testID of testResults) {\n if (testDefns[testID]['normalize']) {\n let testResult = s.getTest(testID) as T.TestEntry;\n\n let rawScore = testResult['score'] as number;\n let normalizedScore: number;\n\n normalizedScore = U.normalize(rawScore, s.testScales[testID]);\n testResult['normalizedScore'] = normalizedScore;\n\n // Add the scale used to normalize the raw score to the details\n testResult['details']['scale'] = s.testScales[testID].scale;\n }\n }\n\n // Derive secondary tests\n doDeriveSecondaryTests(s, bLog);\n\n // Toggle the semaphore, so postprocessing isn't for both the testlog & scorecard\n s.bPostProcessingDone = true;\n}\n\n","//\n// GLOBAL CONSTANTS\n//\n\n// Keep four decimal places for fractions [0–1], i.e.,\n// keep two decimal places for %'s [0–100].\nexport const PRECISION: number = 4;\n\n// Normalized scores [0-100]\nexport const NORMALIZED_RANGE: number = 100;\n\n// The dummy district ID for features not assigned districts yet\nexport const NOT_ASSIGNED: number = 0;\n\n// TODO - DASHBOARD: Discuss w/ Dave\n// # of items to report as problematic (e.g., features, districts, etc.)\nexport const NUMBER_OF_ITEMS_TO_REPORT: number = 10;\n\n// The virtual geoID for \"neighbors\" in other states\nexport const OUT_OF_STATE: string = \"OUT_OF_STATE\";\n\n// \"Roughly equal\" = average census block size / 2\nconst AVERAGE_BLOCK_SIZE = 30;\nexport const EQUAL_TOLERANCE: number = AVERAGE_BLOCK_SIZE / 2;\n\n// County & district splitting weights\nexport const COUNTY_SPLITTING_WEIGHT = 0.8;\nexport const DISTRICT_SPLITTING_WEIGHT = 1.0 - COUNTY_SPLITTING_WEIGHT;\n","//\n// UTILITIES\n//\n\nimport * as T from './types'\nimport * as S from './settings';\n\n// PLAN HELPERS\n\n// Is a \"neighbor\" in state?\nexport function isInState(geoID: string): boolean {\n return geoID != S.OUT_OF_STATE;\n}\n\n// Is a \"neighbor\" out of state?\nexport function isOutOfState(geoID: string): boolean {\n return geoID == S.OUT_OF_STATE;\n}\n\n// NOTE - UNASSIGNED\n// Get the districtID to which a geoID is assigned\nexport function getDistrict(plan: T.PlanByGeoID, geoID: string): number | undefined {\n // All geoIDs in a state *should be* assigned to a district (including the\n // dummy \"unassigned\" district), but \"water-only\" features are sometimes missing\n // from a map. This is also a guard against a bug in which a geoID has no district.\n if (keyExists(geoID, plan)) {\n return plan[geoID];\n }\n else {\n return undefined;\n }\n}\n\n\n// WORKING WITH GEOIDS\n\nexport function parseGeoID(geoID: string): T.GeoIDParts {\n let parts: T.GeoIDParts = {};\n\n parts['state'] = geoID.substring(0, 2);\n parts['county'] = geoID.substring(0, 5);\n\n let l: number = geoID.length;\n\n if (l >= 11) {\n parts['tract'] = geoID.substring(0, 11);\n }\n\n if (l >= 12) {\n parts['bg'] = geoID.substring(0, 12);\n }\n\n if (l == 15) {\n parts['block'] = geoID;\n }\n\n return parts;\n}\n\nexport function getFIPSFromCountyGeoID(geoID: string): string {\n return geoID.substring(2, 5);\n}\n\nexport function isWaterOnly(geoID: string): boolean {\n let waterOnlySignature = 'ZZZZZZ';\n\n if (geoID.indexOf(waterOnlySignature) >= 0) return true;\n else return false;\n}\n\n// NORMALIZING RESULTS\n\nexport function normalize(rawScore: number, testScale: T.TestScale): number {\n let rangeMin: number = testScale.scale[0];\n let rangeMax: number = testScale.scale[1];\n\n // Invert the raw value if necessary to make bigger = better\n // TODO - This works for Population Deviation, because the max is 1.0.\n // Generalize this???\n if (testScale.bInvertRaw) {\n rawScore = 1.0 - rawScore;\n }\n\n // Coerce the value to be w/in the given range\n let coercedValue = Math.min(Math.max(rawScore, rangeMin), rangeMax);\n\n // Scale the bounded value w/in the range [0 - (rangeMax - rangeMin)]\n let scaledValue = (coercedValue - rangeMin) / (rangeMax - rangeMin);\n\n // NOTE - SPLITTING\n // Invert the scaled value if necessary to make bigger = better\n if (testScale.bInvertScaled) {\n scaledValue = 1.0 - scaledValue;\n }\n\n // Finally, make the range [0-100]\n return Math.round(scaledValue * S.NORMALIZED_RANGE);\n}\n\n// Round a fractional number [0-1] to the desired level of PRECISION.\nexport function trim(fullFraction: number, digits: number | undefined = undefined): number {\n if (digits == 0) {\n return Math.round(fullFraction);\n }\n else {\n let shiftPlaces = 10 ** (digits || S.PRECISION);\n\n return Math.round(fullFraction * shiftPlaces) / shiftPlaces;\n }\n}\n\n// ARRAY HELPERS\n\nexport function sumArray(arr: number[]): number {\n return arr.reduce((a, b) => a + b, 0);\n}\n\nexport function avgArray(arr: number[]): number {\n return (arr.reduce((a, b) => a + b, 0)) / arr.length;\n}\n\nexport function minArray(arr: number[]): number {\n return Math.min(...arr);\n}\n\nexport function maxArray(arr: number[]): number {\n return Math.max(...arr);\n}\n\nexport function initArray(n: number, value: any): any[] {\n return Array.from(Array(n), () => value);\n}\n\nexport function andArray(arr: boolean[]): boolean {\n return arr.reduce(function (a, b) { return a && b; }, true);\n}\n\n// WORKING WITH OBJECT KEYS/PROPERTIES\n\n// TODO - TERRY, is this copesetic?\n// TODO - Handle integer keys?\n// Does an object have a key/property?\nexport function keyExists(k: string, o: object): boolean {\n return k in o;\n}\n\n// TODO - TERRY, can these three be combined into a generic isEmpty() check?\n// Does an object (dict) have any keys/properties?\nexport function isObjectEmpty(o: object): boolean {\n return Object.keys(o).length === 0\n}\n// Does a Set have any members?\nexport function isSetEmpty(s: any): boolean {\n return s.size === 0\n}\n// Does an array hold any items?\nexport function isArrayEmpty(a: any[]): boolean {\n if (a === undefined || a.length == 0) {\n // array empty or does not exist\n return true;\n }\n else {\n return false;\n }\n}\n\n// Get the keys for an object\nexport function getObjectKeys(o: object): string[] {\n return Object.keys(o);\n}\n\n// TODO - Convert getNumericObjectKeys() idiom to for..of where possible\nexport function getNumericObjectKeys(o: object): number[] {\n return Object.keys(o).map(Number);\n}\n\nexport function getSelectObjectKeys(o: T.Dict, v: any[]): string[] {\n let selectKeys: string[] = [];\n\n Object.keys(o).forEach(key => {\n if (arrayContains(v, o[key])) {\n selectKeys.push(key);\n }\n });\n\n return selectKeys;\n}\n\nexport function arrayContains(a: any[], item: any): boolean {\n return a.some(x => x === item);\n}\n\nexport function objectContains(o: object, key: any): boolean {\n return (key in o);\n}\n\n\n// ENUM HELPERS\n\n// Source: https://stackoverflow.com/questions/38034673/determine-the-number-of-enum-elements-typescript\nexport function countEnumValues(enumName: any): number {\n let count = 0\n for (let item in enumName) {\n if (isNaN(Number(item))) count++\n }\n return count\n}\n\n// COPYING - Copied from dra-client/util.ts\n\nexport function shallowCopy(src: any): any {\n if (Array.isArray(src))\n return src.slice();\n else if (typeof src === 'object') {\n let dst: any = {};\n for (var p in src) if (src.hasOwnProperty(p))\n dst[p] = src[p];\n return dst;\n }\n else\n return src;\n}\n\nexport function deepCopy(src: any): any {\n if (Array.isArray(src)) {\n let dst: any[] = [];\n\n for (let i: number = 0; i < src.length; i++)\n dst.push(deepCopy(src[i]));\n return dst;\n }\n else if (typeof src === 'object') {\n let dst: any = {};\n for (var p in src) if (src.hasOwnProperty(p))\n dst[p] = deepCopy(src[p]);\n return dst;\n }\n else\n return src;\n}\n\n\n// TODO - TRI-STATES: Map booleans to tri-states.\nexport function mapBooleanToTriState(bool: boolean): T.TriState {\n return (bool) ? T.TriState.Green : T.TriState.Red;\n}\n\n// TODO - TERRY: What is this the simple explanation of what this thing is doing?\nexport { depthof } from '@dra2020/util';\n","//\n// MAP/PLAN VALIDATIONS\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n//\n// COMPLETE - Are all geo's assigned to a district, and do all districts have\n// at least one geo assigned to them?\n//\n\nexport function doIsComplete(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Complete) as T.TestEntry;\n\n // Get the by-district results, including the dummy unassigned district,\n // but ignoring the N+1 summary district\n let bNotEmptyByDistrict = s.districts.statistics[D.DistrictField.bNotEmpty];\n bNotEmptyByDistrict = bNotEmptyByDistrict.slice(0, -1);\n\n // Are all features assigned to districts?\n // Check the dummy district that holds any unassigned features.\n let unassignedFeatures: string[] = [];\n let bAllAssigned = (!bNotEmptyByDistrict[S.NOT_ASSIGNED]);\n\n if (!bAllAssigned) {\n let unassignedDistrict = s.plan.geoIDsForDistrictID(S.NOT_ASSIGNED);\n unassignedFeatures = Array.from(unassignedDistrict);\n unassignedFeatures = unassignedFeatures.slice(0, S.NUMBER_OF_ITEMS_TO_REPORT);\n }\n\n // Do all real districts have at least one feature assigned to them?\n let emptyDistricts: number[] = [];\n let bNoneEmpty = true;\n bNotEmptyByDistrict = bNotEmptyByDistrict.slice(1);\n\n let districtID = 1;\n bNotEmptyByDistrict.forEach(function (bNotEmpty: boolean): void {\n if (!bNotEmpty) {\n bNoneEmpty = false;\n emptyDistricts.push(districtID);\n }\n districtID += 1;\n });\n\n // Case 1 - One or more districts are missing:\n // The # of enumerated districts minus the dummy NOT_ASSIGNED one should\n // equal the number apportioned districts. This guards against a district\n // not being included in a map that is imported.\n //\n // NOTE - I'm no longer checking for this, but DRA should!\n\n // Case 2 - Or a district is explicitly named but empty:\n // Note, this can happen if a district is created, and then all features\n // are removed from it (in DRA).\n\n // Populate the test entry\n test['score'] = bAllAssigned && bNoneEmpty;\n if (!bAllAssigned) {\n test['details']['unassignedFeatures'] = unassignedFeatures;\n }\n\n if (!bNoneEmpty) {\n test['details']['emptyDistricts'] = emptyDistricts;\n }\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bNotEmpty = s.districts.statistics[D.DistrictField.bNotEmpty];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bNotEmpty[summaryRow] = test['score'];\n\n return test;\n}\n\n//\n// CONTIGUOUS - Is each district in a plan fully connected?\n//\n// NOTE - To check \"operational contiguity,\" we need to use a graph, i.e.,\n// we can't rely on just the geometric contiguity of shapes in a shapefile.\n//\n// To test this, load the NC 2010 map 'SAMPLE-BG-map-discontiguous.csv'.\n//\n\nexport function doIsContiguous(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Contiguous) as T.TestEntry;\n\n // Get the contiguity of each district. Ignore dummy unassigned district\n // and the N+1 summary district.\n let bContiguousByDistrict = s.districts.statistics[D.DistrictField.bContiguous];\n bContiguousByDistrict = bContiguousByDistrict.slice(1, -1);\n\n // If any real districts aren't contiguous, mark the plan as not contiguous\n let bMapContiguous = U.andArray(bContiguousByDistrict);\n\n // If the map is not contiguous, log the offending districts.\n let discontiguousDistricts: number[] = [];\n let districtID = 1;\n bContiguousByDistrict.forEach(function (bDistrictContiguous: boolean): void {\n if (!bDistrictContiguous) discontiguousDistricts.push(districtID);\n districtID += 1;\n });\n\n // Populate the test entry\n test['score'] = bMapContiguous;\n if (!bMapContiguous) {\n test['details'] = { 'discontiguousDistricts': discontiguousDistricts };\n }\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bContiguous = s.districts.statistics[D.DistrictField.bContiguous];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bContiguous[summaryRow] = test['score'];\n\n return test;\n}\n\n// Are the features in a district fully connected?\nexport function isConnected(districtGeos: Set<string>, graph: D.Graph): boolean {\n // TODO - TERRY, why does this constructor need a <T> type specification?\n let visited = new Set<string>();\n let toProcess: string[] = [];\n\n // Start processing with the first geoID in the district\n let iter = districtGeos.values();\n toProcess.push(iter.next().value);\n\n // While there are geoIDs in the district that haven't been processed\n while (toProcess.length > 0) {\n // Grab a geoID and process it\n let node = toProcess.pop() as string;\n visited.add(node);\n\n // Get its actual, in-state neighbors\n let actualNeighbors = graph.peerNeighbors(node).filter(x => U.isInState(x));\n\n // Add neighbors to visit, if they're in the same district Y haven't already been visited\n let neighborsToVisit = actualNeighbors.filter(x => districtGeos.has(x) && (!visited.has(x)));\n // TODO - TERRY, is this the quickest/best way to do this?\n toProcess.push(...neighborsToVisit);\n }\n\n // Stop when you've visited all the geoIDs in the district\n return visited.size == districtGeos.size;\n}\n\n\n//\n// FREE OF HOLES - Are any districts fully embedded w/in another district?\n//\n// A district is NOT a \"donut hole\" district:\n// - If any neighbor is 'OUT_OF_STATE'; or\n// - If there are 2 or more neighboring districts.\n//\n// To test this, load the NC 2010 map 'SAMPLE-BG-map-hole.csv'. District 1,\n// Buncombe County (37021), is a donut hole w/in District 3.\n//\n// TODO - OPTIMIZE: This to take advantage of district boundary info, if/when\n// we cache one to optimize compactness.\n//\n\nexport function doIsFreeOfHoles(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.FreeOfHoles) as T.TestEntry;\n\n // Initialize values\n let bFreeOfHoles = true;\n let embeddedDistricts: number[] = [];\n\n // Get the embeddedness of each district. Ignore dummy unassigned district\n // and the N+1 summary district.\n let bNotEmbeddedByDistrict = s.districts.statistics[D.DistrictField.bNotEmbedded];\n bNotEmbeddedByDistrict = bNotEmbeddedByDistrict.slice(1, -1);\n\n let districtID = 1;\n bNotEmbeddedByDistrict.forEach(function (bDistrictNotEmbedded: boolean): void {\n if (!bDistrictNotEmbedded) {\n embeddedDistricts.push(districtID);\n bFreeOfHoles = false;\n }\n districtID += 1;\n });\n\n // Populate the test entry\n test['score'] = bFreeOfHoles;\n if (!bFreeOfHoles) {\n test['details'] = { 'embeddedDistricts': embeddedDistricts };\n }\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bNotEmbedded = s.districts.statistics[D.DistrictField.bNotEmbedded];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bNotEmbedded[summaryRow] = test['score'];\n\n return test;\n}\n\n// Test whether one district is embedded w/in any other.\nexport function isEmbedded(districtID: number, geoIDs: Set<string>, plan: D.Plan, graph: D.Graph): boolean {\n // NOTE - \"features\" here = \"geoIDs.\" These aren't \"features\" proper, just\n // identifier strings.\n let features = geoIDs;\n let planByGeo = plan.byGeoID();\n\n // Assume the district is embedded\n let bEmbedded = true;\n // Keep track of the neighoring districts\n let neighboringDistricts = new Set();\n\n // TODO - OPTIMIZE: Use just the boundary features, when available\n // Get the features for the real district\n let featuresToCheck = Array.from(features);\n\n // If the district has features, check whether it is embedded\n if (!(U.isArrayEmpty(featuresToCheck))) {\n // For each feature that needs to be checked (see above)\n for (let feature of featuresToCheck) {\n // Get its neighbors (including the virtual \"out of state\" ones)\n let neighbors = graph.peerNeighbors(feature);\n\n for (let neighbor of neighbors) {\n if (U.isOutOfState(neighbor)) {\n bEmbedded = false;\n // No need to check any more neighbors\n break;\n }\n else {\n let neighboringDistrict = U.getDistrict(planByGeo, neighbor);\n\n // Assume that a missing district assignment (= None) means that the\n // feature is \"water-only\" AND part of the state border (vs. internal)\n // and, therefore, not in the plan/map.\n\n if (neighboringDistrict == undefined) {\n bEmbedded = false;\n // No need to check any more neighbors\n break;\n }\n else {\n // TODO - OPTIMIZE: Since we're checking *all* features in a district right\n // now, not just boundary features and neighbors in other districts,\n // prune out the current district. If/when we optimize compactness\n // to cache district boundaries (as before in my Python implementation),\n // we won't have to guard adding \"neighboring\" districts in this way.\n if (neighboringDistrict != districtID) {\n neighboringDistricts.add(neighboringDistrict);\n }\n\n if (neighboringDistricts.size > 1) {\n bEmbedded = false;\n // No need to check any more neighbors\n break;\n }\n }\n }\n }\n // If a district is not embedded, there's no need to check anymore\n // border geos.\n if (!bEmbedded) {\n break;\n }\n }\n\n }\n\n return bEmbedded;\n}\n\n","//\n// A SIMPLE COMMAND-LINE INTERFACE FOR EXERCISING THE ANALYTICS & VALIDATIONS\n//\n\n/* \n\nCONFIGURATIONS\n\nThese configurations implement various CLI tests (using the commands in parens)\nw/in VS Code:\n\n* api-analyze (analyze) - Analyzes a plan and logs the results.\n\n* unit-valid (valid) - Exercises the validations.\n* unit-equal (equal) - Exercises the population deviation analytic.\n* unit-compact (compact) - Exercises the compactness analytics.\n* unit-cohesive (cohesive) - Exercises the splitting analytics.\n* unit-political (political) - Exercises the partisan analytics.\n* unit-minority (minority) - Exercises the minority analytics.\n\n* invalid-unassigned (valid) - Tests a plan w/ unassigned features.\n* invalid-missing (valid) - Tests a plan w/ a missing district.\n* invalid-empty (valid) - Tests a plan w/ an empty district.\n* invalid-discontiguous (valid) - Tests a plan w/ a discontiguous district.\n* invalid-hole (valid) - Tests a plan w/ an embedded district.\n\n\nCOMMANDS\n\nTests can also be exercised from the commmand line from the project directory.\nThis is a sample. Use \"node --inspect --inspect-brk main.js ...\" to attach a debugger.\n\n1 - Plain vanilla run:\n./main.js analyze -x NC -n 13 -p data/SAMPLE-BG-map.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n2 - Missing district:\n./main.js analyze -x NC -n 13 -p data/SAMPLE-BG-map-missing.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n3 - Empty district:\n./main.js valid -x NC -n 13 -p data/SAMPLE-BG-map.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson --empty\n\n4 - Unassigned features:\n./main.js analyze -x NC -n 13 -p data/SAMPLE-BG-map-unassigned.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n5 - Discontiguous districts:\n./main.js analyze -n 13 -p data/SAMPLE-BG-map-discontiguous.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n6 - Embedded district:\n./main.js analyze -n 13 -p data/SAMPLE-BG-map-hole.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n7 - Test using NC block-level data <<< TODO - Need BLOCK-data2.json & COUNTY.geojson to run this again.\n\ncd ~/Documents/Professional/Projects/Redistricting/DRA2020/Analytics/compact/classic/ts_sample\n./main.js analyze -v -n 13 -p SAMPLE-BLOCK-map.csv -d SAMPLE-BLOCK-data2.json -s SAMPLE-BLOCK-shapes.geojson -g SAMPLE-BLOCK-graph.json -c SAMPLE-COUNTY.geojson\n\n*/\n\n\nimport yargs from 'yargs';\n// TODO - Fix this import, so I don't have to do the 'union' workaround below.\nimport * as PC from 'polygon-clipping';\nimport * as Poly from '@dra2020/poly';\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport parse from 'csv-parse/lib/sync';\n\nimport { AnalyticsSession } from '../src/_api'\nimport { doPreprocessData } from '../src/preprocess'\nimport { doAnalyzeDistricts } from '../src/analyze'\nimport { doAnalyzePostProcessing, PlanAnalytics, DistrictStatistics, DistrictColumn } from '../src/results'\nimport { doIsComplete, doIsContiguous, doIsFreeOfHoles } from '../src/valid'\nimport { doPopulationDeviation, doHasEqualPopulations } from '../src/equal';\nimport { doReock, doPolsbyPopper } from '../src/compact';\nimport {\n doFindCountiesSplitUnexpectedly, doFindSplitVTDs,\n doCountySplitting, doDistrictSplitting\n} from '../src/cohesive';\nimport {\n doSeatsBias, doVotesBias,\n doResponsiveness, doResponsiveDistricts,\n doEfficiencyGap\n} from '../src/political';\nimport { doMajorityMinorityDistricts } from '../src/minority';\n// import { gfArea, gfPerimeter, gfDiameter } from '../src/geofeature';\n\nimport * as T from '../src/types'\nimport * as U from '../src/utils';\nimport * as S from '../src/settings';\n\nimport * as D from '../src/_data';\nimport { DistrictRow } from '../src/results';\n\n// Simulate DRA unioning district shapes in the background\nfunction addToPoly(poly: any, polys: any[]): any {\n // TODO - POLY: Fix 'poly' import, so I don't have to do this workaround.\n // return PC.union(poly, ...polys);\n let union: any = PC.union;\n if (union === undefined)\n union = PC.default.union;\n\n return union(poly, ...polys);\n}\n\n\nconsole.log(\"Starting command @ \", new Date());\n\n// COMMAND LINE\n\nlet argv = yargs\n .usage('Usage: $0 command [options]')\n .example('$0 equal -f foo.geojson', 'Calculate population deviation')\n .demandCommand(1, 'You must specify a command to execute.')\n .command('valid', 'Perform validations.')\n .command('equal', 'Calculate population deviation.')\n .command('compact', 'Calculate compactness.')\n .command('cohesive', 'Calculate cohesiveness.')\n .command('political', 'Assess fairness.')\n .command('minority', 'Count majority-minority districts.')\n .command('analyze', 'API call to analyze a plan.')\n .command('scorecard', 'Analyze plan & generate a scorecard.')\n .command('testlog', 'Analyze plan & generate a testlog.')\n .command('report', 'API call to generate a scorecard.')\n .option('state', {\n alias: 'x',\n describe: 'Specify the state.',\n type: 'string'\n })\n .option('number', {\n alias: 'n',\n describe: 'Specify the number of districts.',\n type: 'number'\n })\n .option('legislative', {\n alias: 'l',\n describe: 'Specify that districts are legislative.',\n type: 'boolean',\n default: false\n })\n .option('plan', {\n alias: 'p',\n describe: 'Specify the plan to evaluate.',\n type: 'string'\n })\n .option('data', {\n alias: 'd',\n describe: 'Specify the census & election data to use.',\n type: 'string'\n })\n .option('shapes', {\n alias: 's',\n describe: 'Specify the shapes to use.',\n type: 'string'\n })\n .option('graph', {\n alias: 'g',\n describe: 'Specify the contiguity graph to use.',\n type: 'string'\n })\n .option('counties', {\n alias: 'c',\n describe: 'Specify the FIPS-to-county-name map to use.',\n type: 'string'\n })\n .option('empty', {\n describe: 'Specify whether a district should be empty.',\n type: 'boolean',\n default: false\n })\n .option('suites', {\n describe: 'Specify the test suites to run.',\n type: 'array',\n default: []\n })\n .option('verbose', {\n alias: 'v',\n describe: 'Specify whether code should log to STDOUT.',\n type: 'boolean',\n default: false\n })\n .demandOption(['number', 'plan', 'data', 'shapes', 'counties'],\n 'Please specify all the args.')\n .help()\n .argv;\n\n\n// PROCESS COMMAND LINE ARGS\n\nlet command = argv._[0]\n\nlet xx = argv.state as string;\nlet bLegislativeDistricts = argv.legislative as boolean;\nlet nDistricts = argv.n as number;\nlet planByGeoID = readPlanCSV(argv.plan as string);\nlet graph = readJSON(argv.graph as string);\nlet data = readJSON(argv.data as string) as T.GeoFeatureCollection;\nlet counties = readJSON(argv.counties as string) as T.GeoFeatureCollection;\n\nlet shapes = readJSON(argv.shapes as string) as T.GeoFeatureCollection;\nlet bEmpty = argv.empty as boolean;\n\nlet suites = argv.suites as [];\n\n// Some default dataset keys\nlet datasetKeys = {\n SHAPES: \"2010_VD\",\n CENSUS: \"D16F\",\n VAP: \"D16T\",\n ELECTION: \"E16GPR\"\n} as D.DatasetKeys;\n\nlet datasetDescriptions = {\n SHAPES: \"2010 Voting Districts\",\n CENSUS: \"2016 ACS Total Population\",\n VAP: \"2016 ACS Voting Age Population\",\n ELECTION: \"2016 Presidential Election\",\n}\n\n// Session settings are required:\n// - Analytics suites can be defaulted to all with [], but\n// - Datasets must be explicitly specified\nlet sessionSettings = {\n 'suites': suites,\n 'datasets': datasetKeys,\n 'descriptions': datasetDescriptions\n} as T.Dict;\n\nlet bLog = argv.verbose as boolean;\n\n// Invert the plan, so you can create the district shapes for the SessionRequest.\n// NOTE - The plan here is complete (all features assigned).\nlet planByDistrictID = D.invertPlan(planByGeoID);\n\n\n// SIMULATE THE HOST\n\n// 1 - Create district shapes & extract properties (area, diameter, perimeter)\n\nconst polyOptions = {\n noLatitudeCorrection: false\n}\n\n// Index the shapes by geoID\nlet shapesByGeoID: T.GeoFeatureMap = {};\nlet idStr = \"GEOID\";\n\n// TODO - Terry: But sometimes \"GEOID10\" hasn't been set to \"GEOID\"\nlet firstFeature = shapes.features[0];\nif (!(firstFeature.properties == null)) {\n if (U.keyExists(\"GEOID10\", firstFeature.properties)) idStr = \"GEOID10\";\n}\n\nfor (let f of shapes.features) {\n if (!(f.properties == null)) {\n // let idStr = \"GEOID\";\n // TODO - Terry: Sometimes \"GEOID10\" hasn't been => to \"GEOID!\"\n // if (U.keyExists(\"GEOID10\", f.properties)) idStr = \"GEOID10\";\n let geoID = f.properties[idStr];\n shapesByGeoID[geoID] = f;\n }\n}\n\n// Find the smallest Feature\n// COPIED from dra-client/geodistrict.ts, and lightly modified\nlet geo = shapes;\nlet minFeatureArea = Poly.polyArea(geo.features[0], polyOptions);\nfor (let i = 1; i < geo.features.length; i++) {\n let a = Poly.polyArea(geo.features[i], polyOptions);\n if (a < minFeatureArea) minFeatureArea = a;\n}\n\n// Eliminate anomalous holes\n// COPIED from dra-client/geodistrict.ts, and lightly modified\n// This is a bit of a hack in the sense that it is still an open question as to whether this is a problem\n// with either the underlying shape data or a problem in our simplification of that shape data.\n// But in any case, what this does is eliminate any holes that are smaller than the smallest feature. Such\n// a hole must be an anomaly. CA/2010_VT in particular seems to have many such issues.\n\nfunction eliminateAnomalousHoles(mp: any): void {\n // Normalize to multipolygon\n if (U.depthof(mp) == 4) mp = [mp];\n\n for (let i: number = 0; i < mp.length; i++) {\n let p: any = mp[i];\n let cleanp: any[] = [p[0]];\n for (let j: number = 1; j < p.length; j++) {\n let a = Poly.polyArea(p[j], polyOptions);\n if (a >= minFeatureArea)\n cleanp.push(p[j]);\n }\n if (cleanp.length < p.length)\n mp[i] = cleanp;\n }\n}\n\n// Create district shapes\nlet districtShapes = {} as T.GeoFeatureCollection;\ndistrictShapes['type'] = \"FeatureCollection\";\ndistrictShapes['features'] = [] as T.GeoFeatureArray;\n\nfor (let districtID = 1; districtID <= nDistricts; districtID++) {\n let districtFeatures: T.GeoFeatureArray = [];\n\n // If the district is not empty, collect its Features\n // TODO - Should we generate degenerate shape, if a district is empty?\n if (planByDistrictID[districtID]) {\n planByDistrictID[districtID].forEach(function (geoID: string): void {\n districtFeatures.push(shapesByGeoID[geoID]);\n });\n\n // Union them together\n let poly1Coordinates: any = Poly.polyNormalize(districtFeatures[0], polyOptions);\n let polyNCoordinates = districtFeatures.slice(1).map((i) => Poly.polyNormalize(i, polyOptions));\n let poly = addToPoly(poly1Coordinates, polyNCoordinates);\n\n // Convert the result to a Feature\n let bPolygon: boolean = U.depthof(poly) == 4;\n if (!bPolygon && poly.length == 1) {\n bPolygon = true;\n poly = poly[0];\n }\n\n eliminateAnomalousHoles(poly);\n\n let f: any = {\n type: 'Feature',\n properties: { districtID: `${districtID}` },\n geometry: {\n type: bPolygon ? 'Polygon' : 'MultiPolygon',\n coordinates: poly\n }\n };\n districtShapes.features.push(f);\n } // End non-empty districts\n}\n\n// CONSTRUCT A SESSION REQUEST\n\nlet SessionRequest = {} as T.SessionRequest;\n\nSessionRequest['title'] = \"CLI Test\";\nSessionRequest['stateXX'] = xx;\nSessionRequest['nDistricts'] = nDistricts;\nSessionRequest['legislativeDistricts'] = bLegislativeDistricts;\nSessionRequest['data'] = data;\nSessionRequest['counties'] = counties;\nSessionRequest['graph'] = graph;\nSessionRequest['plan'] = planByGeoID;\nSessionRequest['districtShapes'] = districtShapes;\nSessionRequest['config'] = sessionSettings;\n\n// CREATE AND INITIALIZE AN ANALYTICS SESSION\n\nlet s = new AnalyticsSession(SessionRequest);\n\n\n// DISPATCH TO REQUESTED COMMAND W/ NEEDED SCAFFOLDING\nlet t: T.TestEntry;\n// let text: any;\n\nswitch (command) {\n case 'valid': {\n doPreprocessData(s);\n if (bEmpty) {\n // Make one random district empty\n let randomDistrict = Math.floor(Math.random() * s.state.nDistricts) + 1;\n let reassignFeatures = s.plan._planByDistrictID[randomDistrict];\n s.plan._planByDistrictID[S.NOT_ASSIGNED] = reassignFeatures;\n s.plan.initializeDistrict(randomDistrict);\n }\n doAnalyzeDistricts(s);\n\n let t1 = doIsComplete(s);\n let t2 = doIsContiguous(s);\n let t3 = doIsFreeOfHoles(s);\n let t4 = doPopulationDeviation(s);\n let t5 = doHasEqualPopulations(s);\n\n doAnalyzePostProcessing(s);\n\n echoTestResult(\"Complete:\", t1);\n echoTestResult(\"Contiguous:\", t2);\n echoTestResult(\"Free of holes:\", t3);\n echoTestResult(\"Population deviation (%):\", t4);\n echoTestResult(\"Equal populations:\", t5);\n\n break;\n }\n case 'equal': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n t = doPopulationDeviation(s);\n echoTestResult(\"Population deviation (%):\", t);\n\n doAnalyzePostProcessing(s);\n break;\n }\n case 'compact': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n let t1 = doReock(s, bLog);\n let t2 = doPolsbyPopper(s, bLog);\n\n doAnalyzePostProcessing(s);\n\n echoTestResult(\"Reock:\", t1);\n echoTestResult(\"Polsby-Popper:\", t2);\n\n break;\n }\n case 'cohesive': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n // NOTE - SPLITTING\n let t1 = doFindCountiesSplitUnexpectedly(s);\n let t2 = doFindSplitVTDs(s);\n let t3 = doCountySplitting(s);\n let t4 = doDistrictSplitting(s);\n\n doAnalyzePostProcessing(s);\n\n echoTestResult(\"Counties split unexpectedly:\", t1);\n echoTestResult(\"Split VTDs:\", t2);\n echoTestResult(\"County splitting:\", t3);\n echoTestResult(\"District splitting:\", t4);\n\n break;\n }\n case 'political': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n let t1 = doSeatsBias(s);\n let t2 = doVotesBias(s);\n let t3 = doResponsiveness(s);\n let t4 = doResponsiveDistricts(s);\n let t5 = doEfficiencyGap(s);\n\n doAnalyzePostProcessing(s);\n\n // echoTestResult(\"Seats Bias:\", t1); TODO\n // echoTestResult(\"Votes Bias:\", t2); TODO\n // echoTestResult(\"Responsiveness:\", t3); TODO\n // echoTestResult(\"Responsive Districts:\", t4); TODO\n echoTestResult(\"Efficiency gap (%):\", t5);\n\n break;\n }\n case 'minority': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n let t1 = doMajorityMinorityDistricts(s);\n\n doAnalyzePostProcessing(s);\n\n // echoTestResult(\"Majority-Minority Districts:\", t1); TODO\n\n break;\n }\n\n // TODO - DASHBOARD: Print the structures out\n case 'analyze': {\n s.analyzePlan(bLog);\n let planAnalytics = s.getPlanAnalytics(bLog);\n let districtStatistics = s.getDistrictStatistics(bLog);\n\n echoPlanAnalytics(planAnalytics);\n echoDistrictStatistics(districtStatistics);\n\n break;\n }\n}\n\nconsole.log(\"Ending command @ \", new Date());\n\n\n// HELPER FUNCTIONS FOR ECHOING RESULTS\n\nfunction echoTestResult(test: string, t: T.TestEntry): void {\n console.log(\"\");\n console.log(\"Test:\", test);\n console.log(\"Score:\", t['score']);\n\n let keys = U.getObjectKeys(t['details']);\n\n if (keys.length > 0) {\n console.log(\"Details:\");\n for (let i in keys) {\n let key = keys[i];\n console.log(\"-\", key, \"=\", t['details'][key]);\n }\n }\n\n console.log(\"___\");\n}\n\n// Prepare the items in a list for rendering\nfunction prepareListItems(list: any[]): string {\n if (U.isArrayEmpty(list)) {\n return \"\";\n }\n else {\n let nItems = list.length;\n let listStr: string;\n\n switch (nItems) {\n case 1: {\n listStr = list[0];\n break;\n }\n case 2: {\n listStr = list[0] + \" and \" + list[1];\n break;\n }\n default: {\n let listWithCommas = list.join(', ');\n let lastCommaIndex = listWithCommas.length - ((list[list.length - 1].length) + 1);\n let beforeAnd = listWithCommas.substr(0, lastCommaIndex);\n let afterAnd = listWithCommas.substr(lastCommaIndex + 1);\n listStr = beforeAnd + \" and \" + afterAnd;\n break;\n }\n }\n return listStr;\n }\n}\n\nfunction formatNumber(n: number): string {\n let p = S.PRECISION;\n\n return n.toLocaleString('en-US', { minimumFractionDigits: p, maximumFractionDigits: p });\n}\n\nfunction echoPlanAnalytics(pa: PlanAnalytics): void {\n console.log(\"Plan Analytics:\");\n console.log(\"\");\n\n console.log(\"Requirements:\");\n console.log(\"* Score:\", pa.requirements.score);\n console.log(\"* Metrics:\");\n console.log(\" - Complete:\", pa.requirements.metrics.complete);\n console.log(\" - Contiguous:\", pa.requirements.metrics.contiguous);\n console.log(\" - Free of holes:\", pa.requirements.metrics.freeOfHoles);\n console.log(\" - Equal population:\", pa.requirements.metrics.equalPopulation);\n console.log(\"* Details:\");\n console.log(\" - Empty districts:\", prepareListItems(pa.requirements.details.emptyDistricts));\n console.log(\" - Unassigned features:\", prepareListItems(pa.requirements.details.unassignedFeatures));\n console.log(\" - Population deviation:\", pa.requirements.details.populationDeviation);\n console.log(\" - Deviation threshold:\", pa.requirements.details.deviationThreshold);\n console.log(\" - Discontiguous districts:\", prepareListItems(pa.requirements.details.discontiguousDistricts));\n console.log(\" - Embedded districts:\", prepareListItems(pa.requirements.details.embeddedDistricts));\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.requirements.datasets.shapes);\n console.log(\"- Census:\", pa.requirements.datasets.census);\n console.log(\"- VAP:\", pa.requirements.datasets.vap);\n console.log(\"- Election:\", pa.requirements.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- State requirements:\", pa.requirements.resources.stateReqs);\n console.log(\"\");\n\n console.log(\"Compactness:\");\n console.log(\"* Score:\", pa.compactness.score);\n console.log(\"* Metrics:\");\n console.log(\" - Reock:\", pa.compactness.metrics.reock);\n console.log(\" - Polsby-Popper:\", pa.compactness.metrics.polsby);\n console.log(\"* Details:\");\n console.log(\" - N/A\");\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.compactness.datasets.shapes);\n console.log(\"- Census:\", pa.compactness.datasets.census);\n console.log(\"- VAP:\", pa.compactness.datasets.vap);\n console.log(\"- Election:\", pa.compactness.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n\n console.log(\"Splitting:\");\n console.log(\"* Score:\", pa.splitting.score);\n console.log(\"* Metrics:\");\n console.log(\" - sqEnt_DCreduced:\", pa.splitting.metrics.sqEnt_DCreduced);\n console.log(\" - sqEnt_CDreduced:\", pa.splitting.metrics.sqEnt_CDreduced);\n console.log(\"* Details:\");\n console.log(\" - countiesSplitUnexpectedly:\", prepareListItems(pa.splitting.details.countiesSplitUnexpectedly));\n console.log(\" - unexpectedAffected:\", pa.splitting.details.unexpectedAffected);\n console.log(\" - splitVTDs:\", pa.splitting.details.splitVTDs);\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.splitting.datasets.shapes);\n console.log(\"- Census:\", pa.splitting.datasets.census);\n console.log(\"- VAP:\", pa.splitting.datasets.vap);\n console.log(\"- Election:\", pa.splitting.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n\n console.log(\"Partisan:\");\n console.log(\"* Score:\", pa.partisan.score);\n console.log(\"* Metrics:\");\n console.log(\" - sqEnt_DCreduced:\", pa.partisan.metrics.partisanBias);\n console.log(\" - sqEnt_CDreduced:\", pa.partisan.metrics.responsiveness);\n console.log(\"* Details:\");\n console.log(\" - N/A\");\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.partisan.datasets.shapes);\n console.log(\"- Census:\", pa.partisan.datasets.census);\n console.log(\"- VAP:\", pa.partisan.datasets.vap);\n console.log(\"- Election:\", pa.partisan.datasets.election);\n console.log(\"* Resources:\");\n console.log(\" - Plan Score:\", pa.partisan.resources.planScore);\n console.log(\"\");\n\n console.log(\"Minority:\");\n console.log(\"* Score:\", pa.minority.score);\n console.log(\"* Metrics:\");\n console.log(\" - nBlack37to50:\", pa.minority.metrics.nBlack37to50);\n console.log(\" - nBlackMajority:\", pa.minority.metrics.nBlackMajority);\n console.log(\" - nHispanic37to50:\", pa.minority.metrics.nHispanic37to50);\n console.log(\" - nHispanicMajority:\", pa.minority.metrics.nHispanicMajority);\n console.log(\" - nPacific37to50:\", pa.minority.metrics.nPacific37to50);\n console.log(\" - nPacificMajority:\", pa.minority.metrics.nPacificMajority);\n console.log(\" - nAsian37to50:\", pa.minority.metrics.nAsian37to50);\n console.log(\" - nAsianMajority:\", pa.minority.metrics.nAsianMajority);\n console.log(\" - nNative37to50:\", pa.minority.metrics.nNative37to50);\n console.log(\" - nNativeMajority:\", pa.minority.metrics.nNativeMajority);\n console.log(\" - nMinority37to50:\", pa.minority.metrics.nMinority37to50);\n console.log(\" - nMinorityMajority:\", pa.minority.metrics.nMinorityMajority);\n console.log(\"* Details:\");\n console.log(\" - VAP:\", pa.minority.details.vap);\n console.log(\" - comboCategoroes:\", pa.minority.details.comboCategories);\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.minority.datasets.shapes);\n console.log(\"- Census:\", pa.minority.datasets.census);\n console.log(\"- VAP:\", pa.minority.datasets.vap);\n console.log(\"- Election:\", pa.minority.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n}\n\nexport function echoDistrictStatistics(ds: DistrictStatistics): void {\n console.log(\"District Statistics:\");\n for (let row of ds.table) {\n let DistrictID = row[DistrictColumn.DistrictID];\n let TotalPop = row[DistrictColumn.TotalPop];\n let PopDevPct = row[DistrictColumn.PopDevPct];\n let bEqualPop = row[DistrictColumn.bEqualPop];\n let bNotEmpty = row[DistrictColumn.bNotEmpty];\n let bContiguous = row[DistrictColumn.bContiguous];\n let bNotEmbedded = row[DistrictColumn.bNotEmbedded];\n let DemPct = row[DistrictColumn.DemPct];\n let RepPct = row[DistrictColumn.RepPct];\n let WhitePct = row[DistrictColumn.WhitePct];\n let MinorityPct = row[DistrictColumn.MinorityPct];\n let BlackPct = row[DistrictColumn.BlackPct];\n let HispanicPct = row[DistrictColumn.HispanicPct];\n let PacificPct = row[DistrictColumn.PacificPct];\n let AsianPct = row[DistrictColumn.AsianPct];\n let NativePct = row[DistrictColumn.NativePct];\n console.log(\n DistrictID,\n formatNumber(TotalPop),\n formatNumber(PopDevPct),\n bEqualPop,\n bNotEmpty,\n bContiguous,\n bNotEmbedded,\n formatNumber(DemPct),\n formatNumber(RepPct),\n formatNumber(WhitePct),\n formatNumber(MinorityPct),\n formatNumber(BlackPct),\n formatNumber(HispanicPct),\n formatNumber(PacificPct),\n formatNumber(AsianPct),\n formatNumber(NativePct)\n );\n }\n console.log(\"\");\n console.log(\"* Details:\");\n console.log(\" - N/A\");\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", ds.datasets.shapes);\n console.log(\"- Census:\", ds.datasets.census);\n console.log(\"- VAP:\", ds.datasets.vap);\n console.log(\"- Election:\", ds.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n\n}\n\n\n// HELPERS TO LOAD SAMPLE DATA FROM DISK\n\n// A clone of 'carefulRead' in DRA-CLI\nexport function readJSONcareful(file: string): any {\n try {\n let s: string = fs.readFileSync(file, 'utf8');\n let o: any = JSON.parse(s);\n return o;\n }\n catch (err) {\n console.log(\"Error reading JSON file ...\");\n return null;\n }\n}\n\nexport function readJSON(file: string): any {\n let fullPath: string;\n if (path.isAbsolute(file)) {\n fullPath = file;\n }\n else {\n fullPath = path.resolve(file);\n }\n\n return readJSONcareful(fullPath);\n}\n\n// Following the clone above, except for CSV, using the csv-parse/sync API\nexport function readCSV(file: string): any {\n try {\n let input: string = fs.readFileSync(file, 'utf8');\n let dictRows: any = parse(input, {\n columns: true,\n skip_empty_lines: true\n });\n return dictRows;\n }\n catch (err) {\n console.log(\"Error reading CSV file ...\");\n return null;\n }\n}\n\n// Read a plan from a .csv file\nexport function readPlanCSV(file: string): T.PlanByGeoID {\n var plan = {} as T.PlanByGeoID;\n\n let fullPath: string;\n if (path.isAbsolute(file)) {\n fullPath = file;\n }\n else {\n fullPath = path.resolve(file);\n }\n\n var csvArray: any = readCSV(fullPath);\n\n for (let dictRow of csvArray) {\n let geoID: string = dictRow['GEOID'];\n let districtID: number = Number(dictRow['DISTRICT']);\n\n plan[geoID] = districtID;\n }\n\n return plan;\n}\n\n\n// END\n","module.exports = require(\"assert\");","module.exports = require(\"fs\");","module.exports = require(\"path\");","module.exports = require(\"stream\");","module.exports = require(\"yargs\");"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///webpack://poly/webpack/universalModuleDefinition","webpack:///webpack://poly/webpack/bootstrap","webpack:///webpack://poly/lib/all.ts","webpack:///webpack://poly/lib/poly.ts","webpack:///webpack://poly/lib/union.ts","webpack:///webpack://poly/node_modules/polygon-clipping/dist/polygon-clipping.esm.js","webpack:///webpack://poly/node_modules/splaytree/index.js","webpack:///webpack://poly/external \"@dra2020/util\"","webpack:///webpack://util/webpack/universalModuleDefinition","webpack:///webpack://util/webpack/bootstrap","webpack:///webpack://util/lib/all.ts","webpack:///webpack://util/lib/countedhash.ts","webpack:///webpack://util/lib/indexedarray.ts","webpack:///webpack://util/lib/util.ts","webpack:///./node_modules/csv-parse/lib/ResizeableBuffer.js","webpack:///./node_modules/csv-parse/lib/index.js","webpack:///./node_modules/csv-parse/lib/sync.js","webpack:///./node_modules/polygon-clipping/dist/polygon-clipping.esm.js","webpack:///./src/_api.ts","webpack:///./src/_data.ts","webpack:///./src/analyze.ts","webpack:///./src/cohesive.ts","webpack:///./src/compact.ts","webpack:///./src/equal.ts","webpack:///./src/geofeature.ts","webpack:///./src/minority.ts","webpack:///./src/political.ts","webpack:///./src/preprocess.ts","webpack:///./src/results.ts","webpack:///./src/settings.ts","webpack:///./src/utils.ts","webpack:///./src/valid.ts","webpack:///./test/_cli.ts","webpack:///external \"assert\"","webpack:///external \"fs\"","webpack:///external \"path\"","webpack:///external \"stream\"","webpack:///external \"yargs\""],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;AClFA;AACA,IAAI,IAAyD;AAC7D;AACA,MAAM,EAKqB;AAC3B,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;AClFa;AACb;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D,SAAS,mBAAO,CAAC,6BAAQ;AACzB,SAAS,mBAAO,CAAC,+BAAS;;;;;;;;;;;;;ACNb;AACb,8CAA8C,cAAc;AAC5D,aAAa,mBAAO,CAAC,oCAAe;AACpC;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,yBAAyB;AAC5C;AACA;AACA,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA,uBAAuB,kBAAkB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,QAAQ;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;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,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kBAAkB;AAC7C,2BAA2B,kBAAkB;AAC7C,0BAA0B,4CAA4C;AACtE,6BAA6B,sEAAsE;AACnG;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C,2BAA2B;AAC3B,uBAAuB,cAAc;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,kCAAkC;AAClC,cAAc;AACd;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB;AACA;AACA,mCAAmC;AACnC,6BAA6B;AAC7B;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACjfa;AACb,8CAA8C,cAAc;AAC5D,WAAW,mBAAO,CAAC,sFAAkB;AACrC,aAAa,mBAAO,CAAC,oCAAe;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0BAA0B;AACjD;AACA;AACA;AACA;AACA,kBAAkB,+BAA+B;AACjD;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnJA;AAAA;AAAkC;;AAElC;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK,MAAM,mBAAmB,OAAO,mBAAmB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oGAAoG;;AAEpG;AACA,qDAAqD;;AAErD;AACA,qDAAqD;;AAErD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;;AAGH;AACA,+BAA+B;;AAE/B;;AAEA;AACA;AACA,GAAG;;;AAGH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,iDAAS,GAAG;;AAEhC;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC,GAAG;;;AAGJ;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qCAAqC,UAAU;AAC/C;AACA;AACA;;AAEA;;AAEA,0CAA0C,UAAU;AACpD;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iDAAiD,UAAU;AAC3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uDAAuD;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qEAAqE;AACrE,GAAG;AACH;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC,yCAAyC;;AAEzC,0DAA0D;AAC1D;;AAEA;AACA,KAAK;;AAEL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,GAAG;;AAEH;AACA;;AAEA,0DAA0D;AAC1D;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,eAAe;AACpC;AACA;;AAEA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA,sDAAsD,UAAU;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC;;;AAGzC;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA,8CAA8C;;AAE9C;AACA;AACA,qCAAqC;;AAErC;AACA,gDAAgD;AAChD;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA,6CAA6C;;AAE7C;AACA,8CAA8C;;AAE9C;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA,OAAO;AACP;AACA;;;AAGA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;;AAGP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA,8BAA8B;AAC9B;;AAEA;AACA,gCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA,iFAAiF;;AAEjF;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP,yDAAyD;;AAEzD;AACA,sCAAsC;AACtC;;AAEA,qEAAqE;AACrE;;AAEA,mCAAmC;;AAEnC,kDAAkD;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA;;AAEA,mDAAmD,UAAU;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,gDAAgD,gEAAgE;AAChH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;;AAEjD,+CAA+C,UAAU;AACzD;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,OAAO;;;AAGP;AACA;;AAEA,iDAAiD,YAAY;AAC7D,8CAA8C;;AAE9C;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;;AAEA;AACA;AACA,OAAO;;;AAGP,mDAAmD,cAAc;AACjE;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA,mCAAmC;;AAEnC;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA,4DAA4D;;AAE5D;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,uDAAuD,UAAU;AACjE;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA,yCAAyC,UAAU;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oDAAoD,UAAU;AAC9D;AACA;AACA;AACA;AACA;AACA,OAAO;;;AAGP,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,YAAY;AACvC;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC;;AAEA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,+CAA+C;;AAE/C;;AAEA,uDAAuD,UAAU;AACjE,uDAAuD;;AAEvD;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD,+CAA+C;;AAE/C;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,0CAA0C,UAAU;AACpD;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,oBAAoB,iDAAS;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA,8CAA8C;AAC9C,OAAO;;;AAGP;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA,SAAS;;;AAGT;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kEAAkE,YAAY;AAC9E;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA;AACA;AACA,mEAAmE,8DAA8D;AACjI;AACA;AACA,8DAA8D;;AAE9D;AACA,WAAW;AACX;;AAEA;AACA;;AAEA;;AAEA,iEAAiE,cAAc;AAC/E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;;AAEA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,8CAA8C,UAAU;AACxD;AACA;AACA;;;AAGA,4CAA4C,YAAY;AACxD;AACA;AACA;AACA;;;AAGA;;AAEA,8CAA8C,cAAc;AAC5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iFAAiF;AACjF;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,qDAAqD,cAAc;AACnE;;AAEA,yDAAyD,UAAU;AACnE;AACA;AACA;AACA;AACA;;;AAGA,sBAAsB,iDAAS;;AAE/B,mDAAmD,cAAc;AACjE;;AAEA,oDAAoD,YAAY;AAChE;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oDAAoD,cAAc;AAClE;AACA;AACA;;AAEA;AACA;AACA,OAAO;;;AAGP;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC,GAAG;;AAEJ;;AAEA;AACA,6FAA6F,aAAa;AAC1G;AACA;;AAEA;AACA;;AAEA;AACA,iGAAiG,eAAe;AAChH;AACA;;AAEA;AACA;;AAEA;AACA,iGAAiG,eAAe;AAChH;AACA;;AAEA;AACA;;AAEA;AACA,qGAAqG,eAAe;AACpH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEe,oEAAK,EAAC;;;;;;;;;;;;;AC1+DrB;AAAA;AAAA;AACA;AACA;;AAEA;AACA,aAAa,EAAE;AACf;;;AAGA;AACA,aAAa,EAAE;AACf;;;AAGA;AACA,aAAa,yBAAyB;AACtC;;;AAGA;AACA,aAAa,8BAA8B;AAC3C;;;AAGA;AACA,WAAW,2BAA2B;AACtC;;;AAGA;AACA,aAAa,OAAO;AACpB,cAAc,IAAI;AAClB,cAAc,OAAO;AACrB,cAAc,KAAK;AACnB,cAAc,KAAK;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,mCAAmC;;;AAGpE;AACA;AACA,WAAW,IAAI;AACf,WAAW,MAAM;AACjB,WAAW,WAAW;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,YAAY,IAAI;AAChB,YAAY,MAAM;AAClB,YAAY,WAAW;AACvB,YAAY,KAAK;AACjB,YAAY,KAAK;AACjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,YAAY,IAAI;AAChB,YAAY,MAAM;AAClB,YAAY,WAAW;AACvB,YAAY,KAAK;AACjB,YAAY,KAAK;AACjB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,WAAW,IAAI;AACf,WAAW,KAAK;AAChB,WAAW,WAAW;AACtB,WAAW,KAAK;AAChB,YAAY,KAAK;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;;AAGA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA,YAAY,KAAK;AACjB,YAAY,OAAO;AACnB,YAAY,QAAQ;AACpB,YAAY,cAAc;AAC1B,YAAY,2BAA2B;AACvC;AACA;AACA;AACA,WAAW,SAAS,EAAE,2BAA2B,EAAE,kBAAkB;AACrE;AACA;AACA;AACA;AACA;;;AAGe;;AAEf;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,IAAI;AAClB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,IAAI;AAClB,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc,IAAI;AAClB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc,QAAQ;AACtB,cAAc,GAAG;AACjB,cAAc;AACd;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,IAAI;AAClB,cAAc,IAAI;AAClB,cAAc,SAAS;AACvB,cAAc,GAAG;AACjB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;;;AAGA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,OAAO;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA,cAAc,KAAK;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;;AAGA;AACA,cAAc,KAAK;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA;AACA;AACA;;;AAGA;AACA;AACA,cAAc,WAAW;AACzB,cAAc,aAAa;AAC3B,cAAc,QAAQ;AACtB;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA,8BAA8B;AAC9B;AACA;AACA,KAAK,OAAO;AACZ;AACA;AACA,oCAAoC,mBAAmB;AACvD;AACA;AACA;;;AAGA;AACA,cAAc;AACd;AACA,aAAa,4BAA4B;;AAEzC,eAAe,mBAAmB;;;AAGlC;AACA,cAAc,aAAa;AAC3B,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,SAAS,cAAc;AACvB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,gBAAgB;AAChB;AACA,iBAAiB,iBAAiB;AAClC,kBAAkB;AAClB;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA,gBAAgB;AAChB;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,gBAAgB;AAChB;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA,kBAAkB;AAClB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,WAAW;AACX,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;AClvBA,iBAAiB,mBAAO,CAAC,gEAAe,E;;;;;;;;;;;;;;;;;ACAxC;AACA,IAAI,IAAyD;AAC7D;AACA,MAAM,EAKqB;AAC3B,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,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AC,CAAC;AAA5E,0BAA4E;AAC5E,SAAgB,OAAO,CAAC,GAAW,IAAY,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAA5E,0BAA4E;AAE5E,qCAAqC;AACrC,SAAgB,OAAO,CAAC,GAAW;IAEjC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3C,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AAC9B,CAAC;AAJD,0BAIC;;;;;;;;;;;;;;;;;;;;ACzeD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC5CA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO,YAAY,GAAG,mBAAO,CAAC,sBAAQ;AACtC,yBAAyB,mBAAO,CAAC,4EAAoB;;AAErD;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB,WAAW,IAAI,yBAAyB,UAAU;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,4BAA4B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,eAAe,kCAAkC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,gCAAgC;AAC/C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gCAAgC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kCAAkC;AACjD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,kFAAkF,+BAA+B;AACjH,KAAK;AACL,kFAAkF,sBAAsB;AACxG,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,kFAAkF,0BAA0B;AAC5G;AACA,OAAO;AACP,wEAAwE,6BAA6B;AACrG;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,sGAAsG,+BAA+B;AACrI;AACA,OAAO;AACP,6EAA6E,+BAA+B;AAC5G;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,gEAAgE,6BAA6B;AAC7F;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL,yFAAyF,wCAAwC;AACjI;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL,mFAAmF,gBAAgB;AACnG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,kCAAkC;AACjD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,mFAAmF,8BAA8B;AACjH,OAAO;AACP,mFAAmF,qBAAqB;AACxG,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,+DAA+D,4BAA4B;AAC3F;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,sEAAsE,8BAA8B;AACpG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,mFAAmF,2CAA2C;AAC9H;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,wFAAwF,gDAAgD;AACxI;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,wFAAwF,gDAAgD;AACxI;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,iFAAiF,yCAAyC;AAC1H;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,6FAA6F,qDAAqD;AAClJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,sFAAsF,8CAA8C;AACpI;AACA;AACA;AACA;AACA,KAAK;AACL,sEAAsE,8BAA8B;AACpG;AACA;AACA;AACA;AACA,KAAK;AACL,sEAAsE,8BAA8B;AACpG;AACA;AACA;AACA;AACA,KAAK;AACL,qEAAqE,6BAA6B;AAClG;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,+FAA+F,wBAAwB;AACvH;AACA,OAAO;AACP,sEAAsE,wBAAwB;AAC9F;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,oGAAoG,6BAA6B;AACjI;AACA,OAAO;AACP,2EAA2E,6BAA6B;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,uHAAuH;AAClI,SAAS,iBAAiB;AAC1B,WAAW,kDAAkD;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,0BAA0B,6BAA6B;AACvD,6BAA6B,gBAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,gBAAgB;AAC/E;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,aAAa;AACb;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,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC,yBAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,uBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE,gBAAgB;AACrF;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6HAA6H;AACxI,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD,qBAAqB,aAAa,WAAW,gBAAgB;AAC7D;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,mCAAmC,eAAe;AAClD,qBAAqB,aAAa,WAAW,gBAAgB;AAC7D;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA,eAAe,YAAY;AAC3B,+BAA+B,qCAAqC,IAAI;AACxE,gCAAgC,sBAAsB,IAAI;AAC1D;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA,eAAe,4BAA4B;AAC3C,8BAA8B,qCAAqC,IAAI;AACvE,+BAA+B,sBAAsB;AACrD;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,aAAa,eAAe;AAC5B,4BAA4B,qCAAqC,IAAI;AACrE,6BAA6B,sBAAsB;AACnD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mBAAmB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,wBAAwB;AAC3C;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6BAA6B;AACxC,WAAW,oBAAoB;AAC/B;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,kBAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,kCAAkC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA,yBAAyB,2BAA2B;AACpD;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,sBAAsB;AACjC;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,eAAe,yBAAyB,YAAY,EAAE;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,cAAc,mBAAmB;AACjC;AACA;AACA,8BAA8B;AAC9B,KAAK;AACL,8BAA8B;AAC9B,KAAK;AACL;AACA;AACA;AACA,qDAAqD,EAAE;AACvD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,eAAe,uBAAuB,eAAe,EAAE;AACvD;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC5jCA,cAAc,mBAAO,CAAC,gDAAG;;AAEzB,0CAA0C;AAC1C;AACA;AACA;AACA,iDAAiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrBA;AAAA;AAAkC;;AAElC;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK,MAAM,mBAAmB,OAAO,mBAAmB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oGAAoG;;AAEpG;AACA,qDAAqD;;AAErD;AACA,qDAAqD;;AAErD;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;;AAGH;;AAEA;AACA;AACA,GAAG;;;AAGH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,iDAAS,GAAG;;AAEhC;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC,GAAG;;;AAGJ;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC,yCAAyC;;AAEzC,0DAA0D;AAC1D;;AAEA;AACA,KAAK;;AAEL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,GAAG;;AAEH;AACA;;AAEA,0DAA0D;AAC1D;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,eAAe;AACpC;AACA;;AAEA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA,sDAAsD,UAAU;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC;;;AAGzC;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA,8CAA8C;;AAE9C;AACA;AACA,qCAAqC;;AAErC;AACA,gDAAgD;AAChD;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA,6CAA6C;;AAE7C;AACA,8CAA8C;;AAE9C;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA,OAAO;AACP;AACA;;;AAGA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;;;AAGP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA,+BAA+B;AAC/B;AACA;;AAEA;AACA,8BAA8B;AAC9B;;AAEA;AACA,gCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA;AACA,2CAA2C;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;;AAEA;AACA;AACA;AACA,iFAAiF;;AAEjF;AACA;AACA;AACA;AACA,2DAA2D;AAC3D;;AAEA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA,OAAO;;;AAGP,yDAAyD;;AAEzD;AACA,sCAAsC;AACtC;;AAEA,qEAAqE;AACrE;;AAEA,mCAAmC;;AAEnC,kDAAkD;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iGAAiG;AACjG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4BAA4B;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;;AAGP;AACA;AACA;AACA;AACA;;AAEA,mDAAmD,UAAU;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA,gDAAgD,gEAAgE;AAChH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;;AAEjD,+CAA+C,UAAU;AACzD;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,OAAO;;;AAGP;AACA;;AAEA,iDAAiD,YAAY;AAC7D,8CAA8C;;AAE9C;AACA;AACA;AACA,oDAAoD;AACpD;;AAEA;;AAEA;AACA;AACA,OAAO;;;AAGP,mDAAmD,cAAc;AACjE;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA,mCAAmC;;AAEnC;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;;AAEA,gEAAgE;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;;AAGL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU;AAC5D;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4DAA4D;;AAE5D;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,uDAAuD,UAAU;AACjE;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK,aAAa;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,uCAAuC,UAAU;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD;;AAEA,sDAAsD,UAAU;AAChE;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA,0DAA0D,UAAU;AACpE;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA,yCAAyC,UAAU;AACnD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oDAAoD,UAAU;AAC9D;AACA;AACA;AACA;AACA;AACA,OAAO;;;AAGP,2CAA2C;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,YAAY;AACvC;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA,gDAAgD,UAAU;AAC1D;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC;;AAEA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,+CAA+C;;AAE/C;;AAEA,uDAAuD,UAAU;AACjE,uDAAuD;;AAEvD;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+CAA+C,UAAU;AACzD,+CAA+C;;AAE/C;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,0CAA0C,UAAU;AACpD;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,oBAAoB,iDAAS;AAC7B;AACA;;AAEA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA,8CAA8C;AAC9C,OAAO;;;AAGP;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,+DAA+D,UAAU;AACzE;AACA;AACA;AACA;AACA,SAAS;;;AAGT;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,kEAAkE,YAAY;AAC9E;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA;AACA;AACA,mEAAmE,8DAA8D;AACjI;AACA;AACA,WAAW;AACX;;AAEA;AACA;;AAEA;;AAEA,iEAAiE,cAAc;AAC/E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;;AAEA;AACA;;AAEA,qEAAqE,cAAc;AACnF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA,GAAG;;AAEH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,8CAA8C,UAAU;AACxD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;;;AAGA;AACA;A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","file":"cli.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./test/_cli.ts\");\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"poly\"] = factory();\n\telse\n\t\troot[\"poly\"] = factory();\n})(global, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./lib/all.ts\");\n","\"use strict\";\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./poly\"));\n__export(require(\"./union\"));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Util = require(\"@dra2020/util\");\n// Internal utilities\nexports.EARTH_RADIUS = 6371000; // Radius of earth in meters\nconst DefaultOptions = {};\n// Return geographic polygon area in meters^2\nfunction polySimpleArea(p, options) {\n if (options === undefined)\n options = DefaultOptions;\n let p1;\n let p2;\n let p3;\n let dx;\n let l;\n let m;\n let u;\n let i;\n let total = 0;\n let n = p.length;\n if (n > 2) {\n for (i = 0; i < n; i++) {\n if (i === n - 2) {\n l = n - 2;\n m = n - 1;\n u = 0;\n }\n else if (i === n - 1) {\n l = n - 1;\n m = 0;\n u = 1;\n }\n else {\n l = i;\n m = i + 1;\n u = i + 2;\n }\n p1 = p[l];\n p2 = p[m];\n p3 = p[u];\n dx = (Util.deg2rad(p3[0]) - Util.deg2rad(p1[0]));\n dx *= Math.sin(Util.deg2rad(p2[1]));\n total += dx;\n }\n total *= exports.EARTH_RADIUS * exports.EARTH_RADIUS / 2;\n }\n return Math.abs(total);\n}\n// Allow bare polygon coordinates array or GeoJSON feature.\n// Normalize to multipolygon points array.\nfunction polyNormalize(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n // Convert a GeoJSON polygon or multipolygon to the raw list of points\n if (poly && poly.geometry && poly.geometry.coordinates)\n poly = poly.geometry.coordinates;\n // This is really an invalid specification but used internally to represent null polygon\n if (poly && poly.length == 0)\n return null;\n if (Util.depthof(poly) == 4)\n poly = [poly];\n return poly;\n}\nexports.polyNormalize = polyNormalize;\n// Area of geographic polygon\nfunction polyArea(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n poly = polyNormalize(poly, options);\n let a = 0;\n // MultiPolygon is a set of polygons\n for (let i = 0; poly && i < poly.length; i++) {\n // Single polygon is exterior ring with interior holes. Holes are subtracted.\n let p = poly[i];\n for (let j = 0; j < p.length; j++) {\n let sp = p[j];\n a += polySimpleArea(sp, options) * (j == 0 ? 1 : -1);\n }\n }\n return a;\n}\nexports.polyArea = polyArea;\n// Return distance in meters given two lat/lon points\nfunction haversine(x1, y1, x2, y2, options) {\n let dLat = Util.deg2rad(y2 - y1);\n let dLon = Util.deg2rad(x2 - x1);\n let c;\n // Short circuit for using simple cartesian algorithm instead of haversine\n if (options.noLatitudeCorrection)\n c = Math.sqrt((dLat * dLat) + (dLon * dLon));\n else {\n let lat1 = Util.deg2rad(y1);\n let lat2 = Util.deg2rad(y2);\n let a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);\n c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n }\n return exports.EARTH_RADIUS * c;\n}\n// Perimeter of geographic polygon in meters\nfunction polyPerimeter(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n poly = polyNormalize(poly, options);\n let perimeter = 0;\n for (let i = 0; poly && i < poly.length; i++) {\n // Ignore holes so only look at first polyline\n let p = poly[i][0];\n for (let j = 0; j < p.length - 1; j++)\n perimeter += haversine(p[j][0], p[j][1], p[j + 1][0], p[j + 1][1], options);\n if (p.length > 2 && (p[0][0] != p[p.length - 1][0] || p[0][1] != p[p.length - 1][1]))\n perimeter += haversine(p[0][0], p[0][1], p[p.length - 1][0], p[p.length - 1][1], options);\n }\n return perimeter;\n}\nexports.polyPerimeter = polyPerimeter;\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n}\nclass Circle {\n constructor(x, y, r) {\n this.x = x;\n this.y = y;\n this.r = r;\n }\n}\nexports.Circle = Circle;\n//\n// Returns the smallest circle that encloses the given polygon.\n// Runs in expected O(n) time, randomized.\n// Note: If 0 points are given, null is returned.\n// If 1 point is given, a circle of radius 0 is returned.\n//\nfunction polyToCircle(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n return makeCircle(polyToExteriorPoints(poly));\n}\nexports.polyToCircle = polyToCircle;\n//\n// Returns the circle whose perimeter is equal to the perimeter of the bounding perimeter\n// of the polygon. Use binary search to find an approximation.\n//\nfunction polyToPolsbyPopperCircle(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n let c = polyToCircle(poly, options);\n if (c == null)\n return c;\n let p = polyPerimeter(poly, options);\n c.r = (p / (2 * Math.PI)) / 111139;\n return c;\n}\nexports.polyToPolsbyPopperCircle = polyToPolsbyPopperCircle;\nfunction makeCircle(points) {\n if (points == null)\n return null;\n // Clone list to preserve the caller's data, do Durstenfeld shuffle\n let shuffled = points.slice();\n for (let i = points.length - 1; i >= 0; i--) {\n let j = Math.floor(Math.random() * (i + 1));\n j = Math.max(Math.min(j, i), 0);\n const temp = shuffled[i];\n shuffled[i] = shuffled[j];\n shuffled[j] = temp;\n }\n // Progressively add points to circle or recompute circle\n let c = null;\n shuffled.forEach((p, i) => {\n if (c === null || !isInCircle(c, p))\n c = makeCircleOnePoint(shuffled.slice(0, i + 1), p);\n });\n return c;\n}\n// One boundary point known\nfunction makeCircleOnePoint(points, p) {\n let c = new Circle(p.x, p.y, 0);\n points.forEach((q, i) => {\n if (!isInCircle(c, q)) {\n if (c.r == 0)\n c = makeDiameter(p, q);\n else\n c = makeCircleTwoPoints(points.slice(0, i + 1), p, q);\n }\n });\n return c;\n}\n// Two boundary points known\nfunction makeCircleTwoPoints(points, p, q) {\n const circ = makeDiameter(p, q);\n let left = null;\n let right = null;\n // For each point not in the two-point circle\n for (const r of points) {\n if (isInCircle(circ, r))\n continue;\n // Form a circumcircle and classify it on left or right side\n const cross = crossProduct(p.x, p.y, q.x, q.y, r.x, r.y);\n const c = makeCircumcircle(p, q, r);\n if (c === null)\n continue;\n else if (cross > 0 && (left === null || crossProduct(p.x, p.y, q.x, q.y, c.x, c.y) > crossProduct(p.x, p.y, q.x, q.y, left.x, left.y)))\n left = c;\n else if (cross < 0 && (right === null || crossProduct(p.x, p.y, q.x, q.y, c.x, c.y) < crossProduct(p.x, p.y, q.x, q.y, right.x, right.y)))\n right = c;\n }\n // Select which circle to return\n if (left === null && right === null)\n return circ;\n else if (left === null && right !== null)\n return right;\n else if (left !== null && right === null)\n return left;\n else if (left !== null && right !== null)\n return left.r <= right.r ? left : right;\n else\n throw \"Assertion error\";\n}\nfunction makeDiameter(a, b) {\n const cx = (a.x + b.x) / 2;\n const cy = (a.y + b.y) / 2;\n const r0 = Util.distance(cx, cy, a.x, a.y);\n const r1 = Util.distance(cx, cy, b.x, b.y);\n return new Circle(cx, cy, Math.max(r0, r1));\n}\nfunction makeCircumcircle(a, b, c) {\n // Mathematical algorithm from Wikipedia: Circumscribed circle\n const ox = (Math.min(a.x, b.x, c.x) + Math.max(a.x, b.x, c.x)) / 2;\n const oy = (Math.min(a.y, b.y, c.y) + Math.max(a.y, b.y, c.y)) / 2;\n const ax = a.x - ox;\n const ay = a.y - oy;\n const bx = b.x - ox;\n const by = b.y - oy;\n const cx = c.x - ox;\n const cy = c.y - oy;\n const d = (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by)) * 2;\n if (d == 0)\n return null;\n const x = ox + ((ax * ax + ay * ay) * (by - cy) + (bx * bx + by * by) * (cy - ay) + (cx * cx + cy * cy) * (ay - by)) / d;\n const y = oy + ((ax * ax + ay * ay) * (cx - bx) + (bx * bx + by * by) * (ax - cx) + (cx * cx + cy * cy) * (bx - ax)) / d;\n const ra = Util.distance(x, y, a.x, a.y);\n const rb = Util.distance(x, y, b.x, b.y);\n const rc = Util.distance(x, y, c.x, c.y);\n return new Circle(x, y, Math.max(ra, rb, rc));\n}\n/* Simple mathematical functions */\nconst MULTIPLICATIVE_EPSILON = 1 + 1e-14;\nfunction isInCircle(c, p) {\n return c !== null && Util.distance(p.x, p.y, c.x, c.y) <= c.r * MULTIPLICATIVE_EPSILON;\n}\n// Returns twice the signed area of the triangle defined by (x0, y0), (x1, y1), (x2, y2).\nfunction crossProduct(x0, y0, x1, y1, x2, y2) {\n return (x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0);\n}\n// cache x,y circle offsets for one quadrant indexed by number of segments\nlet circleOffsets = {};\nfunction getCircleOffsets(n) {\n if (circleOffsets[n] === undefined) {\n let a = [];\n let incr = (Math.PI / 2) / n;\n let theta = 0;\n let i, j;\n // Compute NE quadrant\n for (i = 0; i < n; i++, theta += incr) {\n a.push(Math.sin(theta));\n a.push(Math.cos(theta));\n }\n // Add top of circle\n a.push(0);\n a.push(1);\n // Now flip X and replicate to NW quadrant\n for (i = 0; i < n; i++) {\n j = (n - i) * 2;\n a.push(-a[j - 1]);\n a.push(a[j - 2]);\n }\n // Now flip X and Y and replicate to SW quadrant\n for (i = 0; i < n; i++) {\n j = (n - i) * 2;\n a.push(-a[j - 1]);\n a.push(-a[j - 2]);\n }\n // Add bottom of circle\n a.push(0);\n a.push(-1);\n // Now flip Y and replicate to SE quadrant\n for (i = 0; i < n; i++) {\n j = (n - i) * 2;\n a.push(a[j - 1]);\n a.push(-a[j - 2]);\n }\n // Duplicate final point per GeoJSON spec\n a.push(a[0]);\n a.push(a[1]);\n circleOffsets[n] = a;\n }\n return circleOffsets[n];\n}\n// Note that this is essentially an inversion of polyToCircle which computes a mathematical\n// circle given the point values, ignoring latitude correction. This inversion also\n// ignores that correction which means when plotted on a 2D map looks circular but the edge of\n// the circle is not a fixed distance (in physical units, e.g. meters) from the center.\n//\nfunction polyFromCircle(c, nSegments, options) {\n if (options === undefined)\n options = DefaultOptions;\n if (c === null || c.r == 0)\n return null;\n if (!nSegments || nSegments < 8)\n nSegments = 8;\n let poly = [];\n let offsets = getCircleOffsets(nSegments);\n const n = offsets.length;\n for (let i = 0; i < n; i += 2)\n poly.push([c.x + (c.r * offsets[i]), c.y + (c.r * offsets[i + 1])]);\n // return multi-polygon\n return [[poly]];\n}\nexports.polyFromCircle = polyFromCircle;\n// isLeft(): tests if a point is Left|On|Right of an infinite line.\n// Input: three points P0, P1, and P2\n// Return: >0 for P2 left of the line through P0 and P1\n// =0 for P2 on the line\n// <0 for P2 right of the line\nfunction sortPointX(a, b) { return a.x - b.x; }\nfunction sortPointY(a, b) { return a.y - b.y; }\nfunction sortPoint(a, b) { return a.x === b.x ? a.y - b.y : a.x - b.x; }\nfunction isLeft(p0, p1, p2) { return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y); }\nfunction pointsToPoly(points) {\n let p = [];\n for (let i = 0; i < points.length; i++)\n p.push([points[i].x, points[i].y]);\n return [p];\n}\nfunction polyToExteriorPoints(poly) {\n poly = polyNormalize(poly);\n if (poly == null)\n return null;\n let points = [];\n for (let i = 0; poly && i < poly.length; i++) {\n let p = poly[i][0]; // Only need exterior points, so grab exterior ring and ignore holes\n for (let j = 0; j < p.length; j++)\n points.push(new Point(p[j][0], p[j][1]));\n }\n return points;\n}\n//\n// polyConvexHull(): A.M. Andrew's monotone chain 2D convex hull algorithm\n//\nfunction polyConvexHull(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n // Normalize input\n let points = polyToExteriorPoints(poly);\n if (points == null)\n return null;\n points.sort(sortPoint);\n let H = [];\n // the output array H[] will be used as the stack\n let n = points.length;\n let i;\n let bot = 0;\n let top = -1; // indices for bottom and top of the stack\n // Get the indices of points with min x-coord and min|max y-coord\n let minmin = 0, minmax;\n let xmin = points[0].x;\n for (i = 1; i < n; i++)\n if (points[i].x != xmin)\n break;\n minmax = i - 1;\n if (minmax == n - 1) // degenerate case: all x-coords == xmin\n {\n H[++top] = points[minmin];\n if (points[minmax].y != points[minmin].y) // a nontrivial segment\n H[++top] = points[minmax];\n H[++top] = points[minmin]; // add polygon endpoint\n return pointsToPoly(H);\n }\n // Get the indices of points with max x-coord and min|max y-coord\n let maxmin, maxmax = n - 1;\n let xmax = points[n - 1].x;\n for (i = n - 2; i >= 0; i--)\n if (points[i].x != xmax)\n break;\n maxmin = i + 1;\n // Compute the lower hull on the stack H\n H[++top] = points[minmin]; // push minmin point onto stack\n i = minmax;\n while (++i <= maxmin) {\n // the lower line joins points[minmin] with points[maxmin]\n if (isLeft(points[minmin], points[maxmin], points[i]) >= 0 && i < maxmin)\n continue; // ignore points[i] above or on the lower line\n while (top > 0) // there are at least 2 points on the stack\n {\n // test if points[i] is left of the line at the stack top\n if (isLeft(H[top - 1], H[top], points[i]) > 0)\n break; // points[i] is a new hull vertex\n else\n top--; // pop top point off stack\n }\n H[++top] = points[i]; // push points[i] onto stack\n }\n // Next, compute the upper hull on the stack H above the bottom hull\n if (maxmax != maxmin) // if distinct xmax points\n H[++top] = points[maxmax]; // push maxmax point onto stack\n bot = top; // the bottom point of the upper hull stack\n i = maxmin;\n while (--i >= minmax) {\n // the upper line joins points[maxmax] with points[minmax]\n if (isLeft(points[maxmax], points[minmax], points[i]) >= 0 && i > minmax)\n continue; // ignore points[i] below or on the upper line\n while (top > bot) // at least 2 points on the upper stack\n {\n // test if points[i] is left of the line at the stack top\n if (isLeft(H[top - 1], H[top], points[i]) > 0)\n break; // points[i] is a new hull vertex\n else\n top--; // pop top point off stack\n }\n if (points[i].x == H[0].x && points[i].y == H[0].y)\n return pointsToPoly(H); // special case (mgomes)\n H[++top] = points[i]; // push points[i] onto stack\n }\n if (minmax != minmin)\n H[++top] = points[minmin]; // push joining endpoint onto stack\n return pointsToPoly(H);\n}\nexports.polyConvexHull = polyConvexHull;\nfunction polyCompactness(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n poly = polyNormalize(poly, options);\n let area = polyArea(poly, options);\n let perimeter = polyPerimeter(poly, options);\n let circle = polyToCircle(poly, options);\n let circleArea = polyArea(polyFromCircle(circle), options);\n let ppcircleArea = polyArea(polyFromCircle(polyToPolsbyPopperCircle(poly)), options);\n let hullArea = polyArea(polyConvexHull(poly), options);\n let result = { value: 0, reock: 0, polsby_popper: 0, convex_hull: 0, schwartzberg: 0 };\n if (area == 0 || circle == null || circle.r == 0)\n return result;\n result.reock = area / circleArea;\n result.polsby_popper = area / ppcircleArea;\n result.convex_hull = area / hullArea;\n result.schwartzberg = ((2 * Math.PI) * Math.sqrt(area / Math.PI)) / perimeter;\n // Weight Reock and Polsby-Popper equally, normalize in 0-100 range\n result.value = Math.trunc(((result.reock + result.polsby_popper) / 2) * 100);\n return result;\n}\nexports.polyCompactness = polyCompactness;\nconst EmptyPolyDescription = { npoly: 0, nhole: 0, npoint: 0 };\nfunction polySimpleDescribe(poly, d) {\n if (d === undefined)\n d = Util.shallowCopy(EmptyPolyDescription);\n d.npoint += npoints(poly);\n d.npoly++;\n d.nhole = poly.length - 1;\n return d;\n}\nfunction polyDescribe(poly, options) {\n if (options === undefined)\n options = DefaultOptions;\n // Support getting passed either GeoJSON feature or simply arrays of coordinates\n poly = polyNormalize(poly, options);\n let d = Util.shallowCopy(EmptyPolyDescription);\n let depth = Util.depthof(poly);\n // Multipolygon\n if (depth == 5) {\n for (let i = 0; i < poly.length; i++)\n polySimpleDescribe(poly[i], d);\n }\n // Polygon\n else if (depth == 4)\n polySimpleDescribe(poly, d);\n // Support null/undefined but other inputs are programming errors\n else if (poly != null && poly !== undefined)\n throw ('polyDescribe: argument not a polygon coordinate array');\n return d;\n}\nexports.polyDescribe = polyDescribe;\nfunction npoints(poly) {\n if (Array.isArray(poly)) {\n if (poly.length == 2 && typeof poly[0] === 'number')\n return 1;\n else {\n let n = 0;\n for (let i = 0; i < poly.length; i++)\n n += npoints(poly[i]);\n return n;\n }\n }\n else\n return 0;\n}\nexports.npoints = npoints;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst PC = require(\"polygon-clipping\");\nconst Util = require(\"@dra2020/util\");\nfunction addToPoly(poly, polys) {\n return PC.union(poly, ...polys);\n}\nfunction subFromPoly(poly, polys) {\n return PC.difference(poly, ...polys);\n}\nclass AsyncUnion {\n constructor() {\n this.onList = {};\n this.tick = this.tick.bind(this);\n this.computes = [];\n this.bTicking = false;\n }\n empty() {\n this.computes = [];\n }\n on(eventName, cb) {\n let aCB = this.onList[eventName];\n if (aCB === undefined) {\n aCB = [];\n this.onList[eventName] = aCB;\n }\n aCB.push(cb);\n }\n emit(eventName, ps) {\n let aCB = this.onList[eventName];\n if (aCB !== undefined)\n for (let i = 0; i < aCB.length; i++)\n if (ps)\n (aCB[i])(ps.key, ps.accum);\n else\n (aCB[i])();\n }\n off(eventName, cb) {\n let aCB = this.onList[eventName];\n if (aCB !== undefined)\n for (let i = 0; i < aCB.length; i++)\n if (aCB[i] === cb) {\n aCB.splice(i, 1);\n break;\n }\n }\n keepTick() {\n setTimeout(this.tick, 2);\n }\n startTick() {\n if (!this.bTicking) {\n setTimeout(this.tick, 2);\n this.bTicking = true;\n }\n }\n endTick() {\n if (this.bTicking) {\n this.bTicking = false;\n this.emit('end');\n }\n }\n tick() {\n let bMore = false;\n for (let i = 0; i < this.computes.length; i++) {\n let ps = this.computes[i];\n if (ps.toAdd.length || ps.toSub.length) {\n if (ps.toAdd.length) {\n let polys = ps.toAdd.splice(0, 40);\n ps.accum = addToPoly(ps.accum, polys);\n }\n if (ps.toSub.length) {\n let polys = ps.toSub.splice(0, 40);\n ps.accum = subFromPoly(ps.accum, polys);\n }\n if (ps.toAdd.length == 0 && ps.toSub.length == 0)\n this.emit('done', ps);\n else\n bMore = true;\n }\n }\n if (bMore)\n this.keepTick();\n else\n this.endTick();\n }\n computePoly(key, map) {\n let ps = this.findPoly(key);\n // Work to do (or at least we now want to at least emit an 'end' event)\n this.startTick();\n // If we're computing the same polygon as previously, nothing to do.\n if (Util.shallowEqual(ps.map, map)) {\n this.emit('done', ps);\n return;\n }\n // If not finished computation, start from scratch\n if (ps.toAdd.length || ps.toSub.length) {\n ps.toSub = [];\n ps.toAdd = [];\n ps.accum = null;\n ps.map = map;\n for (let id in map)\n if (map.hasOwnProperty(id)) {\n let f = map[id];\n let poly = f.geometry.coordinates;\n if (ps.accum == null)\n ps.accum = poly;\n else\n ps.toAdd.push(poly);\n }\n }\n // Finished computation, do diff\n else {\n // To add\n let id;\n let nSkipped = 0;\n for (id in map)\n if (map.hasOwnProperty(id))\n if (ps.map[id] === undefined) {\n let f = map[id];\n ps.toAdd.push(f.geometry.coordinates);\n }\n else\n nSkipped++;\n if (nSkipped > 0) {\n // To sub\n for (id in ps.map)\n if (ps.map.hasOwnProperty(id) && map[id] === undefined) {\n let f = ps.map[id];\n ps.toSub.push(f.geometry.coordinates);\n }\n }\n else\n ps.accum = ps.toAdd.splice(0, 1)[0];\n ps.map = map;\n }\n }\n findPoly(key) {\n for (let i = 0; i < this.computes.length; i++) {\n let ps = this.computes[i];\n if (Util.shallowEqual(ps.key, key))\n return ps;\n }\n let ps = { key: key, accum: null, map: {}, toAdd: [], toSub: [] };\n this.computes.push(ps);\n return ps;\n }\n}\nexports.AsyncUnion = AsyncUnion;\n","import SplayTree from 'splaytree';\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\nvar isInBbox = function isInBbox(bbox, point) {\n return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;\n};\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\n\nvar getBboxOverlap = function getBboxOverlap(b1, b2) {\n // check if the bboxes overlap at all\n if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) return null; // find the middle two X values\n\n var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;\n var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x; // find the middle two Y values\n\n var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;\n var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y; // put those middle values together to get the overlap\n\n return {\n ll: {\n x: lowerX,\n y: lowerY\n },\n ur: {\n x: upperX,\n y: upperY\n }\n };\n};\n\n/* Javascript doesn't do integer math. Everything is\n * floating point with percision Number.EPSILON.\n *\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON\n */\nvar epsilon = Number.EPSILON; // IE Polyfill\n\nif (epsilon === undefined) epsilon = Math.pow(2, -52);\nvar EPSILON_SQ = epsilon * epsilon;\n/* FLP comparator */\n\nvar cmp = function cmp(a, b) {\n // check if they're both 0\n if (-epsilon < a && a < epsilon) {\n if (-epsilon < b && b < epsilon) {\n return 0;\n }\n } // check if one is positive and the other negative\n\n\n if (a < 0 && 0 < b) return -1;\n if (b < 0 && 0 < a) return 1; // check if they're flp equal\n\n var ab = a - b;\n\n if (ab * ab < EPSILON_SQ * a * b) {\n return 0;\n } // normal comparison\n\n\n return a < b ? -1 : 1;\n};\n\n/* Cross Product of two vectors with first point at origin */\n\nvar crossProduct = function crossProduct(a, b) {\n return a.x * b.y - a.y * b.x;\n};\n/* Dot Product of two vectors with first point at origin */\n\nvar dotProduct = function dotProduct(a, b) {\n return a.x * b.x + a.y * b.y;\n};\n/* Comparator for two vectors with same starting point */\n\nvar compareVectorAngles = function compareVectorAngles(basePt, endPt1, endPt2) {\n var v1 = {\n x: endPt1.x - basePt.x,\n y: endPt1.y - basePt.y\n };\n var v2 = {\n x: endPt2.x - basePt.x,\n y: endPt2.y - basePt.y\n };\n var kross = crossProduct(v1, v2);\n return cmp(kross, 0);\n};\nvar length = function length(v) {\n return Math.sqrt(dotProduct(v, v));\n};\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar sineOfAngle = function sineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar cosineOfAngle = function cosineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the closest point on an line (defined by two points)\n * to another point. */\n\nvar closestPoint = function closestPoint(ptA1, ptA2, ptB) {\n if (ptA1.x === ptA2.x) return {\n x: ptA1.x,\n y: ptB.y // vertical vector\n\n };\n if (ptA1.y === ptA2.y) return {\n x: ptB.x,\n y: ptA1.y // horizontal vector\n // determinne which point is further away\n // we use the further point as our base in the calculation, so that the\n // vectors are more parallel, providing more accurate dot product\n\n };\n var v1 = {\n x: ptB.x - ptA1.x,\n y: ptB.y - ptA1.y\n };\n var v2 = {\n x: ptB.x - ptA2.x,\n y: ptB.y - ptA2.y\n };\n var vFar, vA, farPt;\n\n if (dotProduct(v1, v1) > dotProduct(v2, v2)) {\n vFar = v1;\n vA = {\n x: ptA2.x - ptA1.x,\n y: ptA2.y - ptA1.y\n };\n farPt = ptA1;\n } else {\n vFar = v2;\n vA = {\n x: ptA1.x - ptA2.x,\n y: ptA1.y - ptA2.y\n };\n farPt = ptA2;\n }\n\n var dist = dotProduct(vA, vFar) / dotProduct(vA, vA);\n return {\n x: farPt.x + dist * vA.x,\n y: farPt.y + dist * vA.y\n };\n};\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar horizontalIntersection = function horizontalIntersection(pt, v, y) {\n if (v.y === 0) return null;\n return {\n x: pt.x + v.x / v.y * (y - pt.y),\n y: y\n };\n};\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar verticalIntersection = function verticalIntersection(pt, v, x) {\n if (v.x === 0) return null;\n return {\n x: x,\n y: pt.y + v.y / v.x * (x - pt.x)\n };\n};\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar intersection = function intersection(pt1, v1, pt2, v2) {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x);\n if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x);\n if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y);\n if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y); // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n var kross = crossProduct(v1, v2);\n if (kross == 0) return null;\n var ve = {\n x: pt2.x - pt1.x,\n y: pt2.y - pt1.y\n };\n var d1 = crossProduct(ve, v1) / kross;\n var d2 = crossProduct(ve, v2) / kross; // take the average of the two calculations to minimize rounding error\n\n var x1 = pt1.x + d2 * v1.x,\n x2 = pt2.x + d1 * v2.x;\n var y1 = pt1.y + d2 * v1.y,\n y2 = pt2.y + d1 * v2.y;\n var x = (x1 + x2) / 2;\n var y = (y1 + y2) / 2;\n return {\n x: x,\n y: y\n };\n};\n\n/**\n * This class rounds incoming values sufficiently so that\n * floating points problems are, for the most part, avoided.\n *\n * Incoming points are have their x & y values tested against\n * all previously seen x & y values. If either is 'too close'\n * to a previously seen value, it's value is 'snapped' to the\n * previously seen value.\n *\n * All points should be rounded by this class before being\n * stored in any data structures in the rest of this algorithm.\n */\n\nvar PtRounder =\n/*#__PURE__*/\nfunction () {\n function PtRounder() {\n _classCallCheck(this, PtRounder);\n\n this.reset();\n }\n\n _createClass(PtRounder, [{\n key: \"reset\",\n value: function reset() {\n this.xRounder = new CoordRounder();\n this.yRounder = new CoordRounder();\n }\n }, {\n key: \"round\",\n value: function round(x, y) {\n return {\n x: this.xRounder.round(x),\n y: this.yRounder.round(y)\n };\n }\n }]);\n\n return PtRounder;\n}();\n\nvar CoordRounder =\n/*#__PURE__*/\nfunction () {\n function CoordRounder() {\n _classCallCheck(this, CoordRounder);\n\n this.tree = new SplayTree(); // preseed with 0 so we don't end up with values < Number.EPSILON\n\n this.round(0);\n } // Note: this can rounds input values backwards or forwards.\n // You might ask, why not restrict this to just rounding\n // forwards? Wouldn't that allow left endpoints to always\n // remain left endpoints during splitting (never change to\n // right). No - it wouldn't, because we snap intersections\n // to endpoints (to establish independence from the segment\n // angle for t-intersections).\n\n\n _createClass(CoordRounder, [{\n key: \"round\",\n value: function round(coord) {\n var node = this.tree.add(coord);\n var prevNode = this.tree.prev(node);\n\n if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {\n this.tree.remove(coord);\n return prevNode.key;\n }\n\n var nextNode = this.tree.next(node);\n\n if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {\n this.tree.remove(coord);\n return nextNode.key;\n }\n\n return coord;\n }\n }]);\n\n return CoordRounder;\n}(); // singleton available by import\n\n\nvar rounder = new PtRounder();\n\n/* Given input geometry as a standard array-of-arrays geojson-style\n * geometry, return one that uses objects as points, for better perf */\n\nvar pointsAsObjects = function pointsAsObjects(geom) {\n // we can handle well-formed multipolys and polys\n var output = [];\n\n if (!Array.isArray(geom)) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n for (var i = 0, iMax = geom.length; i < iMax; i++) {\n if (!Array.isArray(geom[i]) || geom[i].length == 0) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n output.push([]);\n\n for (var j = 0, jMax = geom[i].length; j < jMax; j++) {\n if (!Array.isArray(geom[i][j]) || geom[i][j].length == 0) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n if (Array.isArray(geom[i][j][0])) {\n // multipolygon\n output[i].push([]);\n\n for (var k = 0, kMax = geom[i][j].length; k < kMax; k++) {\n if (!Array.isArray(geom[i][j][k]) || geom[i][j][k].length < 2) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n if (geom[i][j][k].length > 2) {\n throw new Error('Input has more than two coordinates. ' + 'Only 2-dimensional polygons supported.');\n }\n\n output[i][j].push(rounder.round(geom[i][j][k][0], geom[i][j][k][1]));\n }\n } else {\n // polygon\n if (geom[i][j].length < 2) {\n throw new Error('Input is not a Polygon or MultiPolygon');\n }\n\n if (geom[i][j].length > 2) {\n throw new Error('Input has more than two coordinates. ' + 'Only 2-dimensional polygons supported.');\n }\n\n output[i].push(rounder.round(geom[i][j][0], geom[i][j][1]));\n }\n }\n }\n\n return output;\n};\n/* WARN: input modified directly */\n\nvar forceMultiPoly = function forceMultiPoly(geom) {\n if (Array.isArray(geom)) {\n if (geom.length === 0) return; // allow empty multipolys\n\n if (Array.isArray(geom[0])) {\n if (Array.isArray(geom[0][0])) {\n if (typeof geom[0][0][0].x === 'number' && typeof geom[0][0][0].y === 'number') {\n // multipolygon\n return;\n }\n }\n\n if (typeof geom[0][0].x === 'number' && typeof geom[0][0].y === 'number') {\n // polygon\n geom.unshift(geom.splice(0));\n return;\n }\n }\n }\n\n throw new Error('Unrecognized input - not a polygon nor multipolygon');\n};\n/* WARN: input modified directly */\n\nvar cleanMultiPoly = function cleanMultiPoly(multipoly) {\n var i = 0;\n\n while (i < multipoly.length) {\n var poly = multipoly[i];\n\n if (poly.length === 0) {\n multipoly.splice(i, 1);\n continue;\n }\n\n var exteriorRing = poly[0];\n cleanRing(exteriorRing); // poly is dropped if exteriorRing is degenerate\n\n if (exteriorRing.length === 0) {\n multipoly.splice(i, 1);\n continue;\n }\n\n var j = 1;\n\n while (j < poly.length) {\n var interiorRing = poly[j];\n cleanRing(interiorRing);\n if (interiorRing.length === 0) poly.splice(j, 1);else j++;\n }\n\n i++;\n }\n};\n/* Clean ring:\n * - remove duplicate points\n * - remove colinear points\n * - remove rings with no area (less than 3 distinct points)\n * - un-close rings (last point should not repeat first)\n *\n * WARN: input modified directly */\n\nvar cleanRing = function cleanRing(ring) {\n if (ring.length === 0) return;\n var firstPt = ring[0];\n var lastPt = ring[ring.length - 1];\n if (firstPt.x === lastPt.x && firstPt.y === lastPt.y) ring.pop();\n\n var isPointUncessary = function isPointUncessary(prevPt, pt, nextPt) {\n return prevPt.x === pt.x && prevPt.y === pt.y || nextPt.x === pt.x && nextPt.y === pt.y || compareVectorAngles(pt, prevPt, nextPt) === 0;\n };\n\n var i = 0;\n var prevPt, nextPt;\n\n while (i < ring.length) {\n prevPt = i === 0 ? ring[ring.length - 1] : ring[i - 1];\n nextPt = i === ring.length - 1 ? ring[0] : ring[i + 1];\n if (isPointUncessary(prevPt, ring[i], nextPt)) ring.splice(i, 1);else i++;\n } // if our ring has less than 3 distinct points now (so is degenerate)\n // shrink it down to the empty array to communicate to our caller to\n // drop it\n\n\n while (ring.length < 3 && ring.length > 0) {\n ring.pop();\n }\n};\n\nvar SweepEvent =\n/*#__PURE__*/\nfunction () {\n _createClass(SweepEvent, null, [{\n key: \"compare\",\n // for ordering sweep events in the sweep event queue\n value: function compare(a, b) {\n // favor event with a point that the sweep line hits first\n var ptCmp = SweepEvent.comparePoints(a.point, b.point);\n if (ptCmp !== 0) return ptCmp; // the points are the same, so link them if needed\n\n if (a.point !== b.point) a.link(b); // favor right events over left\n\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1; // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n\n return Segment.compare(a.segment, b.segment);\n } // for ordering points in sweep line order\n\n }, {\n key: \"comparePoints\",\n value: function comparePoints(aPt, bPt) {\n if (aPt.x < bPt.x) return -1;\n if (aPt.x > bPt.x) return 1;\n if (aPt.y < bPt.y) return -1;\n if (aPt.y > bPt.y) return 1;\n return 0;\n } // Warning: 'point' input will be modified and re-used (for performance)\n\n }]);\n\n function SweepEvent(point, isLeft) {\n _classCallCheck(this, SweepEvent);\n\n if (point.events === undefined) point.events = [this];else point.events.push(this);\n this.point = point;\n this.isLeft = isLeft; // this.segment, this.otherSE set by factory\n }\n\n _createClass(SweepEvent, [{\n key: \"link\",\n value: function link(other) {\n if (other.point === this.point) {\n throw new Error('Tried to link already linked events');\n }\n\n var otherEvents = other.point.events;\n\n for (var i = 0, iMax = otherEvents.length; i < iMax; i++) {\n var evt = otherEvents[i];\n this.point.events.push(evt);\n evt.point = this.point;\n }\n\n this.checkForConsuming();\n }\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n\n }, {\n key: \"checkForConsuming\",\n value: function checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n // Compare each pair of events to see if other events also match\n var numEvents = this.point.events.length;\n\n for (var i = 0; i < numEvents; i++) {\n var evt1 = this.point.events[i];\n if (evt1.segment.consumedBy !== undefined) continue;\n\n for (var j = i + 1; j < numEvents; j++) {\n var evt2 = this.point.events[j];\n if (evt2.consumedBy !== undefined) continue;\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue;\n evt1.segment.consume(evt2.segment);\n }\n }\n }\n }, {\n key: \"getAvailableLinkedEvents\",\n value: function getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n var events = [];\n\n for (var i = 0, iMax = this.point.events.length; i < iMax; i++) {\n var evt = this.point.events[i];\n\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt);\n }\n }\n\n return events;\n }\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n\n }, {\n key: \"getLeftmostComparator\",\n value: function getLeftmostComparator(baseEvent) {\n var _this = this;\n\n var cache = new Map();\n\n var fillCache = function fillCache(linkedEvent) {\n var nextEvent = linkedEvent.otherSE;\n cache.set(linkedEvent, {\n sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)\n });\n };\n\n return function (a, b) {\n if (!cache.has(a)) fillCache(a);\n if (!cache.has(b)) fillCache(b);\n\n var _cache$get = cache.get(a),\n asine = _cache$get.sine,\n acosine = _cache$get.cosine;\n\n var _cache$get2 = cache.get(b),\n bsine = _cache$get2.sine,\n bcosine = _cache$get2.cosine; // both on or above x-axis\n\n\n if (asine >= 0 && bsine >= 0) {\n if (acosine < bcosine) return 1;\n if (acosine > bcosine) return -1;\n return 0;\n } // both below x-axis\n\n\n if (asine < 0 && bsine < 0) {\n if (acosine < bcosine) return -1;\n if (acosine > bcosine) return 1;\n return 0;\n } // one above x-axis, one below\n\n\n if (bsine < asine) return -1;\n if (bsine > asine) return 1;\n return 0;\n };\n }\n }]);\n\n return SweepEvent;\n}();\n\n// segments and sweep events when all else is identical\n\nvar segmentId = 0;\n\nvar Segment =\n/*#__PURE__*/\nfunction () {\n _createClass(Segment, null, [{\n key: \"compare\",\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n value: function compare(a, b) {\n var alx = a.leftSE.point.x;\n var blx = b.leftSE.point.x;\n var arx = a.rightSE.point.x;\n var brx = b.rightSE.point.x; // check if they're even in the same vertical plane\n\n if (brx < alx) return 1;\n if (arx < blx) return -1;\n var aly = a.leftSE.point.y;\n var bly = b.leftSE.point.y;\n var ary = a.rightSE.point.y;\n var bry = b.rightSE.point.y; // is left endpoint of segment B the right-more?\n\n if (alx < blx) {\n // are the two segments in the same horizontal plane?\n if (bly < aly && bly < ary) return 1;\n if (bly > aly && bly > ary) return -1; // is the B left endpoint colinear to segment A?\n\n var aCmpBLeft = a.comparePoint(b.leftSE.point);\n if (aCmpBLeft < 0) return 1;\n if (aCmpBLeft > 0) return -1; // is the A right endpoint colinear to segment B ?\n\n var bCmpARight = b.comparePoint(a.rightSE.point);\n if (bCmpARight !== 0) return bCmpARight; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return -1;\n } // is left endpoint of segment A the right-more?\n\n\n if (alx > blx) {\n if (aly < bly && aly < bry) return -1;\n if (aly > bly && aly > bry) return 1; // is the A left endpoint colinear to segment B?\n\n var bCmpALeft = b.comparePoint(a.leftSE.point);\n if (bCmpALeft !== 0) return bCmpALeft; // is the B right endpoint colinear to segment A?\n\n var aCmpBRight = a.comparePoint(b.rightSE.point);\n if (aCmpBRight < 0) return 1;\n if (aCmpBRight > 0) return -1; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return 1;\n } // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n // consider the lower left-endpoint to come first\n\n\n if (aly < bly) return -1;\n if (aly > bly) return 1; // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n // is the A right endpoint more left-more?\n\n if (arx < brx) {\n var _bCmpARight = b.comparePoint(a.rightSE.point);\n\n if (_bCmpARight !== 0) return _bCmpARight;\n } // is the B right endpoint more left-more?\n\n\n if (arx > brx) {\n var _aCmpBRight = a.comparePoint(b.rightSE.point);\n\n if (_aCmpBRight < 0) return 1;\n if (_aCmpBRight > 0) return -1;\n }\n\n if (arx !== brx) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n var ay = ary - aly;\n var ax = arx - alx;\n var by = bry - bly;\n var bx = brx - blx;\n if (ay > ax && by < bx) return 1;\n if (ay < ax && by > bx) return -1;\n } // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n\n\n if (arx > brx) return 1;\n if (arx < brx) return -1; // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n // consider the lower right-endpoint to come first\n\n if (ary < bry) return -1;\n if (ary > bry) return 1; // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1; // identical segment, ie a === b\n\n return 0;\n }\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n\n }]);\n\n function Segment(leftSE, rightSE, rings, windings) {\n _classCallCheck(this, Segment);\n\n this.id = ++segmentId;\n this.leftSE = leftSE;\n leftSE.segment = this;\n leftSE.otherSE = rightSE;\n this.rightSE = rightSE;\n rightSE.segment = this;\n rightSE.otherSE = leftSE;\n this.rings = rings;\n this.windings = windings; // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n _createClass(Segment, [{\n key: \"replaceRightSE\",\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n value: function replaceRightSE(newRightSE) {\n this.rightSE = newRightSE;\n this.rightSE.segment = this;\n this.rightSE.otherSE = this.leftSE;\n this.leftSE.otherSE = this.rightSE;\n }\n }, {\n key: \"bbox\",\n value: function bbox() {\n var y1 = this.leftSE.point.y;\n var y2 = this.rightSE.point.y;\n return {\n ll: {\n x: this.leftSE.point.x,\n y: y1 < y2 ? y1 : y2\n },\n ur: {\n x: this.rightSE.point.x,\n y: y1 > y2 ? y1 : y2\n }\n };\n }\n /* A vector from the left point to the right */\n\n }, {\n key: \"vector\",\n value: function vector() {\n return {\n x: this.rightSE.point.x - this.leftSE.point.x,\n y: this.rightSE.point.y - this.leftSE.point.y\n };\n }\n }, {\n key: \"isAnEndpoint\",\n value: function isAnEndpoint(pt) {\n return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;\n }\n /* Compare this segment with a point. Return value indicates:\n * 1: point lies above or to the left of segment\n * 0: point is colinear to segment\n * -1: point is below or to the right of segment */\n\n }, {\n key: \"comparePoint\",\n value: function comparePoint(point) {\n if (this.isAnEndpoint(point)) return 0;\n var interPt = closestPoint(this.leftSE.point, this.rightSE.point, point); // use cmp() to do the same rounding as would apply in rounder.round\n // but avoid using rounder.round for performance boost, and to avoid\n // saving the result in the rounding trees\n // also, there is a fair amount of rounding error introduced when computing\n // the closestPoint to a nearly vertical or horizontal segment. Thus, we use\n // the more accurate coordinate for comparison of the two points\n\n var lx = this.leftSE.point.x;\n var ly = this.leftSE.point.y;\n var rx = this.rightSE.point.x;\n var ry = this.rightSE.point.y; // is the segment upward sloping?\n\n if (ry >= ly) {\n // is the segment more vertical?\n if (ry - ly > rx - lx) {\n // use the X coordinate\n var cmpX = cmp(interPt.x, point.x);\n if (cmpX != 0) return cmpX;\n } else {\n // segment is more horizontal, so use Y coord\n var cmpY = cmp(point.y, interPt.y);\n if (cmpY != 0) return cmpY;\n }\n } else {\n // segment is more downward sloping\n // is the segment more vertical?\n if (ly - ry > rx - lx) {\n // use the X coordinate\n var _cmpX = cmp(point.x, interPt.x);\n\n if (_cmpX != 0) return _cmpX;\n } else {\n // segment is more horizontal, so use the Y coordinate\n var _cmpY = cmp(point.y, interPt.y);\n\n if (_cmpY != 0) return _cmpY;\n }\n } // on the line\n\n\n return 0;\n }\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n\n }, {\n key: \"getIntersection\",\n value: function getIntersection(other) {\n // If bboxes don't overlap, there can't be any intersections\n var tBbox = this.bbox();\n var oBbox = other.bbox();\n var bboxOverlap = getBboxOverlap(tBbox, oBbox);\n if (bboxOverlap === null) return null; // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n var tlp = this.leftSE.point;\n var trp = this.rightSE.point;\n var olp = other.leftSE.point;\n var orp = other.rightSE.point; // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n\n var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;\n var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;\n var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;\n var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0; // do left endpoints match?\n\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp;\n if (!touchesThisRSE && touchesOtherRSE) return orp; // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n\n return null;\n } // does this left endpoint matches (other doesn't)\n\n\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x === orp.x && tlp.y === orp.y) return null;\n } // t-intersection on left endpoint\n\n\n return tlp;\n } // does other left endpoint matches (this doesn't)\n\n\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x === olp.x && trp.y === olp.y) return null;\n } // t-intersection on left endpoint\n\n\n return olp;\n } // trivial intersection on right endpoints\n\n\n if (touchesThisRSE && touchesOtherRSE) return null; // t-intersections on just one right endpoint\n\n if (touchesThisRSE) return trp;\n if (touchesOtherRSE) return orp; // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n\n var pt = intersection(tlp, this.vector(), olp, other.vector()); // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n\n if (pt === null) return null; // is the intersection found between the lines not on the segments?\n\n if (!isInBbox(bboxOverlap, pt)) return null; // round the the computed point if needed\n\n return rounder.round(pt.x, pt.y);\n }\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n\n }, {\n key: \"split\",\n value: function split(point) {\n var newEvents = [];\n var alreadyLinked = point.events !== undefined;\n var newLeftSE = new SweepEvent(point, true);\n var newRightSE = new SweepEvent(point, false);\n var oldRightSE = this.rightSE;\n this.replaceRightSE(newRightSE);\n newEvents.push(newRightSE);\n newEvents.push(newLeftSE);\n var newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice()); // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n\n if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {\n newSeg.swapEvents();\n }\n\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents();\n } // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n\n\n if (alreadyLinked) {\n newLeftSE.checkForConsuming();\n newRightSE.checkForConsuming();\n }\n\n return newEvents;\n }\n /* Swap which event is left and right */\n\n }, {\n key: \"swapEvents\",\n value: function swapEvents() {\n var tmpEvt = this.rightSE;\n this.rightSE = this.leftSE;\n this.leftSE = tmpEvt;\n this.leftSE.isLeft = true;\n this.rightSE.isLeft = false;\n\n for (var i = 0, iMax = this.windings.length; i < iMax; i++) {\n this.windings[i] *= -1;\n }\n }\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n\n }, {\n key: \"consume\",\n value: function consume(other) {\n var consumer = this;\n var consumee = other;\n\n while (consumer.consumedBy) {\n consumer = consumer.consumedBy;\n }\n\n while (consumee.consumedBy) {\n consumee = consumee.consumedBy;\n }\n\n var cmp$$1 = Segment.compare(consumer, consumee);\n if (cmp$$1 === 0) return; // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n\n if (cmp$$1 > 0) {\n var tmp = consumer;\n consumer = consumee;\n consumee = tmp;\n } // make sure a segment doesn't consume it's prev\n\n\n if (consumer.prev === consumee) {\n var _tmp = consumer;\n consumer = consumee;\n consumee = _tmp;\n }\n\n for (var i = 0, iMax = consumee.rings.length; i < iMax; i++) {\n var ring = consumee.rings[i];\n var winding = consumee.windings[i];\n var index = consumer.rings.indexOf(ring);\n\n if (index === -1) {\n consumer.rings.push(ring);\n consumer.windings.push(winding);\n } else consumer.windings[index] += winding;\n }\n\n consumee.rings = null;\n consumee.windings = null;\n consumee.consumedBy = consumer; // mark sweep events consumed as to maintain ordering in sweep event queue\n\n consumee.leftSE.consumedBy = consumer.leftSE;\n consumee.rightSE.consumedBy = consumer.rightSE;\n }\n /* The first segment previous segment chain that is in the result */\n\n }, {\n key: \"prevInResult\",\n value: function prevInResult() {\n if (this._prevInResult !== undefined) return this._prevInResult;\n if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult();\n return this._prevInResult;\n }\n }, {\n key: \"beforeState\",\n value: function beforeState() {\n if (this._beforeState !== undefined) return this._beforeState;\n if (!this.prev) this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: []\n };else {\n var seg = this.prev.consumedBy || this.prev;\n this._beforeState = seg.afterState();\n }\n return this._beforeState;\n }\n }, {\n key: \"afterState\",\n value: function afterState() {\n if (this._afterState !== undefined) return this._afterState;\n var beforeState = this.beforeState();\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: []\n };\n var ringsAfter = this._afterState.rings;\n var windingsAfter = this._afterState.windings;\n var mpsAfter = this._afterState.multiPolys; // calculate ringsAfter, windingsAfter\n\n for (var i = 0, iMax = this.rings.length; i < iMax; i++) {\n var ring = this.rings[i];\n var winding = this.windings[i];\n var index = ringsAfter.indexOf(ring);\n\n if (index === -1) {\n ringsAfter.push(ring);\n windingsAfter.push(winding);\n } else windingsAfter[index] += winding;\n } // calcualte polysAfter\n\n\n var polysAfter = [];\n var polysExclude = [];\n\n for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {\n if (windingsAfter[_i] === 0) continue; // non-zero rule\n\n var _ring = ringsAfter[_i];\n var poly = _ring.poly;\n if (polysExclude.indexOf(poly) !== -1) continue;\n if (_ring.isExterior) polysAfter.push(poly);else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly);\n\n var _index = polysAfter.indexOf(_ring.poly);\n\n if (_index !== -1) polysAfter.splice(_index, 1);\n }\n } // calculate multiPolysAfter\n\n\n for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {\n var mp = polysAfter[_i2].multiPoly;\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp);\n }\n\n return this._afterState;\n }\n /* Is this segment part of the final result? */\n\n }, {\n key: \"isInResult\",\n value: function isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false;\n if (this._isInResult !== undefined) return this._isInResult;\n var mpsBefore = this.beforeState().multiPolys;\n var mpsAfter = this.afterState().multiPolys;\n\n switch (operation.type) {\n case 'union':\n {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n var noBefores = mpsBefore.length === 0;\n var noAfters = mpsAfter.length === 0;\n this._isInResult = noBefores !== noAfters;\n break;\n }\n\n case 'intersection':\n {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n var least;\n var most;\n\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length;\n most = mpsAfter.length;\n } else {\n least = mpsAfter.length;\n most = mpsBefore.length;\n }\n\n this._isInResult = most === operation.numMultiPolys && least < most;\n break;\n }\n\n case 'xor':\n {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n var diff = Math.abs(mpsBefore.length - mpsAfter.length);\n this._isInResult = diff % 2 === 1;\n break;\n }\n\n case 'difference':\n {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n var isJustSubject = function isJustSubject(mps) {\n return mps.length === 1 && mps[0].isSubject;\n };\n\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);\n break;\n }\n\n default:\n throw new Error(\"Unrecognized operation type found \".concat(operation.type));\n }\n\n return this._isInResult;\n }\n }], [{\n key: \"fromRing\",\n value: function fromRing(pt1, pt2, ring) {\n var leftPt, rightPt, winding; // ordering the two points according to sweep line ordering\n\n var cmpPts = SweepEvent.comparePoints(pt1, pt2);\n\n if (cmpPts < 0) {\n leftPt = pt1;\n rightPt = pt2;\n winding = 1;\n } else if (cmpPts > 0) {\n leftPt = pt2;\n rightPt = pt1;\n winding = -1;\n } else throw new Error(\"Tried to create degenerate segment at [\".concat(pt1.x, \", \").concat(pt1.y, \"]\"));\n\n var leftSE = new SweepEvent(leftPt, true);\n var rightSE = new SweepEvent(rightPt, false);\n return new Segment(leftSE, rightSE, [ring], [winding]);\n }\n }]);\n\n return Segment;\n}();\n\nvar RingIn =\n/*#__PURE__*/\nfunction () {\n function RingIn(geomRing, poly, isExterior) {\n _classCallCheck(this, RingIn);\n\n this.poly = poly;\n this.isExterior = isExterior;\n this.segments = [];\n var prevPoint = geomRing[0];\n this.bbox = {\n ll: {\n x: prevPoint.x,\n y: prevPoint.y\n },\n ur: {\n x: prevPoint.x,\n y: prevPoint.y\n }\n };\n\n for (var i = 1, iMax = geomRing.length; i < iMax; i++) {\n var point = geomRing[i];\n this.segments.push(Segment.fromRing(prevPoint, point, this));\n if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x;\n if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y;\n if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x;\n if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y;\n prevPoint = point;\n }\n\n this.segments.push(Segment.fromRing(prevPoint, geomRing[0], this));\n }\n\n _createClass(RingIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.segments.length; i < iMax; i++) {\n var segment = this.segments[i];\n sweepEvents.push(segment.leftSE);\n sweepEvents.push(segment.rightSE);\n }\n\n return sweepEvents;\n }\n }]);\n\n return RingIn;\n}();\nvar PolyIn =\n/*#__PURE__*/\nfunction () {\n function PolyIn(geomPoly, multiPoly) {\n _classCallCheck(this, PolyIn);\n\n this.exteriorRing = new RingIn(geomPoly[0], this, true); // copy by value\n\n this.bbox = {\n ll: {\n x: this.exteriorRing.bbox.ll.x,\n y: this.exteriorRing.bbox.ll.y\n },\n ur: {\n x: this.exteriorRing.bbox.ur.x,\n y: this.exteriorRing.bbox.ur.y\n }\n };\n this.interiorRings = [];\n\n for (var i = 1, iMax = geomPoly.length; i < iMax; i++) {\n var ring = new RingIn(geomPoly[i], this, false);\n if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x;\n if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y;\n if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x;\n if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y;\n this.interiorRings.push(ring);\n }\n\n this.multiPoly = multiPoly;\n }\n\n _createClass(PolyIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = this.exteriorRing.getSweepEvents();\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringSweepEvents = this.interiorRings[i].getSweepEvents();\n\n for (var j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return PolyIn;\n}();\nvar MultiPolyIn =\n/*#__PURE__*/\nfunction () {\n function MultiPolyIn(geomMultiPoly) {\n _classCallCheck(this, MultiPolyIn);\n\n this.polys = [];\n this.bbox = {\n ll: {\n x: Number.POSITIVE_INFINITY,\n y: Number.POSITIVE_INFINITY\n },\n ur: {\n x: Number.NEGATIVE_INFINITY,\n y: Number.NEGATIVE_INFINITY\n }\n };\n\n for (var i = 0, iMax = geomMultiPoly.length; i < iMax; i++) {\n var poly = new PolyIn(geomMultiPoly[i], this);\n if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x;\n if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y;\n if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x;\n if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y;\n this.polys.push(poly);\n }\n\n this.isSubject = false;\n }\n\n _createClass(MultiPolyIn, [{\n key: \"markAsSubject\",\n value: function markAsSubject() {\n this.isSubject = true;\n }\n }, {\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polySweepEvents = this.polys[i].getSweepEvents();\n\n for (var j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return MultiPolyIn;\n}();\n\nvar RingOut =\n/*#__PURE__*/\nfunction () {\n _createClass(RingOut, null, [{\n key: \"factory\",\n\n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n value: function factory(allSegments) {\n var ringsOut = [];\n\n for (var i = 0, iMax = allSegments.length; i < iMax; i++) {\n var segment = allSegments[i];\n if (!segment.isInResult() || segment.ringOut) continue;\n var prevEvent = null;\n var event = segment.leftSE;\n var nextEvent = segment.rightSE;\n var events = [event];\n var startingPoint = event.point;\n var intersectionLEs = [];\n /* Walk the chain of linked events to form a closed ring */\n\n while (true) {\n prevEvent = event;\n event = nextEvent;\n events.push(event);\n /* Is the ring complete? */\n\n if (event.point === startingPoint) break;\n\n while (true) {\n var availableLEs = event.getAvailableLinkedEvents();\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n\n if (availableLEs.length === 0) {\n var firstPt = events[0].point;\n var lastPt = events[events.length - 1].point;\n throw new Error(\"Unable to complete output ring starting at [\".concat(firstPt.x, \",\") + \" \".concat(firstPt.y, \"]. Last matching segment found ends at\") + \" [\".concat(lastPt.x, \", \").concat(lastPt.y, \"].\"));\n }\n /* Only one way to go, so cotinue on the path */\n\n\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE;\n break;\n }\n /* We must have an intersection. Check for a completed loop */\n\n\n var indexLE = null;\n\n for (var j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j;\n break;\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n\n\n if (indexLE !== null) {\n var intersectionLE = intersectionLEs.splice(indexLE)[0];\n var ringEvents = events.splice(intersectionLE.index);\n ringEvents.unshift(ringEvents[0].otherSE);\n ringsOut.push(new RingOut(ringEvents.reverse()));\n continue;\n }\n /* register the intersection */\n\n\n intersectionLEs.push({\n index: events.length,\n point: event.point\n });\n /* Choose the left-most option to continue the walk */\n\n var comparator = event.getLeftmostComparator(prevEvent);\n nextEvent = availableLEs.sort(comparator)[0].otherSE;\n break;\n }\n }\n\n ringsOut.push(new RingOut(events));\n }\n\n return ringsOut;\n }\n }]);\n\n function RingOut(events) {\n _classCallCheck(this, RingOut);\n\n this.events = events;\n\n for (var i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this;\n }\n\n this.poly = null;\n }\n\n _createClass(RingOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n var prevPt = this.events[0].point;\n var points = [prevPt];\n\n for (var i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n var _pt = this.events[i].point;\n var _nextPt = this.events[i + 1].point;\n if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue;\n points.push(_pt);\n prevPt = _pt;\n } // ring was all (within rounding error of angle calc) colinear points\n\n\n if (points.length === 1) return null; // check if the starting point is necessary\n\n var pt = points[0];\n var nextPt = points[1];\n if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift();\n points.push(points[0]);\n var step = this.isExteriorRing() ? 1 : -1;\n var iStart = this.isExteriorRing() ? 0 : points.length - 1;\n var iEnd = this.isExteriorRing() ? points.length : -1;\n var orderedPoints = [];\n\n for (var _i = iStart; _i != iEnd; _i += step) {\n orderedPoints.push([points[_i].x, points[_i].y]);\n }\n\n return orderedPoints;\n }\n }, {\n key: \"isExteriorRing\",\n value: function isExteriorRing() {\n if (this._isExteriorRing === undefined) {\n var enclosing = this.enclosingRing();\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;\n }\n\n return this._isExteriorRing;\n }\n }, {\n key: \"enclosingRing\",\n value: function enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing();\n }\n\n return this._enclosingRing;\n }\n /* Returns the ring that encloses this one, if any */\n\n }, {\n key: \"_calcEnclosingRing\",\n value: function _calcEnclosingRing() {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n var leftMostEvt = this.events[0];\n\n for (var i = 1, iMax = this.events.length; i < iMax; i++) {\n var evt = this.events[i];\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt;\n }\n\n var prevSeg = leftMostEvt.segment.prevInResult();\n var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null; // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n\n if (!prevPrevSeg) return prevSeg.ringOut; // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut;\n } else return prevSeg.ringOut.enclosingRing();\n } // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n\n\n prevSeg = prevPrevSeg.prevInResult();\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n }\n }\n }]);\n\n return RingOut;\n}();\nvar PolyOut =\n/*#__PURE__*/\nfunction () {\n function PolyOut(exteriorRing) {\n _classCallCheck(this, PolyOut);\n\n this.exteriorRing = exteriorRing;\n exteriorRing.poly = this;\n this.interiorRings = [];\n }\n\n _createClass(PolyOut, [{\n key: \"addInterior\",\n value: function addInterior(ring) {\n this.interiorRings.push(ring);\n ring.poly = this;\n }\n }, {\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [this.exteriorRing.getGeom()]; // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (geom[0] === null) return null;\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringGeom = this.interiorRings[i].getGeom(); // interior ring was all (within rounding error of angle calc) colinear points\n\n if (ringGeom === null) continue;\n geom.push(ringGeom);\n }\n\n return geom;\n }\n }]);\n\n return PolyOut;\n}();\nvar MultiPolyOut =\n/*#__PURE__*/\nfunction () {\n function MultiPolyOut(rings) {\n _classCallCheck(this, MultiPolyOut);\n\n this.rings = rings;\n this.polys = this._composePolys(rings);\n }\n\n _createClass(MultiPolyOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polyGeom = this.polys[i].getGeom(); // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (polyGeom === null) continue;\n geom.push(polyGeom);\n }\n\n return geom;\n }\n }, {\n key: \"_composePolys\",\n value: function _composePolys(rings) {\n var polys = [];\n\n for (var i = 0, iMax = rings.length; i < iMax; i++) {\n var ring = rings[i];\n if (ring.poly) continue;\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else {\n var enclosingRing = ring.enclosingRing();\n if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing));\n enclosingRing.poly.addInterior(ring);\n }\n }\n\n return polys;\n }\n }]);\n\n return MultiPolyOut;\n}();\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nvar SweepLine =\n/*#__PURE__*/\nfunction () {\n function SweepLine(queue) {\n var comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare;\n\n _classCallCheck(this, SweepLine);\n\n this.queue = queue;\n this.tree = new SplayTree(comparator);\n this.segments = [];\n }\n\n _createClass(SweepLine, [{\n key: \"process\",\n value: function process(event) {\n var segment = event.segment;\n var newEvents = []; // if we've already been consumed by another segment,\n // clean up our body parts and get out\n\n if (event.consumedBy) {\n if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment);\n return newEvents;\n }\n\n var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);\n if (!node) throw new Error(\"Unable to find segment #\".concat(segment.id, \" \") + \"[\".concat(segment.leftSE.point.x, \", \").concat(segment.leftSE.point.y, \"] -> \") + \"[\".concat(segment.rightSE.point.x, \", \").concat(segment.rightSE.point.y, \"] \") + 'in SweepLine tree. Please submit a bug report.');\n var prevNode = node;\n var nextNode = node;\n var prevSeg = undefined;\n var nextSeg = undefined; // skip consumed segments still in tree\n\n while (prevSeg === undefined) {\n prevNode = this.tree.prev(prevNode);\n if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key;\n } // skip consumed segments still in tree\n\n\n while (nextSeg === undefined) {\n nextNode = this.tree.next(nextNode);\n if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key;\n }\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n var prevMySplitter = null;\n\n if (prevSeg) {\n var prevInter = prevSeg.getIntersection(segment);\n\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter;\n\n if (!prevSeg.isAnEndpoint(prevInter)) {\n var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);\n\n for (var i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n }\n } // Check for intersections against the next segment in the sweep line\n\n\n var nextMySplitter = null;\n\n if (nextSeg) {\n var nextInter = nextSeg.getIntersection(segment);\n\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter;\n\n if (!nextSeg.isAnEndpoint(nextInter)) {\n var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);\n\n for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {\n newEvents.push(_newEventsFromSplit[_i]);\n }\n }\n }\n } // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n\n\n if (prevMySplitter !== null || nextMySplitter !== null) {\n var mySplitter = null;\n if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else {\n var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);\n if (cmpSplitters < 0) mySplitter = prevMySplitter;\n if (cmpSplitters > 0) mySplitter = nextMySplitter; // the two splitters are the exact same point\n\n mySplitter = prevMySplitter;\n } // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n\n this.queue.remove(segment.rightSE);\n newEvents.push(segment.rightSE);\n\n var _newEventsFromSplit2 = segment.split(mySplitter);\n\n for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {\n newEvents.push(_newEventsFromSplit2[_i2]);\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.remove(segment);\n newEvents.push(event);\n } else {\n // done with left event\n this.segments.push(segment);\n segment.prev = prevSeg;\n }\n } else {\n // event.isRight\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n var inter = prevSeg.getIntersection(nextSeg);\n\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);\n\n for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {\n newEvents.push(_newEventsFromSplit3[_i3]);\n }\n }\n\n if (!nextSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);\n\n for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {\n newEvents.push(_newEventsFromSplit4[_i4]);\n }\n }\n }\n }\n\n this.tree.remove(segment);\n }\n\n return newEvents;\n }\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n\n }, {\n key: \"_splitSafely\",\n value: function _splitSafely(seg, pt) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.remove(seg);\n var rightSE = seg.rightSE;\n this.queue.remove(rightSE);\n var newEvents = seg.split(pt);\n newEvents.push(rightSE); // splitting can trigger consumption\n\n if (seg.consumedBy === undefined) this.tree.insert(seg);\n return newEvents;\n }\n }]);\n\n return SweepLine;\n}();\n\nvar Operation =\n/*#__PURE__*/\nfunction () {\n function Operation() {\n _classCallCheck(this, Operation);\n }\n\n _createClass(Operation, [{\n key: \"run\",\n value: function run(type, geom, moreGeoms) {\n operation.type = type;\n rounder.reset();\n /* Make a copy of the input geometry with rounded points as objects */\n\n var geoms = [pointsAsObjects(geom)];\n\n for (var i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n geoms.push(pointsAsObjects(moreGeoms[i]));\n }\n /* Clean inputs */\n\n\n for (var _i = 0, _iMax = geoms.length; _i < _iMax; _i++) {\n forceMultiPoly(geoms[_i]);\n cleanMultiPoly(geoms[_i]);\n }\n /* Convert inputs to MultiPoly objects, mark subject */\n\n\n var multipolys = [];\n\n for (var _i2 = 0, _iMax2 = geoms.length; _i2 < _iMax2; _i2++) {\n multipolys.push(new MultiPolyIn(geoms[_i2]));\n }\n\n multipolys[0].markAsSubject();\n operation.numMultiPolys = multipolys.length;\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n\n if (operation.type === 'difference') {\n // in place removal\n var subject = multipolys[0];\n var _i3 = 1;\n\n while (_i3 < multipolys.length) {\n if (getBboxOverlap(multipolys[_i3].bbox, subject.bbox) !== null) _i3++;else multipolys.splice(_i3, 1);\n }\n }\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n\n\n if (operation.type === 'intersection') {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (var _i4 = 0, _iMax3 = multipolys.length; _i4 < _iMax3; _i4++) {\n var mpA = multipolys[_i4];\n\n for (var j = _i4 + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return [];\n }\n }\n }\n /* Put segment endpoints in a priority queue */\n\n\n var queue = new SplayTree(SweepEvent.compare);\n\n for (var _i5 = 0, _iMax4 = multipolys.length; _i5 < _iMax4; _i5++) {\n var sweepEvents = multipolys[_i5].getSweepEvents();\n\n for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {\n queue.insert(sweepEvents[_j]);\n }\n }\n /* Pass the sweep line over those endpoints */\n\n\n var sweepLine = new SweepLine(queue);\n var prevQueueSize = queue.size;\n var node = queue.pop();\n\n while (node) {\n var evt = node.key;\n\n if (queue.size === prevQueueSize) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n var seg = evt.segment;\n throw new Error(\"Unable to pop() \".concat(evt.isLeft ? 'left' : 'right', \" SweepEvent \") + \"[\".concat(evt.point.x, \", \").concat(evt.point.y, \"] from segment #\").concat(seg.id, \" \") + \"[\".concat(seg.leftSE.point.x, \", \").concat(seg.leftSE.point.y, \"] -> \") + \"[\".concat(seg.rightSE.point.x, \", \").concat(seg.rightSE.point.y, \"] from queue. \") + 'Please file a bug report.');\n }\n\n var newEvents = sweepLine.process(evt);\n\n for (var _i6 = 0, _iMax5 = newEvents.length; _i6 < _iMax5; _i6++) {\n var _evt = newEvents[_i6];\n if (_evt.consumedBy === undefined) queue.insert(_evt);\n }\n\n prevQueueSize = queue.size;\n node = queue.pop();\n } // free some memory we don't need anymore\n\n\n rounder.reset();\n /* Collect and compile segments we're keeping into a multipolygon */\n\n var ringsOut = RingOut.factory(sweepLine.segments);\n var result = new MultiPolyOut(ringsOut);\n return result.getGeom();\n }\n }]);\n\n return Operation;\n}(); // singleton available by import\n\nvar operation = new Operation();\n\nvar union = function union(geom) {\n for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n moreGeoms[_key - 1] = arguments[_key];\n }\n\n return operation.run('union', geom, moreGeoms);\n};\n\nvar intersection$1 = function intersection(geom) {\n for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n moreGeoms[_key2 - 1] = arguments[_key2];\n }\n\n return operation.run('intersection', geom, moreGeoms);\n};\n\nvar xor = function xor(geom) {\n for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n moreGeoms[_key3 - 1] = arguments[_key3];\n }\n\n return operation.run('xor', geom, moreGeoms);\n};\n\nvar difference = function difference(subjectGeom) {\n for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n clippingGeoms[_key4 - 1] = arguments[_key4];\n }\n\n return operation.run('difference', subjectGeom, clippingGeoms);\n};\n\nvar index = {\n union: union,\n intersection: intersection$1,\n xor: xor,\n difference: difference\n};\n\nexport default index;\n","/* follows \"An implementation of top-down splaying\"\n * by D. Sleator <sleator@cs.cmu.edu> March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array<string>} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array<Key>}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array<Value>}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array<Key>} keys\n * @param {Array<Value>} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n","module.exports = require(\"@dra2020/util\");","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"util\"] = factory();\n\telse\n\t\troot[\"util\"] = factory();\n})(global, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./lib/all.ts\");\n","export * from './util';\nexport * from './countedhash';\nexport * from './indexedarray';\n","export class CountedHash\n{\n n: number;\n val: any;\n\n constructor()\n {\n this.n = 0;\n this.val = {};\n }\n\n get length(): number { return this.n; }\n\n test(id: string): boolean\n {\n return id != '' && this.val[id] !== undefined;\n }\n\n set(id: string): void\n {\n if (id != '' && ! this.test(id))\n {\n this.n++;\n this.val[id] = true;\n }\n }\n\n clear(id: string): void\n {\n if (this.test(id))\n {\n this.n--;\n delete this.val[id];\n }\n }\n\n empty(): void\n {\n this.n = 0;\n this.val = {};\n }\n\n asArray(): string[]\n {\n let a: string[] = [];\n\n this.forEach(id => { a.push(id) });\n\n return a;\n }\n\n asString(): string\n {\n for (var id in this.val) if (this.val.hasOwnProperty(id))\n return id;\n\n return '';\n }\n\n forEach(f: (id: string) => void): void\n {\n for (var id in this.val) if (this.val.hasOwnProperty(id))\n f(id);\n }\n}\n","export class IndexedArray\n{\n o: any;\n a: any[];\n\n constructor()\n {\n this.o = {};\n this.a = null;\n }\n\n ensure(): void\n {\n if (this.a === null)\n {\n this.a = [];\n for (let p in this.o) if (this.o.hasOwnProperty(p))\n this.a.push(p);\n this.a.sort((a: string, b: string) => { a = a.toUpperCase(); b = b.toUpperCase(); return a < b ? -1 : (a > b ? 1 : 0); });\n }\n }\n\n get length(): number { this.ensure(); return this.a.length; }\n\n test(s: string): boolean\n {\n return !!s && this.o[s] !== undefined;\n }\n\n set(s: string): void\n {\n if (!!s && !this.test(s))\n {\n this.o[s] = true;\n this.a = null;\n }\n }\n\n setAll(a: string[]): void\n {\n if (a && a.length)\n for (let i: number = 0; i < a.length; i++)\n this.set(a[i]);\n }\n\n clear(s: string): void\n {\n if (this.test(s))\n {\n delete this.o[s];\n this.a = null;\n }\n }\n\n at(i: number): string\n {\n this.ensure();\n if (i < 0 || i >= this.a.length)\n return undefined;\n return this.a[i];\n }\n\n empty(): void\n {\n this.o = {};\n this.a = null;\n }\n\n forEach(f: (s: string) => void): void\n {\n for (var s in this.o) if (this.o.hasOwnProperty(s))\n f(s);\n }\n}\n","export type DateString = string;\nexport function Now(): DateString { return (new Date()).toJSON(); }\n\nexport class Elapsed\n{\n tStart: any;\n tDur: any;\n\n constructor(bStart: boolean = true)\n {\n this.tStart = undefined;\n this.tDur = undefined;\n if (bStart) this.start();\n }\n\n start(): void\n {\n if (process)\n this.tStart = process.hrtime();\n else\n this.tStart = performance.now();\n }\n\n end(): void\n {\n if (this.tStart === undefined) this.start();\n if (process)\n this.tDur = process.hrtime(this.tStart);\n else\n this.tDur = performance.now() - this.tStart;\n }\n\n ms(): number\n {\n if (this.tDur === undefined) this.end();\n if (process)\n return Math.round((this.tDur[0]*1000) + (this.tDur[1]/1000000));\n else\n return this.tDur;\n }\n\n nano(): number\n {\n if (process)\n return (this.tDur[0]*1000000000) + this.tDur[1];\n else\n return this.tDur * 1000000;\n }\n}\n\nexport class Deadline\n{\n msDelta: number;\n elapsed: Elapsed;\n\n constructor(msDelta: number)\n {\n this.msDelta = msDelta;\n this.elapsed = new Elapsed();\n }\n\n done(): boolean\n {\n this.elapsed.end();\n return this.elapsed.ms() > this.msDelta;\n }\n}\n\nexport function createGuid(): string\n{\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n}\n\ntype LoopTest = WeakMap<any,boolean>;\n\nfunction _sizeof(a: any, loops: LoopTest): number\n{\n if (a === null || a === undefined) return 0;\n\n switch (typeof a)\n {\n default: return 0;\n case 'number': return 8;\n case 'boolean': return 4;\n case 'string': return a.length * 2;\n\n case 'object':\n {\n if (loops.has(a))\n return 0;\n else\n loops.set(a, true);\n\n let t: number = 0;\n if (Array.isArray(a))\n {\n for (let i: number = 0; i < a.length; i++)\n t += _sizeof(a[i], loops);\n t += 8; // length\n }\n else if (Buffer.isBuffer(a))\n {\n t = a.length;\n }\n else if (a.hasOwnProperty === undefined)\n return t;\n else\n {\n for (var key in a) if (a.hasOwnProperty && a.hasOwnProperty(key))\n {\n t += _sizeof(key, loops); // this is a good estimate of download size, but poor estimate of internal size\n // because of JS object templating vs. naive hashtables\n t += _sizeof(a[key], loops);\n }\n }\n return t;\n }\n }\n}\n\nexport function sizeof(a: any): number\n{\n let loops: LoopTest = new WeakMap();\n let n: number = _sizeof(a, loops);\n return n;\n}\n\nexport function depthof(a: any): number\n{\n if (a === null || a === undefined) return 1;\n\n switch (typeof a)\n {\n default: return 1;\n case 'number': return 1;\n case 'boolean': return 1;\n case 'string': return 1;\n\n case 'object':\n {\n let d: number = 0;\n if (Array.isArray(a))\n return a.length > 0 ? (1 + depthof(a[0])) : 2; // still return 2 for empty array\n else if (Buffer.isBuffer(a))\n return 2;\n else if (a.hasOwnProperty === undefined)\n return 1;\n else\n {\n for (var key in a) if (a.hasOwnProperty(key))\n return 1 + depthof(a[key]);\n return 2; // or 2 for empty object\n }\n }\n }\n}\nexport function isEmpty(o: any): boolean\n{\n if (o === null || o === undefined) return true;\n for (var p in o) if (o.hasOwnProperty(p)) return false;\n return true;\n}\n\nexport function countKeys(o: any): number\n{\n if (o === undefined || typeof o !== 'object') return -1;\n\n let count: number = 0;\n for (let p in o) if (o.hasOwnProperty(p))\n count++;\n return count;\n}\n\nexport function nthProperty(o: any, n: number = 0): any\n{\n for (let p in o) if (o.hasOwnProperty(p))\n {\n if (n <= 0) return o[p];\n n--;\n }\n return undefined;\n}\n\nexport function partialEqual(o: any, subset: any): boolean\n{\n for (let p in subset) if (subset.hasOwnProperty(p))\n if (o[p] !== subset[p])\n return false;\n return true;\n}\n\nexport function deepEqual(o1: any, o2: any): boolean\n{\n if (typeof o1 !== typeof o2) return false;\n if (typeof o1 !== 'object') return o1 === o2;\n\n // Special case array\n if (Array.isArray(o1))\n {\n if (! Array.isArray(o2)) return false;\n if (o1.length != o2.length) return false;\n for (let i: number = 0; i < o1.length; i++)\n if (! deepEqual(o1[i], o2[i]))\n return false;\n return true;\n }\n\n // Special case object\n if (o1.hasOwnProperty === undefined || o2.hasOwnProperty === undefined)\n return o1 === o2;\n\n for (let p in o1) if (o1.hasOwnProperty(p))\n {\n if (o2[p] === undefined)\n return false;\n if (! deepEqual(o1[p], o2[p]))\n return false;\n }\n // If any properties in o2 aren't in o1, not equal\n for (let p in o2) if (o2.hasOwnProperty(p))\n if (o1[p] === undefined)\n return false;\n\n return true;\n}\n\nconst Months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];\n\nexport function prettyDate(d: Date): string\n{\n if (d == null) return 'unknown';\n\n let mmm = Months[d.getMonth()];\n let dd = d.getDate();\n let yyyy = d.getFullYear();\n let hh = d.getHours();\n let m = d.getMinutes();\n let mm = m < 10 ? `0${m}` : String(m);\n let ampm = hh >= 12 ? 'PM' : 'AM';\n if (hh > 12) hh -= 12;\n\n return `${mmm} ${dd}, ${yyyy} at ${hh}:${mm} ${ampm}`;\n}\n\nexport function textToHtml(sText: string): string\n{\n let lines: string[] = sText.split('\\n');\n let aHtml: string[] = [];\n let inTable: boolean = false;\n aHtml.push('<body>');\n for (let i: number = 0; i < lines.length; i++)\n {\n let line = lines[i];\n let isRow: boolean = line.indexOf('|') === 0;\n if (inTable && !isRow)\n {\n aHtml.push('</tbody></table>');\n inTable = false;\n }\n if (isRow && !inTable)\n {\n inTable = true;\n aHtml.push('<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\"><tbody>');\n }\n if (isRow)\n {\n let cells = line.split('|');\n if (cells.length > 2)\n {\n aHtml.push('<tr>');\n for (let j: number = 1; j < cells.length-1; j++)\n aHtml.push(`<td>${cells[j]}</td>`);\n aHtml.push('</tr>');\n }\n }\n else\n aHtml.push(`<div>${line}&nbsp;</div>`);\n }\n if (inTable)\n aHtml.push('</tbody></table>');\n aHtml.push('</body>');\n return aHtml.join('');\n}\n\nexport function shallowCopy(src: any): any\n{\n if (src === null || src === undefined) return src;\n\n switch (typeof src)\n {\n case 'boolean':\n case 'number':\n case 'string':\n case 'symbol':\n case 'function':\n default:\n return src;\n\n case 'object':\n if (Array.isArray(src))\n return src.slice();\n else\n {\n let copy: any = {};\n\n for (var p in src) if (src.hasOwnProperty(p))\n copy[p] = src[p];\n return copy;\n }\n }\n}\n\nexport function shallowAssign(o1: any, o2: any): any\n{\n if (o1 === null || o1 === undefined) o1 = {};\n if (o2 === null || o2 === undefined) return o1;\n if (typeof o2 !== 'object' || typeof o1 !== 'object') return o1;\n\n for (var p in o2) if (o2.hasOwnProperty(p))\n o1[p] = o2[p];\n return o1;\n}\n\nexport function shallowAssignImmutable(o1: any, o2: any): any\n{\n if (o1 === null || o1 === undefined) o1 = {};\n if (o2 === null || o2 === undefined) return o1;\n if (typeof o2 !== 'object' || typeof o1 !== 'object') return o1;\n\n // First determine whether o2 changes any properties, if it has, make new instance\n let oNew: any = o1;\n for (let p in o2) if (o2.hasOwnProperty(p))\n {\n if (o1[p] != o2[p])\n {\n oNew = shallowCopy(o1);\n break;\n }\n }\n if (oNew !== o1)\n shallowAssign(oNew, o2);\n return oNew;\n}\n\nexport function shallowEqual(o1: any, o2: any): boolean\n{\n if (o1 === undefined || o2 === undefined || typeof o1 !== 'object' || typeof o2 !== 'object')\n return o1 === o2;\n\n if (Array.isArray(o1) && Array.isArray(o2))\n {\n if (o1.length != o2.length) return false;\n for (let i: number = 0; i < o1.length; i++)\n if (o1[i] !== o2[i]) return false;\n return true;\n }\n else\n {\n let p: any;\n\n for (p in o1) if (o1.hasOwnProperty(p))\n if (o1[p] !== o2[p]) return false;\n for (p in o2) if (o2.hasOwnProperty(p))\n if (o1[p] === undefined) return false;\n return true;\n }\n}\n\nexport function deepCopy(src: any): any\n{\n // Beware typeof oddities\n if (src === null || src === undefined) return src;\n\n if (typeof src === 'object')\n {\n if (Array.isArray(src))\n {\n let dst: any[] = [];\n\n for (let i: number = 0; i < src.length; i++)\n dst.push(deepCopy(src[i]));\n return dst;\n }\n else\n {\n if (src.hasOwnProperty === undefined)\n return src;\n\n let dst: any = {};\n for (var p in src) if (src.hasOwnProperty(p))\n dst[p] = deepCopy(src[p]);\n return dst;\n }\n }\n else\n return src;\n}\n\nexport function precisionRound(n: number, p: number): number\n{\n let f: number = Math.pow(10, p);\n return Math.round(n * f) / f;\n}\n\nexport function percentString(num: number, den: number, precision: number = 0): string\n{\n if (den == 0)\n return '(-)';\n\n let p: number = precisionRound((num/den) * 100, precision);\n\n return String(p) + '%';\n}\n\nexport function hash(s: string): number\n{\n let hash: number = 5381;\n let i: number = s.length;\n\n while (i)\n hash = (hash * 33) ^ s.charCodeAt(--i);\n\n /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n * integers. Since we want the results to be always positive, convert the\n * signed int to an unsigned by doing an unsigned bitshift. */\n return hash >>> 0;\n}\n\nexport function hashObject(o: any): number\n{\n return hash(o ? JSON.stringify(o) : '');\n}\n\nconst HexTable: string[] = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ];\nexport function toHex(n: number): string\n{\n if (n < 0 || n > 255) throw('only 0 to 255 supported now');\n n = Math.floor(n);\n return HexTable[n >> 4] + HexTable[n & 15];\n}\n\nexport function toRGBA(color: string, alpha: number): string\n{\n let r: number;\n let g: number;\n let b: number;\n\n switch (color)\n {\n case 'white':\n r = 255; g = 255; b = 255;\n break;\n\n case 'black':\n r = 0; g = 0; b = 0;\n break;\n\n default:\n r = parseInt(color.substr(1, 2), 16);\n g = parseInt(color.substr(3, 2), 16);\n b = parseInt(color.substr(5, 2), 16);\n break;\n }\n\n return `rgba(${String(r)}, ${String(g)}, ${String(b)}, ${String(alpha)})`;\n}\n\nexport function toRGBAIntensity(color: string, intensity: number, alpha: number): string\n{\n // for now assume color is black\n let g: number = precisionRound(255 * intensity, 0);\n return `rgba(${String(g)}, ${String(g)}, ${String(g)}, ${String(alpha)})`;\n}\n\n// Geo functions\nexport function distance(x0: number, y0: number, x1: number, y1: number): number\n{\n return Math.hypot(x0 - x1, y0 - y1);\n}\n\nexport function deg2rad(num: number): number { return num * Math.PI / 180; }\nexport function rad2deg(num: number): number { return num / Math.PI * 180; }\n\n// Restricts lon to range [-180..180]\nexport function wrapLon(lon: number): number\n{\n let worlds = Math.floor((lon + 180) / 360);\n return lon - (worlds * 360);\n}\n","\n\nclass ResizeableBuffer{\n constructor(size=100){\n this.size = size\n this.length = 0\n this.buf = Buffer.alloc(size)\n }\n prepend(val){\n const length = this.length++\n if(length === this.size){\n this.resize()\n }\n const buf = this.clone()\n this.buf[0] = val\n buf.copy(this.buf,1, 0, length)\n }\n append(val){\n const length = this.length++\n if(length === this.size){\n this.resize()\n }\n this.buf[length] = val\n }\n clone(){\n return Buffer.from(this.buf.slice(0, this.length))\n }\n resize(){\n const length = this.length\n this.size = this.size * 2\n const buf = Buffer.alloc(this.size)\n this.buf.copy(buf,0, 0, length)\n this.buf = buf\n }\n toString(){\n return this.buf.slice(0, this.length).toString()\n }\n toJSON(){\n return this.toString()\n }\n reset(){\n this.length = 0\n }\n}\n\nmodule.exports = ResizeableBuffer\n","\n/*\nCSV Parse\n\nPlease look at the [project documentation](https://csv.js.org/parse/) for additional\ninformation.\n*/\n\nconst { Transform } = require('stream')\nconst ResizeableBuffer = require('./ResizeableBuffer')\n\nconst cr = 13\nconst nl = 10\nconst space = 32\nconst tab = 9\nconst bom_utf8 = Buffer.from([239, 187, 191])\n\nclass Parser extends Transform {\n constructor(opts = {}){\n super({...{readableObjectMode: true}, ...opts})\n const options = {}\n // Merge with user options\n for(let opt in opts){\n options[underscore(opt)] = opts[opt]\n }\n // Normalize option `bom`\n if(options.bom === undefined || options.bom === null || options.bom === false){\n options.bom = false\n }else if(options.bom !== true){\n throw new CsvError('CSV_INVALID_OPTION_BOM', [\n 'Invalid option bom:', 'bom must be true,',\n `got ${JSON.stringify(options.bom)}`\n ])\n }\n // Normalize option `cast`\n let fnCastField = null\n if(options.cast === undefined || options.cast === null || options.cast === false || options.cast === ''){\n options.cast = undefined\n }else if(typeof options.cast === 'function'){\n fnCastField = options.cast\n options.cast = true\n }else if(options.cast !== true){\n throw new CsvError('CSV_INVALID_OPTION_CAST', [\n 'Invalid option cast:', 'cast must be true or a function,',\n `got ${JSON.stringify(options.cast)}`\n ])\n }\n // Normalize option `cast_date`\n if(options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === ''){\n options.cast_date = false\n }else if(options.cast_date === true){\n options.cast_date = function(value){\n const date = Date.parse(value)\n return !isNaN(date) ? new Date(date) : value\n }\n }else if(typeof options.cast_date !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', [\n 'Invalid option cast_date:', 'cast_date must be true or a function,',\n `got ${JSON.stringify(options.cast_date)}`\n ])\n }\n // Normalize option `columns`\n let fnFirstLineToHeaders = null\n if(options.columns === true){\n // Fields in the first line are converted as-is to columns\n fnFirstLineToHeaders = undefined\n }else if(typeof options.columns === 'function'){\n fnFirstLineToHeaders = options.columns\n options.columns = true\n }else if(Array.isArray(options.columns)){\n options.columns = normalizeColumnsArray(options.columns)\n }else if(options.columns === undefined || options.columns === null || options.columns === false){\n options.columns = false\n }else{\n throw new CsvError('CSV_INVALID_OPTION_COLUMNS', [\n 'Invalid option columns:',\n 'expect an object, a function or true,',\n `got ${JSON.stringify(options.columns)}`\n ])\n }\n // Normalize option `comment`\n if(options.comment === undefined || options.comment === null || options.comment === false || options.comment === ''){\n options.comment = null\n }else{\n if(typeof options.comment === 'string'){\n options.comment = Buffer.from(options.comment)\n }\n if(!Buffer.isBuffer(options.comment)){\n throw new CsvError('CSV_INVALID_OPTION_COMMENT', [\n 'Invalid option comment:',\n 'comment must be a buffer or a string,',\n `got ${JSON.stringify(options.comment)}`\n ])\n }\n }\n // Normalize option `delimiter`\n if(options.delimiter === undefined || options.delimiter === null || options.delimiter === false){\n options.delimiter = Buffer.from(',')\n }else if(typeof options.delimiter === 'string' && options.delimiter.length !== 0){\n options.delimiter = Buffer.from(options.delimiter)\n }else if(\n (Buffer.isBuffer(options.delimiter) && options.delimiter.length === 0) ||\n (typeof options.delimiter === 'string' && options.delimiter.length === 0) ||\n (!Buffer.isBuffer(options.delimiter) && typeof options.delimiter !== 'string')\n ){\n throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [\n 'Invalid option delimiter:',\n 'delimiter must be a non empty string or buffer,',\n `got ${JSON.stringify(options.delimiter)}`\n ])\n }\n // Normalize option `escape`\n if(options.escape === undefined || options.escape === null){\n options.escape = Buffer.from('\"')\n }else if(typeof options.escape === 'string'){\n options.escape = Buffer.from(options.escape)\n }\n if(!Buffer.isBuffer(options.escape)){\n throw new Error(`Invalid Option: escape must be a buffer or a string, got ${JSON.stringify(options.escape)}`)\n }else if(options.escape.length !== 1){\n throw new Error(`Invalid Option Length: escape must be one character, got ${options.escape.length}`)\n }else{\n options.escape = options.escape[0]\n }\n // Normalize option `from`\n if(options.from === undefined || options.from === null){\n options.from = 1\n }else{\n if(typeof options.from === 'string' && /\\d+/.test(options.from)){\n options.from = parseInt(options.from)\n }\n if(Number.isInteger(options.from)){\n if(options.from < 0){\n throw new Error(`Invalid Option: from must be a positive integer, got ${JSON.stringify(opts.from)}`)\n }\n }else{\n throw new Error(`Invalid Option: from must be an integer, got ${JSON.stringify(options.from)}`)\n }\n }\n // Normalize option `from_line`\n if(options.from_line === undefined || options.from_line === null){\n options.from_line = 1\n }else{\n if(typeof options.from_line === 'string' && /\\d+/.test(options.from_line)){\n options.from_line = parseInt(options.from_line)\n }\n if(Number.isInteger(options.from_line)){\n if(options.from_line <= 0){\n throw new Error(`Invalid Option: from_line must be a positive integer greater than 0, got ${JSON.stringify(opts.from_line)}`)\n }\n }else{\n throw new Error(`Invalid Option: from_line must be an integer, got ${JSON.stringify(opts.from_line)}`)\n }\n }\n // Normalize option `info`\n if(options.info === undefined || options.info === null || options.info === false){\n options.info = false\n }else if(options.info !== true){\n throw new Error(`Invalid Option: info must be true, got ${JSON.stringify(options.info)}`)\n }\n // Normalize option `max_record_size`\n if(options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false){\n options.max_record_size = 0\n }else if(Number.isInteger(options.max_record_size) && options.max_record_size >= 0){\n // Great, nothing to do\n }else if(typeof options.max_record_size === 'string' && /\\d+/.test(options.max_record_size)){\n options.max_record_size = parseInt(options.max_record_size)\n }else{\n throw new Error(`Invalid Option: max_record_size must be a positive integer, got ${JSON.stringify(options.max_record_size)}`)\n }\n // Normalize option `objname`\n if(options.objname === undefined || options.objname === null || options.objname === false){\n options.objname = undefined\n }else if(Buffer.isBuffer(options.objname)){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty buffer`)\n }\n options.objname = options.objname.toString()\n }else if(typeof options.objname === 'string'){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty string`)\n }\n // Great, nothing to do\n }else{\n throw new Error(`Invalid Option: objname must be a string or a buffer, got ${options.objname}`)\n }\n // Normalize option `on_record`\n if(options.on_record === undefined || options.on_record === null){\n options.on_record = undefined\n }else if(typeof options.on_record !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', [\n 'Invalid option `on_record`:',\n 'expect a function,',\n `got ${JSON.stringify(options.on_record)}`\n ])\n }\n // Normalize option `quote`\n if(options.quote === null || options.quote === false || options.quote === ''){\n options.quote = null\n }else{\n if(options.quote === undefined || options.quote === true){\n options.quote = Buffer.from('\"')\n }else if(typeof options.quote === 'string'){\n options.quote = Buffer.from(options.quote)\n }\n if(!Buffer.isBuffer(options.quote)){\n throw new Error(`Invalid Option: quote must be a buffer or a string, got ${JSON.stringify(options.quote)}`)\n }else if(options.quote.length !== 1){\n throw new Error(`Invalid Option Length: quote must be one character, got ${options.quote.length}`)\n }else{\n options.quote = options.quote[0]\n }\n }\n // Normalize option `raw`\n if(options.raw === undefined || options.raw === null || options.raw === false){\n options.raw = false\n }else if(options.raw !== true){\n throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`)\n }\n // Normalize option `record_delimiter`\n if(!options.record_delimiter){\n options.record_delimiter = []\n }else if(!Array.isArray(options.record_delimiter)){\n options.record_delimiter = [options.record_delimiter]\n }\n options.record_delimiter = options.record_delimiter.map( function(rd){\n if(typeof rd === 'string'){\n rd = Buffer.from(rd)\n }\n return rd\n })\n // Normalize option `relax`\n if(typeof options.relax === 'boolean'){\n // Great, nothing to do\n }else if(options.relax === undefined || options.relax === null){\n options.relax = false\n }else{\n throw new Error(`Invalid Option: relax must be a boolean, got ${JSON.stringify(options.relax)}`)\n }\n // Normalize option `relax_column_count`\n if(typeof options.relax_column_count === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count === undefined || options.relax_column_count === null){\n options.relax_column_count = false\n }else{\n throw new Error(`Invalid Option: relax_column_count must be a boolean, got ${JSON.stringify(options.relax_column_count)}`)\n }\n if(typeof options.relax_column_count_less === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_less === undefined || options.relax_column_count_less === null){\n options.relax_column_count_less = false\n }else{\n throw new Error(`Invalid Option: relax_column_count_less must be a boolean, got ${JSON.stringify(options.relax_column_count_less)}`)\n }\n if(typeof options.relax_column_count_more === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_more === undefined || options.relax_column_count_more === null){\n options.relax_column_count_more = false\n }else{\n throw new Error(`Invalid Option: relax_column_count_more must be a boolean, got ${JSON.stringify(options.relax_column_count_more)}`)\n }\n // Normalize option `skip_empty_lines`\n if(typeof options.skip_empty_lines === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_empty_lines === undefined || options.skip_empty_lines === null){\n options.skip_empty_lines = false\n }else{\n throw new Error(`Invalid Option: skip_empty_lines must be a boolean, got ${JSON.stringify(options.skip_empty_lines)}`)\n }\n // Normalize option `skip_lines_with_empty_values`\n if(typeof options.skip_lines_with_empty_values === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_lines_with_empty_values === undefined || options.skip_lines_with_empty_values === null){\n options.skip_lines_with_empty_values = false\n }else{\n throw new Error(`Invalid Option: skip_lines_with_empty_values must be a boolean, got ${JSON.stringify(options.skip_lines_with_empty_values)}`)\n }\n // Normalize option `skip_lines_with_error`\n if(typeof options.skip_lines_with_error === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_lines_with_error === undefined || options.skip_lines_with_error === null){\n options.skip_lines_with_error = false\n }else{\n throw new Error(`Invalid Option: skip_lines_with_error must be a boolean, got ${JSON.stringify(options.skip_lines_with_error)}`)\n }\n // Normalize option `rtrim`\n if(options.rtrim === undefined || options.rtrim === null || options.rtrim === false){\n options.rtrim = false\n }else if(options.rtrim !== true){\n throw new Error(`Invalid Option: rtrim must be a boolean, got ${JSON.stringify(options.rtrim)}`)\n }\n // Normalize option `ltrim`\n if(options.ltrim === undefined || options.ltrim === null || options.ltrim === false){\n options.ltrim = false\n }else if(options.ltrim !== true){\n throw new Error(`Invalid Option: ltrim must be a boolean, got ${JSON.stringify(options.ltrim)}`)\n }\n // Normalize option `trim`\n if(options.trim === undefined || options.trim === null || options.trim === false){\n options.trim = false\n }else if(options.trim !== true){\n throw new Error(`Invalid Option: trim must be a boolean, got ${JSON.stringify(options.trim)}`)\n }\n // Normalize options `trim`, `ltrim` and `rtrim`\n if(options.trim === true && opts.ltrim !== false){\n options.ltrim = true\n }else if(options.ltrim !== true){\n options.ltrim = false\n }\n if(options.trim === true && opts.rtrim !== false){\n options.rtrim = true\n }else if(options.rtrim !== true){\n options.rtrim = false\n }\n // Normalize option `to`\n if(options.to === undefined || options.to === null){\n options.to = -1\n }else{\n if(typeof options.to === 'string' && /\\d+/.test(options.to)){\n options.to = parseInt(options.to)\n }\n if(Number.isInteger(options.to)){\n if(options.to <= 0){\n throw new Error(`Invalid Option: to must be a positive integer greater than 0, got ${JSON.stringify(opts.to)}`)\n }\n }else{\n throw new Error(`Invalid Option: to must be an integer, got ${JSON.stringify(opts.to)}`)\n }\n }\n // Normalize option `to_line`\n if(options.to_line === undefined || options.to_line === null){\n options.to_line = -1\n }else{\n if(typeof options.to_line === 'string' && /\\d+/.test(options.to_line)){\n options.to_line = parseInt(options.to_line)\n }\n if(Number.isInteger(options.to_line)){\n if(options.to_line <= 0){\n throw new Error(`Invalid Option: to_line must be a positive integer greater than 0, got ${JSON.stringify(opts.to_line)}`)\n }\n }else{\n throw new Error(`Invalid Option: to_line must be an integer, got ${JSON.stringify(opts.to_line)}`)\n }\n }\n this.info = {\n comment_lines: 0,\n empty_lines: 0,\n invalid_field_length: 0,\n lines: 1,\n records: 0\n }\n this.options = options\n this.state = {\n bomSkipped: false,\n castField: fnCastField,\n commenting: false,\n enabled: options.from_line === 1,\n escaping: false,\n escapeIsQuote: options.escape === options.quote,\n expectedRecordLength: options.columns === null ? 0 : options.columns.length,\n field: new ResizeableBuffer(20),\n firstLineToHeaders: fnFirstLineToHeaders,\n info: Object.assign({}, this.info),\n previousBuf: undefined,\n quoting: false,\n stop: false,\n rawBuffer: new ResizeableBuffer(100),\n record: [],\n recordHasError: false,\n record_length: 0,\n recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 2 : Math.max(...options.record_delimiter.map( (v) => v.length)),\n trimChars: [Buffer.from(' ')[0], Buffer.from('\\t')[0]],\n wasQuoting: false,\n wasRowDelimiter: false\n }\n }\n // Implementation of `Transform._transform`\n _transform(buf, encoding, callback){\n if(this.state.stop === true){\n return\n }\n const err = this.__parse(buf, false)\n if(err !== undefined){\n this.state.stop = true\n }\n callback(err)\n }\n // Implementation of `Transform._flush`\n _flush(callback){\n if(this.state.stop === true){\n return\n }\n const err = this.__parse(undefined, true)\n callback(err)\n }\n // Central parser implementation\n __parse(nextBuf, end){\n const {bom, comment, escape, from_line, info, ltrim, max_record_size, quote, raw, relax, rtrim, skip_empty_lines, to, to_line} = this.options\n let {record_delimiter} = this.options\n const {bomSkipped, previousBuf, rawBuffer, escapeIsQuote} = this.state\n let buf\n if(previousBuf === undefined){\n if(nextBuf === undefined){\n // Handle empty string\n this.push(null)\n return\n }else{\n buf = nextBuf\n }\n }else if(previousBuf !== undefined && nextBuf === undefined){\n buf = previousBuf\n }else{\n buf = Buffer.concat([previousBuf, nextBuf])\n }\n // Handle UTF BOM\n if(bomSkipped === false){\n if(bom === false){\n this.state.bomSkipped = true\n }else if(buf.length < 3){\n // No enough data\n if(end === false){\n // Wait for more data\n this.state.previousBuf = buf\n return\n }\n // skip BOM detect because data length < 3\n }else{\n if(bom_utf8.compare(buf, 0, 3) === 0){\n // Skip BOM\n buf = buf.slice(3)\n }\n this.state.bomSkipped = true\n }\n }\n const bufLen = buf.length\n let pos\n for(pos = 0; pos < bufLen; pos++){\n // Ensure we get enough space to look ahead\n // There should be a way to move this out of the loop\n if(this.__needMoreData(pos, bufLen, end)){\n break\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++\n if(info === true && this.state.record.length === 0 && this.state.field.length === 0 && this.state.wasQuoting === false){\n this.state.info = Object.assign({}, this.info)\n }\n this.state.wasRowDelimiter = false\n }\n if(to_line !== -1 && this.info.lines > to_line){\n this.state.stop = true\n this.push(null)\n return\n }\n // Auto discovery of record_delimiter, unix, mac and windows supported\n if(this.state.quoting === false && record_delimiter.length === 0){\n const record_delimiterCount = this.__autoDiscoverRowDelimiter(buf, pos)\n if(record_delimiterCount){\n record_delimiter = this.options.record_delimiter\n }\n }\n const chr = buf[pos]\n if(raw === true){\n rawBuffer.append(chr)\n }\n if((chr === cr || chr === nl) && this.state.wasRowDelimiter === false ){\n this.state.wasRowDelimiter = true\n }\n // Previous char was a valid escape char\n // treat the current char as a regular char\n if(this.state.escaping === true){\n this.state.escaping = false\n }else{\n // Escape is only active inside quoted fields\n // We are quoting, the char is an escape chr and there is a chr to escape\n if(this.state.quoting === true && chr === escape && pos + 1 < bufLen){\n if(escapeIsQuote){\n if(buf[pos+1] === quote){\n this.state.escaping = true\n continue\n }\n }else{\n this.state.escaping = true\n continue\n }\n }\n // Not currently escaping and chr is a quote\n // TODO: need to compare bytes instead of single char\n if(this.state.commenting === false && chr === quote){\n if(this.state.quoting === true){\n const nextChr = buf[pos+1]\n const isNextChrTrimable = rtrim && this.__isCharTrimable(nextChr)\n // const isNextChrComment = nextChr === comment\n const isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos+1, nextChr)\n const isNextChrDelimiter = this.__isDelimiter(nextChr, buf, pos+1)\n const isNextChrRowDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRowDelimiter(buf, pos+1) : this.__isRecordDelimiter(nextChr, buf, pos+1)\n // Escape a quote\n // Treat next char as a regular character\n // TODO: need to compare bytes instead of single char\n if(chr === escape && nextChr === quote){\n pos++\n }else if(!nextChr || isNextChrDelimiter || isNextChrRowDelimiter || isNextChrComment || isNextChrTrimable){\n this.state.quoting = false\n this.state.wasQuoting = true\n continue\n }else if(relax === false){\n const err = this.__error(\n new CsvError('CSV_INVALID_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n `got \"${String.fromCharCode(nextChr)}\"`,\n `at line ${this.info.lines}`,\n 'instead of delimiter, row delimiter, trimable character',\n '(if activated) or comment',\n ], this.__context())\n )\n if(err !== undefined) return err\n }else{\n this.state.quoting = false\n this.state.wasQuoting = true\n // continue\n this.state.field.prepend(quote)\n }\n }else{\n if(this.state.field.length !== 0){\n // In relax mode, treat opening quote preceded by chrs as regular\n if( relax === false ){\n const err = this.__error(\n new CsvError('INVALID_OPENING_QUOTE', [\n 'Invalid Opening Quote:',\n `a quote is found inside a field at line ${this.info.lines}`,\n ], this.__context(), {\n field: this.state.field,\n })\n )\n if(err !== undefined) return err\n }\n }else{\n this.state.quoting = true\n continue\n }\n }\n }\n if(this.state.quoting === false){\n let recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos)\n if(recordDelimiterLength !== 0){\n // Do not emit comments which take a full line\n const skipCommentLine = this.state.commenting && (this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0)\n if(skipCommentLine){\n this.info.comment_lines++\n // Skip full comment line\n }else{\n // Skip if line is empty and skip_empty_lines activated\n if(skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0){\n this.info.empty_lines++\n pos += recordDelimiterLength - 1\n continue\n }\n // Activate records emition if above from_line\n if(this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1: 0 ) >= from_line){\n this.state.enabled = true\n this.__resetField()\n this.__resetRow()\n pos += recordDelimiterLength - 1\n continue\n }else{\n const errField = this.__onField()\n if(errField !== undefined) return errField\n const errRecord = this.__onRow()\n if(errRecord !== undefined) return errRecord\n }\n if(to !== -1 && this.info.records >= to){\n this.state.stop = true\n this.push(null)\n return\n }\n }\n this.state.commenting = false\n pos += recordDelimiterLength - 1\n continue\n }\n if(this.state.commenting){\n continue\n }\n const commentCount = comment === null ? 0 : this.__compareBytes(comment, buf, pos, chr)\n if(commentCount !== 0){\n this.state.commenting = true\n continue\n }\n let delimiterLength = this.__isDelimiter(chr, buf, pos)\n if(delimiterLength !== 0){\n const errField = this.__onField()\n if(errField !== undefined) return errField\n pos += delimiterLength - 1\n continue\n }\n }\n }\n if(this.state.commenting === false){\n if(max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size){\n const err = this.__error(\n new CsvError('CSV_MAX_RECORD_SIZE', [\n 'Max Record Size:',\n 'record exceed the maximum number of tolerated bytes',\n `of ${max_record_size}`,\n `at line ${this.info.lines}`,\n ], this.__context())\n )\n if(err !== undefined) return err\n }\n }\n\n const lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(chr)\n // rtrim in non quoting is handle in __onField\n const rappend = rtrim === false || this.state.wasQuoting === false\n if( lappend === true && rappend === true ){\n this.state.field.append(chr)\n }else if(rtrim === true && !this.__isCharTrimable(chr)){\n const err = this.__error(\n new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n 'found non trimable byte after quote',\n `at line ${this.info.lines}`,\n ], this.__context())\n )\n if(err !== undefined) return err\n }\n }\n if(end === true){\n // Ensure we are not ending in a quoting state\n if(this.state.quoting === true){\n const err = this.__error(\n new CsvError('CSV_QUOTE_NOT_CLOSED', [\n 'Quote Not Closed:',\n `the parsing is finished with an opening quote at line ${this.info.lines}`,\n ], this.__context())\n )\n if(err !== undefined) return err\n }else{\n // Skip last line if it has no characters\n if(this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0){\n const errField = this.__onField()\n if(errField !== undefined) return errField\n const errRecord = this.__onRow()\n if(errRecord !== undefined) return errRecord\n }else if(this.state.wasRowDelimiter === true){\n this.info.empty_lines++\n }else if(this.state.commenting === true){\n this.info.comment_lines++\n }\n }\n }else{\n this.state.previousBuf = buf.slice(pos)\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++\n this.state.wasRowDelimiter = false\n }\n }\n // Helper to test if a character is a space or a line delimiter\n __isCharTrimable(chr){\n return chr === space || chr === tab || chr === cr || chr === nl\n }\n __onRow(){\n const {columns, info, from, relax_column_count, relax_column_count_less, relax_column_count_more, raw, skip_lines_with_empty_values} = this.options\n const {enabled, record} = this.state\n if(enabled === false){\n return this.__resetRow()\n }\n // Convert the first line into column names\n const recordLength = record.length\n if(columns === true){\n if(isRecordEmpty(record)){\n this.__resetRow()\n return\n }\n return this.__firstLineToColumns(record)\n }\n if(columns === false && this.info.records === 0){\n this.state.expectedRecordLength = recordLength\n }\n if(recordLength !== this.state.expectedRecordLength){\n if(relax_column_count === true || \n (relax_column_count_less === true && recordLength < this.state.expectedRecordLength) ||\n (relax_column_count_more === true && recordLength > this.state.expectedRecordLength) ){\n this.info.invalid_field_length++\n }else{\n if(columns === false){\n const err = this.__error(\n new CsvError('CSV_INCONSISTENT_RECORD_LENGTH', [\n 'Invalid Record Length:',\n `expect ${this.state.expectedRecordLength},`,\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.__context(), {\n record: record,\n })\n )\n if(err !== undefined) return err\n }else{\n const err = this.__error(\n // CSV_INVALID_RECORD_LENGTH_DONT_MATCH_COLUMNS\n new CsvError('CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH', [\n 'Invalid Record Length:',\n `columns length is ${columns.length},`, // rename columns\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.__context(), {\n record: record,\n })\n )\n if(err !== undefined) return err\n }\n }\n }\n if(skip_lines_with_empty_values === true){\n if(isRecordEmpty(record)){\n this.__resetRow()\n return\n }\n }\n if(this.state.recordHasError === true){\n this.__resetRow()\n this.state.recordHasError = false\n return\n }\n this.info.records++\n if(from === 1 || this.info.records >= from){\n if(columns !== false){\n const obj = {}\n // Transform record array to an object\n for(let i in record){\n if(columns[i] === undefined || columns[i].disabled) continue\n obj[columns[i].name] = record[i]\n }\n const {objname} = this.options\n if(objname === undefined){\n if(raw === true || info === true){\n this.__push(Object.assign(\n {record: obj},\n (raw === true ? {raw: this.state.rawBuffer.toString()}: {}),\n (info === true ? {info: this.state.info}: {})\n ))\n }else{\n this.__push(obj)\n }\n }else{\n if(raw === true || info === true){\n this.__push(Object.assign(\n {record: [obj[objname], obj]},\n raw === true ? {raw: this.state.rawBuffer.toString()}: {},\n info === true ? {info: this.state.info}: {}\n ))\n }else{\n this.__push([obj[objname], obj])\n }\n }\n }else{\n if(raw === true || info === true){\n this.__push(Object.assign(\n {record: record},\n raw === true ? {raw: this.state.rawBuffer.toString()}: {},\n info === true ? {info: this.state.info}: {}\n ))\n }else{\n this.__push(record)\n }\n }\n }\n this.__resetRow()\n }\n __firstLineToColumns(record){\n const {firstLineToHeaders} = this.state\n try{\n const headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record)\n if(!Array.isArray(headers)){\n return this.__error(\n new CsvError('CSV_INVALID_COLUMN_MAPPING', [\n 'Invalid Column Mapping:',\n 'expect an array from column function,',\n `got ${JSON.stringify(headers)}`\n ], this.__context(), {\n headers: headers,\n })\n )\n }\n const normalizedHeaders = normalizeColumnsArray(headers)\n this.state.expectedRecordLength = normalizedHeaders.length\n this.options.columns = normalizedHeaders\n this.__resetRow()\n return\n }catch(err){\n return err\n }\n }\n __resetRow(){\n if(this.options.raw === true){\n this.state.rawBuffer.reset()\n }\n this.state.record = []\n this.state.record_length = 0\n }\n __onField(){\n const {cast, rtrim, max_record_size} = this.options\n const {enabled, wasQuoting} = this.state\n // Short circuit for the from_line options\n if(enabled === false){ /* this.options.columns !== true && */\n return this.__resetField()\n }\n let field = this.state.field.toString()\n if(rtrim === true && wasQuoting === false){\n field = field.trimRight()\n }\n if(cast === true){\n const [err, f] = this.__cast(field)\n if(err !== undefined) return err\n field = f\n }\n this.state.record.push(field)\n // Increment record length if record size must not exceed a limit\n if(max_record_size !== 0 && typeof field === 'string'){\n this.state.record_length += field.length\n }\n this.__resetField()\n }\n __resetField(){\n this.state.field.reset()\n this.state.wasQuoting = false\n }\n __push(record){\n const {on_record} = this.options\n if(on_record !== undefined){\n const context = this.__context()\n record = on_record.call(null, record, context)\n if(record === undefined || record === null){ return }\n }\n this.push(record)\n }\n // Return a tuple with the error and the casted value\n __cast(field){\n const {columns, relax_column_count} = this.options\n const isColumns = Array.isArray(columns)\n // Dont loose time calling cast\n // because the final record is an object\n // and this field can't be associated to a key present in columns\n if( isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length ){\n return [undefined, undefined]\n }\n const context = this.__context()\n if(this.state.castField !== null){\n try{\n return [undefined, this.state.castField.call(null, field, context)]\n }catch(err){\n return [err]\n }\n }\n if(this.__isFloat(field)){\n return [undefined, parseFloat(field)]\n }else if(this.options.cast_date !== false){\n return [undefined, this.options.cast_date.call(null, field, context)]\n }\n return [undefined, field]\n }\n // Keep it in case we implement the `cast_int` option\n // __isInt(value){\n // // return Number.isInteger(parseInt(value))\n // // return !isNaN( parseInt( obj ) );\n // return /^(\\-|\\+)?[1-9][0-9]*$/.test(value)\n // }\n __isFloat(value){\n return (value - parseFloat( value ) + 1) >= 0 // Borrowed from jquery\n }\n __compareBytes(sourceBuf, targetBuf, pos, firtByte){\n if(sourceBuf[0] !== firtByte) return 0\n const sourceLength = sourceBuf.length\n for(let i = 1; i < sourceLength; i++){\n if(sourceBuf[i] !== targetBuf[pos+i]) return 0\n }\n return sourceLength\n }\n __needMoreData(i, bufLen, end){\n if(end){\n return false\n }\n const {comment, delimiter} = this.options\n const {quoting, recordDelimiterMaxLength} = this.state\n const numOfCharLeft = bufLen - i - 1\n const requiredLength = Math.max(\n // Skip if the remaining buffer smaller than comment\n comment ? comment.length : 0,\n // Skip if the remaining buffer smaller than row delimiter\n recordDelimiterMaxLength,\n // Skip if the remaining buffer can be row delimiter following the closing quote\n // 1 is for quote.length\n quoting ? (1 + recordDelimiterMaxLength) : 0,\n // Skip if the remaining buffer can be delimiter\n delimiter.length,\n // Skip if the remaining buffer can be escape sequence\n // 1 is for escape.length\n 1\n )\n return numOfCharLeft < requiredLength\n }\n __isDelimiter(chr, buf, pos){\n const {delimiter} = this.options\n const delLength = delimiter.length\n if(delimiter[0] !== chr) return 0\n for(let i = 1; i < delLength; i++){\n if(delimiter[i] !== buf[pos+i]) return 0\n }\n return delimiter.length\n }\n __isRecordDelimiter(chr, buf, pos){\n const {record_delimiter} = this.options\n const recordDelimiterLength = record_delimiter.length\n loop1: for(let i = 0; i < recordDelimiterLength; i++){\n const rd = record_delimiter[i]\n const rdLength = rd.length\n if(rd[0] !== chr){\n continue\n }\n for(let j = 1; j < rdLength; j++){\n if(rd[j] !== buf[pos+j]){\n continue loop1\n }\n }\n return rd.length\n }\n return 0\n }\n __autoDiscoverRowDelimiter(buf, pos){\n const chr = buf[pos]\n if(chr === cr){\n if(buf[pos+1] === nl){\n this.options.record_delimiter.push(Buffer.from('\\r\\n'))\n this.state.recordDelimiterMaxLength = 2\n return 2\n }else{\n this.options.record_delimiter.push(Buffer.from('\\r'))\n this.state.recordDelimiterMaxLength = 1\n return 1\n }\n }else if(chr === nl){\n this.options.record_delimiter.push(Buffer.from('\\n'))\n this.state.recordDelimiterMaxLength = 1\n return 1\n }\n return 0\n }\n __error(msg){\n const {skip_lines_with_error} = this.options\n const err = typeof msg === 'string' ? new Error(msg) : msg\n if(skip_lines_with_error){\n this.state.recordHasError = true\n this.emit('skip', err)\n return undefined\n }else{\n return err\n }\n }\n __context(){\n const {columns} = this.options\n const isColumns = Array.isArray(columns)\n return {\n column: isColumns === true ?\n ( columns.length > this.state.record.length ?\n columns[this.state.record.length].name :\n null\n ) :\n this.state.record.length,\n empty_lines: this.info.empty_lines,\n header: columns === true,\n index: this.state.record.length,\n invalid_field_length: this.info.invalid_field_length,\n quoting: this.state.wasQuoting,\n lines: this.info.lines,\n records: this.info.records\n }\n }\n}\n\nconst parse = function(){\n let data, options, callback\n for(let i in arguments){\n const argument = arguments[i]\n const type = typeof argument\n if(data === undefined && (typeof argument === 'string' || Buffer.isBuffer(argument))){\n data = argument\n }else if(options === undefined && isObject(argument)){\n options = argument\n }else if(callback === undefined && type === 'function'){\n callback = argument\n }else{\n throw new CsvError('CSV_INVALID_ARGUMENT', [\n 'Invalid argument:',\n `got ${JSON.stringify(argument)} at index ${i}`\n ])\n }\n }\n const parser = new Parser(options)\n if(callback){\n const records = options === undefined || options.objname === undefined ? [] : {}\n parser.on('readable', function(){\n let record\n while((record = this.read()) !== null){\n if(options === undefined || options.objname === undefined){\n records.push(record)\n }else{\n records[record[0]] = record[1]\n }\n }\n })\n parser.on('error', function(err){\n callback(err, undefined, parser.info)\n })\n parser.on('end', function(){\n callback(undefined, records, parser.info)\n })\n }\n if(data !== undefined){\n parser.write(data)\n parser.end()\n }\n return parser\n}\n\nclass CsvError extends Error {\n constructor(code, message, ...contexts) {\n if(Array.isArray(message)) message = message.join(' ')\n super(message)\n Error.captureStackTrace(this, CsvError)\n this.code = code\n for(const context of contexts){\n for(const key in context){\n const value = context[key]\n this[key] = Buffer.isBuffer(value) ? value.toString() : value == null ? value : JSON.parse(JSON.stringify(value))\n }\n }\n }\n}\n\nparse.Parser = Parser\n\nparse.CsvError = CsvError\n\nmodule.exports = parse\n\nconst underscore = function(str){\n return str.replace(/([A-Z])/g, function(_, match){\n return '_' + match.toLowerCase()\n })\n}\n\nconst isObject = function(obj){\n return (typeof obj === 'object' && obj !== null && !Array.isArray(obj))\n}\n\nconst isRecordEmpty = function(record){\n return record.every( (field) => field == null || field.toString && field.toString().trim() === '' )\n}\n\nconst normalizeColumnsArray = function(columns){\n const normalizedColumns = [];\n\n for(let i=0; i< columns.length; i++){\n const column = columns[i]\n if(column === undefined || column === null || column === false){\n normalizedColumns[i] = { disabled: true }\n }else if(typeof column === 'string'){\n normalizedColumns[i] = { name: column }\n }else if(isObject(column)){\n if(typeof column.name !== 'string'){\n throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', [\n 'Option columns missing name:',\n `property \"name\" is required at position ${i}`,\n 'when column is an object literal'\n ])\n }\n normalizedColumns[i] = column\n }else{\n throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', [\n 'Invalid column definition:',\n 'expect a string or a literal object,',\n `got ${JSON.stringify(column)} at position ${i}`\n ])\n }\n }\n return normalizedColumns;\n}\n","\nconst parse = require('.')\n\nmodule.exports = function(data, options={}){\n if(typeof data === 'string'){\n data = Buffer.from(data)\n }\n const records = options && options.objname ? {} : []\n const parser = new parse.Parser(options)\n parser.push = function(record){\n if(options.objname === undefined)\n records.push(record)\n else{\n records[record[0]] = record[1]\n }\n }\n const err1 = parser.__parse(data, false)\n if(err1 !== undefined) throw err1\n const err2 = parser.__parse(undefined, true)\n if(err2 !== undefined) throw err2\n return records\n}\n","import SplayTree from 'splaytree';\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\nvar isInBbox = function isInBbox(bbox, point) {\n return bbox.ll.x <= point.x && point.x <= bbox.ur.x && bbox.ll.y <= point.y && point.y <= bbox.ur.y;\n};\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\n\nvar getBboxOverlap = function getBboxOverlap(b1, b2) {\n // check if the bboxes overlap at all\n if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y) return null; // find the middle two X values\n\n var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;\n var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x; // find the middle two Y values\n\n var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;\n var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y; // put those middle values together to get the overlap\n\n return {\n ll: {\n x: lowerX,\n y: lowerY\n },\n ur: {\n x: upperX,\n y: upperY\n }\n };\n};\n\n/* Javascript doesn't do integer math. Everything is\n * floating point with percision Number.EPSILON.\n *\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON\n */\nvar epsilon = Number.EPSILON; // IE Polyfill\n\nif (epsilon === undefined) epsilon = Math.pow(2, -52);\nvar EPSILON_SQ = epsilon * epsilon;\n/* FLP comparator */\n\nvar cmp = function cmp(a, b) {\n // check if they're both 0\n if (-epsilon < a && a < epsilon) {\n if (-epsilon < b && b < epsilon) {\n return 0;\n }\n } // check if they're flp equal\n\n\n var ab = a - b;\n\n if (ab * ab < EPSILON_SQ * a * b) {\n return 0;\n } // normal comparison\n\n\n return a < b ? -1 : 1;\n};\n\n/**\n * This class rounds incoming values sufficiently so that\n * floating points problems are, for the most part, avoided.\n *\n * Incoming points are have their x & y values tested against\n * all previously seen x & y values. If either is 'too close'\n * to a previously seen value, it's value is 'snapped' to the\n * previously seen value.\n *\n * All points should be rounded by this class before being\n * stored in any data structures in the rest of this algorithm.\n */\n\nvar PtRounder =\n/*#__PURE__*/\nfunction () {\n function PtRounder() {\n _classCallCheck(this, PtRounder);\n\n this.reset();\n }\n\n _createClass(PtRounder, [{\n key: \"reset\",\n value: function reset() {\n this.xRounder = new CoordRounder();\n this.yRounder = new CoordRounder();\n }\n }, {\n key: \"round\",\n value: function round(x, y) {\n return {\n x: this.xRounder.round(x),\n y: this.yRounder.round(y)\n };\n }\n }]);\n\n return PtRounder;\n}();\n\nvar CoordRounder =\n/*#__PURE__*/\nfunction () {\n function CoordRounder() {\n _classCallCheck(this, CoordRounder);\n\n this.tree = new SplayTree(); // preseed with 0 so we don't end up with values < Number.EPSILON\n\n this.round(0);\n } // Note: this can rounds input values backwards or forwards.\n // You might ask, why not restrict this to just rounding\n // forwards? Wouldn't that allow left endpoints to always\n // remain left endpoints during splitting (never change to\n // right). No - it wouldn't, because we snap intersections\n // to endpoints (to establish independence from the segment\n // angle for t-intersections).\n\n\n _createClass(CoordRounder, [{\n key: \"round\",\n value: function round(coord) {\n var node = this.tree.add(coord);\n var prevNode = this.tree.prev(node);\n\n if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {\n this.tree.remove(coord);\n return prevNode.key;\n }\n\n var nextNode = this.tree.next(node);\n\n if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {\n this.tree.remove(coord);\n return nextNode.key;\n }\n\n return coord;\n }\n }]);\n\n return CoordRounder;\n}(); // singleton available by import\n\n\nvar rounder = new PtRounder();\n\n/* Cross Product of two vectors with first point at origin */\n\nvar crossProduct = function crossProduct(a, b) {\n return a.x * b.y - a.y * b.x;\n};\n/* Dot Product of two vectors with first point at origin */\n\nvar dotProduct = function dotProduct(a, b) {\n return a.x * b.x + a.y * b.y;\n};\n/* Comparator for two vectors with same starting point */\n\nvar compareVectorAngles = function compareVectorAngles(basePt, endPt1, endPt2) {\n var v1 = {\n x: endPt1.x - basePt.x,\n y: endPt1.y - basePt.y\n };\n var v2 = {\n x: endPt2.x - basePt.x,\n y: endPt2.y - basePt.y\n };\n var kross = crossProduct(v1, v2);\n return cmp(kross, 0);\n};\nvar length = function length(v) {\n return Math.sqrt(dotProduct(v, v));\n};\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar sineOfAngle = function sineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\n\nvar cosineOfAngle = function cosineOfAngle(pShared, pBase, pAngle) {\n var vBase = {\n x: pBase.x - pShared.x,\n y: pBase.y - pShared.y\n };\n var vAngle = {\n x: pAngle.x - pShared.x,\n y: pAngle.y - pShared.y\n };\n return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);\n};\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar horizontalIntersection = function horizontalIntersection(pt, v, y) {\n if (v.y === 0) return null;\n return {\n x: pt.x + v.x / v.y * (y - pt.y),\n y: y\n };\n};\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar verticalIntersection = function verticalIntersection(pt, v, x) {\n if (v.x === 0) return null;\n return {\n x: x,\n y: pt.y + v.y / v.x * (x - pt.x)\n };\n};\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\n\nvar intersection = function intersection(pt1, v1, pt2, v2) {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x === 0) return verticalIntersection(pt2, v2, pt1.x);\n if (v2.x === 0) return verticalIntersection(pt1, v1, pt2.x);\n if (v1.y === 0) return horizontalIntersection(pt2, v2, pt1.y);\n if (v2.y === 0) return horizontalIntersection(pt1, v1, pt2.y); // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n var kross = crossProduct(v1, v2);\n if (kross == 0) return null;\n var ve = {\n x: pt2.x - pt1.x,\n y: pt2.y - pt1.y\n };\n var d1 = crossProduct(ve, v1) / kross;\n var d2 = crossProduct(ve, v2) / kross; // take the average of the two calculations to minimize rounding error\n\n var x1 = pt1.x + d2 * v1.x,\n x2 = pt2.x + d1 * v2.x;\n var y1 = pt1.y + d2 * v1.y,\n y2 = pt2.y + d1 * v2.y;\n var x = (x1 + x2) / 2;\n var y = (y1 + y2) / 2;\n return {\n x: x,\n y: y\n };\n};\n\nvar SweepEvent =\n/*#__PURE__*/\nfunction () {\n _createClass(SweepEvent, null, [{\n key: \"compare\",\n // for ordering sweep events in the sweep event queue\n value: function compare(a, b) {\n // favor event with a point that the sweep line hits first\n var ptCmp = SweepEvent.comparePoints(a.point, b.point);\n if (ptCmp !== 0) return ptCmp; // the points are the same, so link them if needed\n\n if (a.point !== b.point) a.link(b); // favor right events over left\n\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1; // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n\n return Segment.compare(a.segment, b.segment);\n } // for ordering points in sweep line order\n\n }, {\n key: \"comparePoints\",\n value: function comparePoints(aPt, bPt) {\n if (aPt.x < bPt.x) return -1;\n if (aPt.x > bPt.x) return 1;\n if (aPt.y < bPt.y) return -1;\n if (aPt.y > bPt.y) return 1;\n return 0;\n } // Warning: 'point' input will be modified and re-used (for performance)\n\n }]);\n\n function SweepEvent(point, isLeft) {\n _classCallCheck(this, SweepEvent);\n\n if (point.events === undefined) point.events = [this];else point.events.push(this);\n this.point = point;\n this.isLeft = isLeft; // this.segment, this.otherSE set by factory\n }\n\n _createClass(SweepEvent, [{\n key: \"link\",\n value: function link(other) {\n if (other.point === this.point) {\n throw new Error('Tried to link already linked events');\n }\n\n var otherEvents = other.point.events;\n\n for (var i = 0, iMax = otherEvents.length; i < iMax; i++) {\n var evt = otherEvents[i];\n this.point.events.push(evt);\n evt.point = this.point;\n }\n\n this.checkForConsuming();\n }\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n\n }, {\n key: \"checkForConsuming\",\n value: function checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n // Compare each pair of events to see if other events also match\n var numEvents = this.point.events.length;\n\n for (var i = 0; i < numEvents; i++) {\n var evt1 = this.point.events[i];\n if (evt1.segment.consumedBy !== undefined) continue;\n\n for (var j = i + 1; j < numEvents; j++) {\n var evt2 = this.point.events[j];\n if (evt2.consumedBy !== undefined) continue;\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue;\n evt1.segment.consume(evt2.segment);\n }\n }\n }\n }, {\n key: \"getAvailableLinkedEvents\",\n value: function getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n var events = [];\n\n for (var i = 0, iMax = this.point.events.length; i < iMax; i++) {\n var evt = this.point.events[i];\n\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt);\n }\n }\n\n return events;\n }\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n\n }, {\n key: \"getLeftmostComparator\",\n value: function getLeftmostComparator(baseEvent) {\n var _this = this;\n\n var cache = new Map();\n\n var fillCache = function fillCache(linkedEvent) {\n var nextEvent = linkedEvent.otherSE;\n cache.set(linkedEvent, {\n sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)\n });\n };\n\n return function (a, b) {\n if (!cache.has(a)) fillCache(a);\n if (!cache.has(b)) fillCache(b);\n\n var _cache$get = cache.get(a),\n asine = _cache$get.sine,\n acosine = _cache$get.cosine;\n\n var _cache$get2 = cache.get(b),\n bsine = _cache$get2.sine,\n bcosine = _cache$get2.cosine; // both on or above x-axis\n\n\n if (asine >= 0 && bsine >= 0) {\n if (acosine < bcosine) return 1;\n if (acosine > bcosine) return -1;\n return 0;\n } // both below x-axis\n\n\n if (asine < 0 && bsine < 0) {\n if (acosine < bcosine) return -1;\n if (acosine > bcosine) return 1;\n return 0;\n } // one above x-axis, one below\n\n\n if (bsine < asine) return -1;\n if (bsine > asine) return 1;\n return 0;\n };\n }\n }]);\n\n return SweepEvent;\n}();\n\n// segments and sweep events when all else is identical\n\nvar segmentId = 0;\n\nvar Segment =\n/*#__PURE__*/\nfunction () {\n _createClass(Segment, null, [{\n key: \"compare\",\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n value: function compare(a, b) {\n var alx = a.leftSE.point.x;\n var blx = b.leftSE.point.x;\n var arx = a.rightSE.point.x;\n var brx = b.rightSE.point.x; // check if they're even in the same vertical plane\n\n if (brx < alx) return 1;\n if (arx < blx) return -1;\n var aly = a.leftSE.point.y;\n var bly = b.leftSE.point.y;\n var ary = a.rightSE.point.y;\n var bry = b.rightSE.point.y; // is left endpoint of segment B the right-more?\n\n if (alx < blx) {\n // are the two segments in the same horizontal plane?\n if (bly < aly && bly < ary) return 1;\n if (bly > aly && bly > ary) return -1; // is the B left endpoint colinear to segment A?\n\n var aCmpBLeft = a.comparePoint(b.leftSE.point);\n if (aCmpBLeft < 0) return 1;\n if (aCmpBLeft > 0) return -1; // is the A right endpoint colinear to segment B ?\n\n var bCmpARight = b.comparePoint(a.rightSE.point);\n if (bCmpARight !== 0) return bCmpARight; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return -1;\n } // is left endpoint of segment A the right-more?\n\n\n if (alx > blx) {\n if (aly < bly && aly < bry) return -1;\n if (aly > bly && aly > bry) return 1; // is the A left endpoint colinear to segment B?\n\n var bCmpALeft = b.comparePoint(a.leftSE.point);\n if (bCmpALeft !== 0) return bCmpALeft; // is the B right endpoint colinear to segment A?\n\n var aCmpBRight = a.comparePoint(b.rightSE.point);\n if (aCmpBRight < 0) return 1;\n if (aCmpBRight > 0) return -1; // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n\n return 1;\n } // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n // consider the lower left-endpoint to come first\n\n\n if (aly < bly) return -1;\n if (aly > bly) return 1; // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n // is the A right endpoint more left-more?\n\n if (arx < brx) {\n var _bCmpARight = b.comparePoint(a.rightSE.point);\n\n if (_bCmpARight !== 0) return _bCmpARight;\n } // is the B right endpoint more left-more?\n\n\n if (arx > brx) {\n var _aCmpBRight = a.comparePoint(b.rightSE.point);\n\n if (_aCmpBRight < 0) return 1;\n if (_aCmpBRight > 0) return -1;\n }\n\n if (arx !== brx) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n var ay = ary - aly;\n var ax = arx - alx;\n var by = bry - bly;\n var bx = brx - blx;\n if (ay > ax && by < bx) return 1;\n if (ay < ax && by > bx) return -1;\n } // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n\n\n if (arx > brx) return 1;\n if (arx < brx) return -1; // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n // consider the lower right-endpoint to come first\n\n if (ary < bry) return -1;\n if (ary > bry) return 1; // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n\n if (a.id < b.id) return -1;\n if (a.id > b.id) return 1; // identical segment, ie a === b\n\n return 0;\n }\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n\n }]);\n\n function Segment(leftSE, rightSE, rings, windings) {\n _classCallCheck(this, Segment);\n\n this.id = ++segmentId;\n this.leftSE = leftSE;\n leftSE.segment = this;\n leftSE.otherSE = rightSE;\n this.rightSE = rightSE;\n rightSE.segment = this;\n rightSE.otherSE = leftSE;\n this.rings = rings;\n this.windings = windings; // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n _createClass(Segment, [{\n key: \"replaceRightSE\",\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n value: function replaceRightSE(newRightSE) {\n this.rightSE = newRightSE;\n this.rightSE.segment = this;\n this.rightSE.otherSE = this.leftSE;\n this.leftSE.otherSE = this.rightSE;\n }\n }, {\n key: \"bbox\",\n value: function bbox() {\n var y1 = this.leftSE.point.y;\n var y2 = this.rightSE.point.y;\n return {\n ll: {\n x: this.leftSE.point.x,\n y: y1 < y2 ? y1 : y2\n },\n ur: {\n x: this.rightSE.point.x,\n y: y1 > y2 ? y1 : y2\n }\n };\n }\n /* A vector from the left point to the right */\n\n }, {\n key: \"vector\",\n value: function vector() {\n return {\n x: this.rightSE.point.x - this.leftSE.point.x,\n y: this.rightSE.point.y - this.leftSE.point.y\n };\n }\n }, {\n key: \"isAnEndpoint\",\n value: function isAnEndpoint(pt) {\n return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;\n }\n /* Compare this segment with a point.\n *\n * A point P is considered to be colinear to a segment if there\n * exists a distance D such that if we travel along the segment\n * from one * endpoint towards the other a distance D, we find\n * ourselves at point P.\n *\n * Return value indicates:\n *\n * 1: point lies above the segment (to the left of vertical)\n * 0: point is colinear to segment\n * -1: point lies below the segment (to the right of vertical)\n */\n\n }, {\n key: \"comparePoint\",\n value: function comparePoint(point) {\n if (this.isAnEndpoint(point)) return 0;\n var lPt = this.leftSE.point;\n var rPt = this.rightSE.point;\n var v = this.vector(); // Exactly vertical segments.\n\n if (lPt.x === rPt.x) {\n if (point.x === lPt.x) return 0;\n return point.x < lPt.x ? 1 : -1;\n } // Nearly vertical segments with an intersection.\n // Check to see where a point on the line with matching Y coordinate is.\n\n\n var yDist = (point.y - lPt.y) / v.y;\n var xFromYDist = lPt.x + yDist * v.x;\n if (point.x === xFromYDist) return 0; // General case.\n // Check to see where a point on the line with matching X coordinate is.\n\n var xDist = (point.x - lPt.x) / v.x;\n var yFromXDist = lPt.y + xDist * v.y;\n if (point.y === yFromXDist) return 0;\n return point.y < yFromXDist ? -1 : 1;\n }\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n\n }, {\n key: \"getIntersection\",\n value: function getIntersection(other) {\n // If bboxes don't overlap, there can't be any intersections\n var tBbox = this.bbox();\n var oBbox = other.bbox();\n var bboxOverlap = getBboxOverlap(tBbox, oBbox);\n if (bboxOverlap === null) return null; // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n var tlp = this.leftSE.point;\n var trp = this.rightSE.point;\n var olp = other.leftSE.point;\n var orp = other.rightSE.point; // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n\n var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;\n var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;\n var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;\n var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0; // do left endpoints match?\n\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp;\n if (!touchesThisRSE && touchesOtherRSE) return orp; // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n\n return null;\n } // does this left endpoint matches (other doesn't)\n\n\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x === orp.x && tlp.y === orp.y) return null;\n } // t-intersection on left endpoint\n\n\n return tlp;\n } // does other left endpoint matches (this doesn't)\n\n\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x === olp.x && trp.y === olp.y) return null;\n } // t-intersection on left endpoint\n\n\n return olp;\n } // trivial intersection on right endpoints\n\n\n if (touchesThisRSE && touchesOtherRSE) return null; // t-intersections on just one right endpoint\n\n if (touchesThisRSE) return trp;\n if (touchesOtherRSE) return orp; // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n\n var pt = intersection(tlp, this.vector(), olp, other.vector()); // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n\n if (pt === null) return null; // is the intersection found between the lines not on the segments?\n\n if (!isInBbox(bboxOverlap, pt)) return null; // round the the computed point if needed\n\n return rounder.round(pt.x, pt.y);\n }\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n\n }, {\n key: \"split\",\n value: function split(point) {\n var newEvents = [];\n var alreadyLinked = point.events !== undefined;\n var newLeftSE = new SweepEvent(point, true);\n var newRightSE = new SweepEvent(point, false);\n var oldRightSE = this.rightSE;\n this.replaceRightSE(newRightSE);\n newEvents.push(newRightSE);\n newEvents.push(newLeftSE);\n var newSeg = new Segment(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice()); // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n\n if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {\n newSeg.swapEvents();\n }\n\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents();\n } // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n\n\n if (alreadyLinked) {\n newLeftSE.checkForConsuming();\n newRightSE.checkForConsuming();\n }\n\n return newEvents;\n }\n /* Swap which event is left and right */\n\n }, {\n key: \"swapEvents\",\n value: function swapEvents() {\n var tmpEvt = this.rightSE;\n this.rightSE = this.leftSE;\n this.leftSE = tmpEvt;\n this.leftSE.isLeft = true;\n this.rightSE.isLeft = false;\n\n for (var i = 0, iMax = this.windings.length; i < iMax; i++) {\n this.windings[i] *= -1;\n }\n }\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n\n }, {\n key: \"consume\",\n value: function consume(other) {\n var consumer = this;\n var consumee = other;\n\n while (consumer.consumedBy) {\n consumer = consumer.consumedBy;\n }\n\n while (consumee.consumedBy) {\n consumee = consumee.consumedBy;\n }\n\n var cmp = Segment.compare(consumer, consumee);\n if (cmp === 0) return; // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n\n if (cmp > 0) {\n var tmp = consumer;\n consumer = consumee;\n consumee = tmp;\n } // make sure a segment doesn't consume it's prev\n\n\n if (consumer.prev === consumee) {\n var _tmp = consumer;\n consumer = consumee;\n consumee = _tmp;\n }\n\n for (var i = 0, iMax = consumee.rings.length; i < iMax; i++) {\n var ring = consumee.rings[i];\n var winding = consumee.windings[i];\n var index = consumer.rings.indexOf(ring);\n\n if (index === -1) {\n consumer.rings.push(ring);\n consumer.windings.push(winding);\n } else consumer.windings[index] += winding;\n }\n\n consumee.rings = null;\n consumee.windings = null;\n consumee.consumedBy = consumer; // mark sweep events consumed as to maintain ordering in sweep event queue\n\n consumee.leftSE.consumedBy = consumer.leftSE;\n consumee.rightSE.consumedBy = consumer.rightSE;\n }\n /* The first segment previous segment chain that is in the result */\n\n }, {\n key: \"prevInResult\",\n value: function prevInResult() {\n if (this._prevInResult !== undefined) return this._prevInResult;\n if (!this.prev) this._prevInResult = null;else if (this.prev.isInResult()) this._prevInResult = this.prev;else this._prevInResult = this.prev.prevInResult();\n return this._prevInResult;\n }\n }, {\n key: \"beforeState\",\n value: function beforeState() {\n if (this._beforeState !== undefined) return this._beforeState;\n if (!this.prev) this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: []\n };else {\n var seg = this.prev.consumedBy || this.prev;\n this._beforeState = seg.afterState();\n }\n return this._beforeState;\n }\n }, {\n key: \"afterState\",\n value: function afterState() {\n if (this._afterState !== undefined) return this._afterState;\n var beforeState = this.beforeState();\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: []\n };\n var ringsAfter = this._afterState.rings;\n var windingsAfter = this._afterState.windings;\n var mpsAfter = this._afterState.multiPolys; // calculate ringsAfter, windingsAfter\n\n for (var i = 0, iMax = this.rings.length; i < iMax; i++) {\n var ring = this.rings[i];\n var winding = this.windings[i];\n var index = ringsAfter.indexOf(ring);\n\n if (index === -1) {\n ringsAfter.push(ring);\n windingsAfter.push(winding);\n } else windingsAfter[index] += winding;\n } // calcualte polysAfter\n\n\n var polysAfter = [];\n var polysExclude = [];\n\n for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {\n if (windingsAfter[_i] === 0) continue; // non-zero rule\n\n var _ring = ringsAfter[_i];\n var poly = _ring.poly;\n if (polysExclude.indexOf(poly) !== -1) continue;\n if (_ring.isExterior) polysAfter.push(poly);else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly);\n\n var _index = polysAfter.indexOf(_ring.poly);\n\n if (_index !== -1) polysAfter.splice(_index, 1);\n }\n } // calculate multiPolysAfter\n\n\n for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {\n var mp = polysAfter[_i2].multiPoly;\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp);\n }\n\n return this._afterState;\n }\n /* Is this segment part of the final result? */\n\n }, {\n key: \"isInResult\",\n value: function isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false;\n if (this._isInResult !== undefined) return this._isInResult;\n var mpsBefore = this.beforeState().multiPolys;\n var mpsAfter = this.afterState().multiPolys;\n\n switch (operation.type) {\n case 'union':\n {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n var noBefores = mpsBefore.length === 0;\n var noAfters = mpsAfter.length === 0;\n this._isInResult = noBefores !== noAfters;\n break;\n }\n\n case 'intersection':\n {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n var least;\n var most;\n\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length;\n most = mpsAfter.length;\n } else {\n least = mpsAfter.length;\n most = mpsBefore.length;\n }\n\n this._isInResult = most === operation.numMultiPolys && least < most;\n break;\n }\n\n case 'xor':\n {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n var diff = Math.abs(mpsBefore.length - mpsAfter.length);\n this._isInResult = diff % 2 === 1;\n break;\n }\n\n case 'difference':\n {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n var isJustSubject = function isJustSubject(mps) {\n return mps.length === 1 && mps[0].isSubject;\n };\n\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);\n break;\n }\n\n default:\n throw new Error(\"Unrecognized operation type found \".concat(operation.type));\n }\n\n return this._isInResult;\n }\n }], [{\n key: \"fromRing\",\n value: function fromRing(pt1, pt2, ring) {\n var leftPt, rightPt, winding; // ordering the two points according to sweep line ordering\n\n var cmpPts = SweepEvent.comparePoints(pt1, pt2);\n\n if (cmpPts < 0) {\n leftPt = pt1;\n rightPt = pt2;\n winding = 1;\n } else if (cmpPts > 0) {\n leftPt = pt2;\n rightPt = pt1;\n winding = -1;\n } else throw new Error(\"Tried to create degenerate segment at [\".concat(pt1.x, \", \").concat(pt1.y, \"]\"));\n\n var leftSE = new SweepEvent(leftPt, true);\n var rightSE = new SweepEvent(rightPt, false);\n return new Segment(leftSE, rightSE, [ring], [winding]);\n }\n }]);\n\n return Segment;\n}();\n\nvar RingIn =\n/*#__PURE__*/\nfunction () {\n function RingIn(geomRing, poly, isExterior) {\n _classCallCheck(this, RingIn);\n\n if (!Array.isArray(geomRing) || geomRing.length === 0) {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n this.poly = poly;\n this.isExterior = isExterior;\n this.segments = [];\n\n if (typeof geomRing[0][0] !== 'number' || typeof geomRing[0][1] !== 'number') {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);\n this.bbox = {\n ll: {\n x: firstPoint.x,\n y: firstPoint.y\n },\n ur: {\n x: firstPoint.x,\n y: firstPoint.y\n }\n };\n var prevPoint = firstPoint;\n\n for (var i = 1, iMax = geomRing.length; i < iMax; i++) {\n if (typeof geomRing[i][0] !== 'number' || typeof geomRing[i][1] !== 'number') {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n var point = rounder.round(geomRing[i][0], geomRing[i][1]); // skip repeated points\n\n if (point.x === prevPoint.x && point.y === prevPoint.y) continue;\n this.segments.push(Segment.fromRing(prevPoint, point, this));\n if (point.x < this.bbox.ll.x) this.bbox.ll.x = point.x;\n if (point.y < this.bbox.ll.y) this.bbox.ll.y = point.y;\n if (point.x > this.bbox.ur.x) this.bbox.ur.x = point.x;\n if (point.y > this.bbox.ur.y) this.bbox.ur.y = point.y;\n prevPoint = point;\n } // add segment from last to first if last is not the same as first\n\n\n if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {\n this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));\n }\n }\n\n _createClass(RingIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.segments.length; i < iMax; i++) {\n var segment = this.segments[i];\n sweepEvents.push(segment.leftSE);\n sweepEvents.push(segment.rightSE);\n }\n\n return sweepEvents;\n }\n }]);\n\n return RingIn;\n}();\nvar PolyIn =\n/*#__PURE__*/\nfunction () {\n function PolyIn(geomPoly, multiPoly) {\n _classCallCheck(this, PolyIn);\n\n if (!Array.isArray(geomPoly)) {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n this.exteriorRing = new RingIn(geomPoly[0], this, true); // copy by value\n\n this.bbox = {\n ll: {\n x: this.exteriorRing.bbox.ll.x,\n y: this.exteriorRing.bbox.ll.y\n },\n ur: {\n x: this.exteriorRing.bbox.ur.x,\n y: this.exteriorRing.bbox.ur.y\n }\n };\n this.interiorRings = [];\n\n for (var i = 1, iMax = geomPoly.length; i < iMax; i++) {\n var ring = new RingIn(geomPoly[i], this, false);\n if (ring.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = ring.bbox.ll.x;\n if (ring.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = ring.bbox.ll.y;\n if (ring.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = ring.bbox.ur.x;\n if (ring.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = ring.bbox.ur.y;\n this.interiorRings.push(ring);\n }\n\n this.multiPoly = multiPoly;\n }\n\n _createClass(PolyIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = this.exteriorRing.getSweepEvents();\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringSweepEvents = this.interiorRings[i].getSweepEvents();\n\n for (var j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return PolyIn;\n}();\nvar MultiPolyIn =\n/*#__PURE__*/\nfunction () {\n function MultiPolyIn(geom, isSubject) {\n _classCallCheck(this, MultiPolyIn);\n\n if (!Array.isArray(geom)) {\n throw new Error('Input geometry is not a valid Polygon or MultiPolygon');\n }\n\n try {\n // if the input looks like a polygon, convert it to a multipolygon\n if (typeof geom[0][0][0] === 'number') geom = [geom];\n } catch (ex) {// The input is either malformed or has empty arrays.\n // In either case, it will be handled later on.\n }\n\n this.polys = [];\n this.bbox = {\n ll: {\n x: Number.POSITIVE_INFINITY,\n y: Number.POSITIVE_INFINITY\n },\n ur: {\n x: Number.NEGATIVE_INFINITY,\n y: Number.NEGATIVE_INFINITY\n }\n };\n\n for (var i = 0, iMax = geom.length; i < iMax; i++) {\n var poly = new PolyIn(geom[i], this);\n if (poly.bbox.ll.x < this.bbox.ll.x) this.bbox.ll.x = poly.bbox.ll.x;\n if (poly.bbox.ll.y < this.bbox.ll.y) this.bbox.ll.y = poly.bbox.ll.y;\n if (poly.bbox.ur.x > this.bbox.ur.x) this.bbox.ur.x = poly.bbox.ur.x;\n if (poly.bbox.ur.y > this.bbox.ur.y) this.bbox.ur.y = poly.bbox.ur.y;\n this.polys.push(poly);\n }\n\n this.isSubject = isSubject;\n }\n\n _createClass(MultiPolyIn, [{\n key: \"getSweepEvents\",\n value: function getSweepEvents() {\n var sweepEvents = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polySweepEvents = this.polys[i].getSweepEvents();\n\n for (var j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j]);\n }\n }\n\n return sweepEvents;\n }\n }]);\n\n return MultiPolyIn;\n}();\n\nvar RingOut =\n/*#__PURE__*/\nfunction () {\n _createClass(RingOut, null, [{\n key: \"factory\",\n\n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n value: function factory(allSegments) {\n var ringsOut = [];\n\n for (var i = 0, iMax = allSegments.length; i < iMax; i++) {\n var segment = allSegments[i];\n if (!segment.isInResult() || segment.ringOut) continue;\n var prevEvent = null;\n var event = segment.leftSE;\n var nextEvent = segment.rightSE;\n var events = [event];\n var startingPoint = event.point;\n var intersectionLEs = [];\n /* Walk the chain of linked events to form a closed ring */\n\n while (true) {\n prevEvent = event;\n event = nextEvent;\n events.push(event);\n /* Is the ring complete? */\n\n if (event.point === startingPoint) break;\n\n while (true) {\n var availableLEs = event.getAvailableLinkedEvents();\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n\n if (availableLEs.length === 0) {\n var firstPt = events[0].point;\n var lastPt = events[events.length - 1].point;\n throw new Error(\"Unable to complete output ring starting at [\".concat(firstPt.x, \",\") + \" \".concat(firstPt.y, \"]. Last matching segment found ends at\") + \" [\".concat(lastPt.x, \", \").concat(lastPt.y, \"].\"));\n }\n /* Only one way to go, so cotinue on the path */\n\n\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE;\n break;\n }\n /* We must have an intersection. Check for a completed loop */\n\n\n var indexLE = null;\n\n for (var j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j;\n break;\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n\n\n if (indexLE !== null) {\n var intersectionLE = intersectionLEs.splice(indexLE)[0];\n var ringEvents = events.splice(intersectionLE.index);\n ringEvents.unshift(ringEvents[0].otherSE);\n ringsOut.push(new RingOut(ringEvents.reverse()));\n continue;\n }\n /* register the intersection */\n\n\n intersectionLEs.push({\n index: events.length,\n point: event.point\n });\n /* Choose the left-most option to continue the walk */\n\n var comparator = event.getLeftmostComparator(prevEvent);\n nextEvent = availableLEs.sort(comparator)[0].otherSE;\n break;\n }\n }\n\n ringsOut.push(new RingOut(events));\n }\n\n return ringsOut;\n }\n }]);\n\n function RingOut(events) {\n _classCallCheck(this, RingOut);\n\n this.events = events;\n\n for (var i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this;\n }\n\n this.poly = null;\n }\n\n _createClass(RingOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n var prevPt = this.events[0].point;\n var points = [prevPt];\n\n for (var i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n var _pt = this.events[i].point;\n var _nextPt = this.events[i + 1].point;\n if (compareVectorAngles(_pt, prevPt, _nextPt) === 0) continue;\n points.push(_pt);\n prevPt = _pt;\n } // ring was all (within rounding error of angle calc) colinear points\n\n\n if (points.length === 1) return null; // check if the starting point is necessary\n\n var pt = points[0];\n var nextPt = points[1];\n if (compareVectorAngles(pt, prevPt, nextPt) === 0) points.shift();\n points.push(points[0]);\n var step = this.isExteriorRing() ? 1 : -1;\n var iStart = this.isExteriorRing() ? 0 : points.length - 1;\n var iEnd = this.isExteriorRing() ? points.length : -1;\n var orderedPoints = [];\n\n for (var _i = iStart; _i != iEnd; _i += step) {\n orderedPoints.push([points[_i].x, points[_i].y]);\n }\n\n return orderedPoints;\n }\n }, {\n key: \"isExteriorRing\",\n value: function isExteriorRing() {\n if (this._isExteriorRing === undefined) {\n var enclosing = this.enclosingRing();\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;\n }\n\n return this._isExteriorRing;\n }\n }, {\n key: \"enclosingRing\",\n value: function enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing();\n }\n\n return this._enclosingRing;\n }\n /* Returns the ring that encloses this one, if any */\n\n }, {\n key: \"_calcEnclosingRing\",\n value: function _calcEnclosingRing() {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n var leftMostEvt = this.events[0];\n\n for (var i = 1, iMax = this.events.length; i < iMax; i++) {\n var evt = this.events[i];\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt;\n }\n\n var prevSeg = leftMostEvt.segment.prevInResult();\n var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null; // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n\n if (!prevPrevSeg) return prevSeg.ringOut; // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut;\n } else return prevSeg.ringOut.enclosingRing();\n } // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n\n\n prevSeg = prevPrevSeg.prevInResult();\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;\n }\n }\n }]);\n\n return RingOut;\n}();\nvar PolyOut =\n/*#__PURE__*/\nfunction () {\n function PolyOut(exteriorRing) {\n _classCallCheck(this, PolyOut);\n\n this.exteriorRing = exteriorRing;\n exteriorRing.poly = this;\n this.interiorRings = [];\n }\n\n _createClass(PolyOut, [{\n key: \"addInterior\",\n value: function addInterior(ring) {\n this.interiorRings.push(ring);\n ring.poly = this;\n }\n }, {\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [this.exteriorRing.getGeom()]; // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (geom[0] === null) return null;\n\n for (var i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n var ringGeom = this.interiorRings[i].getGeom(); // interior ring was all (within rounding error of angle calc) colinear points\n\n if (ringGeom === null) continue;\n geom.push(ringGeom);\n }\n\n return geom;\n }\n }]);\n\n return PolyOut;\n}();\nvar MultiPolyOut =\n/*#__PURE__*/\nfunction () {\n function MultiPolyOut(rings) {\n _classCallCheck(this, MultiPolyOut);\n\n this.rings = rings;\n this.polys = this._composePolys(rings);\n }\n\n _createClass(MultiPolyOut, [{\n key: \"getGeom\",\n value: function getGeom() {\n var geom = [];\n\n for (var i = 0, iMax = this.polys.length; i < iMax; i++) {\n var polyGeom = this.polys[i].getGeom(); // exterior ring was all (within rounding error of angle calc) colinear points\n\n if (polyGeom === null) continue;\n geom.push(polyGeom);\n }\n\n return geom;\n }\n }, {\n key: \"_composePolys\",\n value: function _composePolys(rings) {\n var polys = [];\n\n for (var i = 0, iMax = rings.length; i < iMax; i++) {\n var ring = rings[i];\n if (ring.poly) continue;\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring));else {\n var enclosingRing = ring.enclosingRing();\n if (!enclosingRing.poly) polys.push(new PolyOut(enclosingRing));\n enclosingRing.poly.addInterior(ring);\n }\n }\n\n return polys;\n }\n }]);\n\n return MultiPolyOut;\n}();\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nvar SweepLine =\n/*#__PURE__*/\nfunction () {\n function SweepLine(queue) {\n var comparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Segment.compare;\n\n _classCallCheck(this, SweepLine);\n\n this.queue = queue;\n this.tree = new SplayTree(comparator);\n this.segments = [];\n }\n\n _createClass(SweepLine, [{\n key: \"process\",\n value: function process(event) {\n var segment = event.segment;\n var newEvents = []; // if we've already been consumed by another segment,\n // clean up our body parts and get out\n\n if (event.consumedBy) {\n if (event.isLeft) this.queue.remove(event.otherSE);else this.tree.remove(segment);\n return newEvents;\n }\n\n var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);\n if (!node) throw new Error(\"Unable to find segment #\".concat(segment.id, \" \") + \"[\".concat(segment.leftSE.point.x, \", \").concat(segment.leftSE.point.y, \"] -> \") + \"[\".concat(segment.rightSE.point.x, \", \").concat(segment.rightSE.point.y, \"] \") + 'in SweepLine tree. Please submit a bug report.');\n var prevNode = node;\n var nextNode = node;\n var prevSeg = undefined;\n var nextSeg = undefined; // skip consumed segments still in tree\n\n while (prevSeg === undefined) {\n prevNode = this.tree.prev(prevNode);\n if (prevNode === null) prevSeg = null;else if (prevNode.key.consumedBy === undefined) prevSeg = prevNode.key;\n } // skip consumed segments still in tree\n\n\n while (nextSeg === undefined) {\n nextNode = this.tree.next(nextNode);\n if (nextNode === null) nextSeg = null;else if (nextNode.key.consumedBy === undefined) nextSeg = nextNode.key;\n }\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n var prevMySplitter = null;\n\n if (prevSeg) {\n var prevInter = prevSeg.getIntersection(segment);\n\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter;\n\n if (!prevSeg.isAnEndpoint(prevInter)) {\n var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);\n\n for (var i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i]);\n }\n }\n }\n } // Check for intersections against the next segment in the sweep line\n\n\n var nextMySplitter = null;\n\n if (nextSeg) {\n var nextInter = nextSeg.getIntersection(segment);\n\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter;\n\n if (!nextSeg.isAnEndpoint(nextInter)) {\n var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);\n\n for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {\n newEvents.push(_newEventsFromSplit[_i]);\n }\n }\n }\n } // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n\n\n if (prevMySplitter !== null || nextMySplitter !== null) {\n var mySplitter = null;\n if (prevMySplitter === null) mySplitter = nextMySplitter;else if (nextMySplitter === null) mySplitter = prevMySplitter;else {\n var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);\n mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;\n } // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n\n this.queue.remove(segment.rightSE);\n newEvents.push(segment.rightSE);\n\n var _newEventsFromSplit2 = segment.split(mySplitter);\n\n for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {\n newEvents.push(_newEventsFromSplit2[_i2]);\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.remove(segment);\n newEvents.push(event);\n } else {\n // done with left event\n this.segments.push(segment);\n segment.prev = prevSeg;\n }\n } else {\n // event.isRight\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n var inter = prevSeg.getIntersection(nextSeg);\n\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);\n\n for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {\n newEvents.push(_newEventsFromSplit3[_i3]);\n }\n }\n\n if (!nextSeg.isAnEndpoint(inter)) {\n var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);\n\n for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {\n newEvents.push(_newEventsFromSplit4[_i4]);\n }\n }\n }\n }\n\n this.tree.remove(segment);\n }\n\n return newEvents;\n }\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n\n }, {\n key: \"_splitSafely\",\n value: function _splitSafely(seg, pt) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.remove(seg);\n var rightSE = seg.rightSE;\n this.queue.remove(rightSE);\n var newEvents = seg.split(pt);\n newEvents.push(rightSE); // splitting can trigger consumption\n\n if (seg.consumedBy === undefined) this.tree.insert(seg);\n return newEvents;\n }\n }]);\n\n return SweepLine;\n}();\n\nvar Operation =\n/*#__PURE__*/\nfunction () {\n function Operation() {\n _classCallCheck(this, Operation);\n }\n\n _createClass(Operation, [{\n key: \"run\",\n value: function run(type, geom, moreGeoms) {\n operation.type = type;\n rounder.reset();\n /* Convert inputs to MultiPoly objects */\n\n var multipolys = [new MultiPolyIn(geom, true)];\n\n for (var i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n multipolys.push(new MultiPolyIn(moreGeoms[i], false));\n }\n\n operation.numMultiPolys = multipolys.length;\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n\n if (operation.type === 'difference') {\n // in place removal\n var subject = multipolys[0];\n var _i = 1;\n\n while (_i < multipolys.length) {\n if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null) _i++;else multipolys.splice(_i, 1);\n }\n }\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n\n\n if (operation.type === 'intersection') {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) {\n var mpA = multipolys[_i2];\n\n for (var j = _i2 + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return [];\n }\n }\n }\n /* Put segment endpoints in a priority queue */\n\n\n var queue = new SplayTree(SweepEvent.compare);\n\n for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) {\n var sweepEvents = multipolys[_i3].getSweepEvents();\n\n for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {\n queue.insert(sweepEvents[_j]);\n }\n }\n /* Pass the sweep line over those endpoints */\n\n\n var sweepLine = new SweepLine(queue);\n var prevQueueSize = queue.size;\n var node = queue.pop();\n\n while (node) {\n var evt = node.key;\n\n if (queue.size === prevQueueSize) {\n // prevents an infinite loop, an otherwise common manifestation of bugs\n var seg = evt.segment;\n throw new Error(\"Unable to pop() \".concat(evt.isLeft ? 'left' : 'right', \" SweepEvent \") + \"[\".concat(evt.point.x, \", \").concat(evt.point.y, \"] from segment #\").concat(seg.id, \" \") + \"[\".concat(seg.leftSE.point.x, \", \").concat(seg.leftSE.point.y, \"] -> \") + \"[\".concat(seg.rightSE.point.x, \", \").concat(seg.rightSE.point.y, \"] from queue. \") + 'Please file a bug report.');\n }\n\n var newEvents = sweepLine.process(evt);\n\n for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) {\n var _evt = newEvents[_i4];\n if (_evt.consumedBy === undefined) queue.insert(_evt);\n }\n\n prevQueueSize = queue.size;\n node = queue.pop();\n } // free some memory we don't need anymore\n\n\n rounder.reset();\n /* Collect and compile segments we're keeping into a multipolygon */\n\n var ringsOut = RingOut.factory(sweepLine.segments);\n var result = new MultiPolyOut(ringsOut);\n return result.getGeom();\n }\n }]);\n\n return Operation;\n}(); // singleton available by import\n\nvar operation = new Operation();\n\nvar union = function union(geom) {\n for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n moreGeoms[_key - 1] = arguments[_key];\n }\n\n return operation.run('union', geom, moreGeoms);\n};\n\nvar intersection$1 = function intersection(geom) {\n for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n moreGeoms[_key2 - 1] = arguments[_key2];\n }\n\n return operation.run('intersection', geom, moreGeoms);\n};\n\nvar xor = function xor(geom) {\n for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n moreGeoms[_key3 - 1] = arguments[_key3];\n }\n\n return operation.run('xor', geom, moreGeoms);\n};\n\nvar difference = function difference(subjectGeom) {\n for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n clippingGeoms[_key4 - 1] = arguments[_key4];\n }\n\n return operation.run('difference', subjectGeom, clippingGeoms);\n};\n\nvar index = {\n union: union,\n intersection: intersection$1,\n xor: xor,\n difference: difference\n};\n\nexport default index;\n","//\n// THE NODE PACKAGE API\n//\n\nimport { doPreprocessData } from './preprocess'\nimport { doAnalyzePlan, doAnalyzeDistricts } from './analyze'\nimport {\n doConfigureScales, doAnalyzePostProcessing\n} from './results'\nimport {\n PlanAnalytics, DistrictStatistics,\n preparePlanAnalytics, prepareDistrictStatistics\n} from './results'\n\nimport * as D from './_data';\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nexport class AnalyticsSession {\n title: string;\n legislativeDistricts: boolean;\n config: T.Dict = {};\n\n bOneTimeProcessingDone = false;\n bPlanAnalyzed = false;\n bPostProcessingDone = false;\n testScales = {} as T.TestScales;\n tests = {} as T.TestEntries;\n\n state: D.State;\n counties: D.Counties;\n graph: D.Graph;\n features: D.Features;\n plan: D.Plan;\n districts: D.Districts;\n\n constructor(SessionRequest: T.SessionRequest) {\n this.title = SessionRequest['title'];\n this.legislativeDistricts = SessionRequest['legislativeDistricts'];\n this.config = this.processConfig(SessionRequest['config'])\n\n this.state = new D.State(this, SessionRequest['stateXX'], SessionRequest['nDistricts']);\n this.counties = new D.Counties(this, SessionRequest['counties']);\n this.graph = new D.Graph(this, SessionRequest['graph']);\n this.features = new D.Features(this, SessionRequest['data'], this.config['datasets']);\n this.plan = new D.Plan(this, SessionRequest['plan']);\n this.districts = new D.Districts(this, SessionRequest['districtShapes']);\n\n // NOTE: I've pulled these out of the individual analytics to here. Eventually,\n // we could want them to passed into an analytics session as data, along with\n // everything else. For now, this keeps branching out of the main code.\n doConfigureScales(this);\n }\n processConfig(config: T.Dict): T.Dict {\n // NOTE - Session settings are required:\n // - Analytics suites can be defaulted to all with [], but\n // - Dataset keys must be explicitly specified with 'dataset'\n\n // TODO - DASHBOARD: Remove this mechanism. Always run everything.\n let defaultSuites = [T.Suite.Legal, T.Suite.Fair, T.Suite.Best];\n\n // If the config passed in has no suites = [], use the default suites\n if (U.isArrayEmpty(config['suites'])) {\n config['suites'] = defaultSuites;\n }\n\n // Default the Census & redistricting cycle to 2010\n if (!(U.keyExists('cycle', config))) config['cycle'] = 2010;\n\n return config;\n }\n\n // Using the the data in the analytics session, calculate all the\n // analytics & validations, saving/updating the individual test results.\n analyzePlan(bLog: boolean = false): boolean {\n try {\n doPreprocessData(this, bLog);\n doAnalyzeDistricts(this, bLog);\n doAnalyzePlan(this, bLog);\n doAnalyzePostProcessing(this, bLog);\n }\n catch {\n console.log(\"Exception caught by analyzePlan()\");\n return false;\n }\n\n return true;\n }\n\n // NOTE - This assumes that analyzePlan() has been run!\n getPlanAnalytics(bLog: boolean = false): PlanAnalytics {\n return preparePlanAnalytics(this, bLog);\n }\n // NOTE - This assumes that analyzePlan() has been run!\n getDistrictStatistics(bLog: boolean = false): DistrictStatistics {\n return prepareDistrictStatistics(this, bLog);\n }\n // NOTE - This assumes that analyzePlan() has been run!\n getDiscontiguousDistrictFeatures(bLog: boolean = false): T.GeoFeatureCollection {\n // Get the (possibly empty) list of discontiguous district IDs\n let contiguousTest = this.getTest(T.Test.Contiguous) as T.TestEntry;\n let discontiguousDistrictIDs: number[] = contiguousTest['details']['discontiguousDistricts'] || [];\n\n // Convert them into a (possibly empty) list of features\n let discontiguousDistrictFeatures: T.GeoFeatureCollection = { type: 'FeatureCollection', features: [] };\n if (!(U.isArrayEmpty(discontiguousDistrictIDs))) {\n for (let id of discontiguousDistrictIDs) {\n let poly = this.districts.getDistrictShapeByID(id);\n\n if (poly) discontiguousDistrictFeatures.features.push(poly);\n }\n }\n\n return discontiguousDistrictFeatures;\n }\n\n\n // HELPERS USED INTERNALLY\n\n // Get an individual test, so you can drive UI with the results.\n getTest(testID: T.Test): T.TestEntry {\n // Get the existing test entries\n // T.Test is a numeric enum, so convert the string keys to numbers\n let testValues = U.getNumericObjectKeys(this.tests);\n\n // If there's no entry for this test, create & initialize one\n if (!(testValues.includes(testID))) {\n this.tests[testID] = {} as T.TestEntry;\n this.tests[testID]['score'] = undefined;\n this.tests[testID]['details'] = {};\n }\n\n // Return a pointer to the the test entry for this test\n return this.tests[testID];\n }\n\n // NOTE - Not sure why this has to be up here.\n populationDeviationThreshold(): number {\n return 1 - this.testScales[T.Test.PopulationDeviation]['scale'][0];\n }\n}\n\n","//\n// DATA ABSTRACTION LAYER\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\nimport { isConnected, isEmbedded } from './valid';\nimport { extractDistrictProperties } from './compact';\nimport { fptpWin } from './political'\n\n\n// DISTRICT STATISTICS\n\n// Indexes for statistics fields in Districts\n// NOTE - Not a const, so the number can be determined dynamically\nexport enum DistrictField {\n TotalPop, // Display\n PopDevPct, // Display\n bEqualPop, // Display\n bNotEmpty, // Display\n bContiguous, // Display\n bNotEmbedded, // Display\n CountySplits,\n DemVotes,\n RepVotes,\n TwoPartyVote, // Two-party total ()= Dem + Rep) not all votes!\n DemPct, // Display (also the \"VPI,\" by convention\")\n RepPct, // Display\n DemSeat,\n TotalVAP, // VAP or CVAP ...\n MinorityPop, // Derived\n WhitePop,\n BlackPop,\n HispanicPop,\n PacificPop,\n AsianPop,\n NativePop,\n WhitePct, // Display\n MinorityPct, // Display\n BlackPct, // Display\n HispanicPct, // Display\n PacificPct, // Display\n AsianPct, // Display\n NativePct // Display\n\n // 1 - MORE ...\n}\n\nexport class Districts {\n _session: AnalyticsSession;\n\n _shapes: T.GeoFeatureCollection;\n _geoProperties = {} as T.DistrictProperties;\n\n statistics: any[][];\n\n constructor(s: AnalyticsSession, ds: T.GeoFeatureCollection) {\n this._session = s;\n\n this._shapes = ds;\n this.statistics = this.initStatistics();\n }\n getDistrictShapeByID(id: number): T.GeoFeature | undefined {\n // NOTE - Find the district shape by ID (not index)\n // return this._shapes.features[id]; \n for (let f of this._shapes.features) {\n if (f.properties && (f.properties.id == id)) {\n return f;\n }\n }\n return undefined;\n }\n getGeoProperties(i: number): any {\n // Make sure the district shape exists & has geo properties\n if (i in this._geoProperties) return this._geoProperties[i];\n else return null;\n }\n setGeoProperties(i: number, p: T.DistrictShapeProperties): void { this._geoProperties[i] = p; }\n\n numberOfColumns(): number { return U.countEnumValues(DistrictField); }\n // +1 for dummy unassigned 0 \"district\" and +1 for N+1 summary \"district\" for\n // state-level values. Real districts are 1–N.\n numberOfRows(): number { return this._session.state.nDistricts + 2; }\n numberOfWorkingDistricts(): number { return this._session.state.nDistricts + 1; }\n\n // This is the core statistics 2D matrix:\n // Fields on the outside, districts on the inside\n initStatistics(): any[][] {\n let nRows = this.numberOfRows();\n let nCols = this.numberOfColumns();\n\n let outer = U.initArray(nCols, undefined);\n\n for (let i = 0; i < nCols; i++) {\n outer[i] = U.initArray(nRows, null);\n }\n\n return outer;\n }\n\n // This is the workhorse computational routine!\n //\n // TODO - OPTIMIZE for getting multiple properties from the same feature?\n // TODO - OPTIMIZE by only re-calc'ing districts that have changed?\n // In this case, special attention to getting county-splits right.\n // TODO - OPTIMIZE by async'ing this?\n // TODO - Is there a way to do this programmatically off data? Does it matter?\n recalcStatistics(bLog: boolean = false): void {\n // Compute these once per recalc cycle\n let targetSize = this._session.state.totalPop / this._session.state.nDistricts;\n let deviationThreshold = this._session.populationDeviationThreshold();\n let planByDistrict = this._session.plan.byDistrictID();\n let plan = this._session.plan;\n let graph = this._session.graph;\n\n // NOTE - SPLITTING\n // Add an extra 0th virtual county bucket for county-district splitting analysis \n let nCountyBuckets = this._session.counties.nCounties + 1;\n\n // INITIALIZE STATE VALUES THAT WILL BE ACCUMULATED\n\n let stateTPVote = 0;\n let stateDemVote = 0;\n let stateRepVote = 0;\n\n let stateVAPPop = 0;\n let stateWhitePop = 0;\n let stateMinorityPop = 0;\n let stateBlackPop = 0;\n let stateHispanicPop = 0;\n let statePacificPop = 0;\n let stateAsianPop = 0;\n let stateNativePop = 0;\n\n // NOTE - These plan-level booleans are set in their respective analytics:\n // - Equal population (bEqualPop)\n // - Complete (bNotEmpty)\n // - Contiguous (bContiguous)\n // - Free of holes (bNotEmbedded)\n\n // 2 - MORE ...\n\n // Loop over the districts (including the dummy unassigned one)\n for (let i = 0; i < this.numberOfWorkingDistricts(); i++) {\n\n // INITIALIZE DISTRICT VALUES THAT WILL BE ACCUMULATED (VS. DERIVED)\n\n let featurePop: number;\n let totalPop: number = 0;\n\n // NOTE - SPLITTING\n let countySplits: number[] = U.initArray(nCountyBuckets, 0);\n\n let demVotes: number = 0;\n let repVotes: number = 0;\n\n let totalVAP: number = 0;\n let whitePop: number = 0;\n let blackPop: number = 0;\n let hispanicPop: number = 0;\n let pacificPop: number = 0;\n let asianPop: number = 0;\n let nativePop: number = 0;\n\n // NOTE - Only report explicitly found validity issues\n let bNotEmpty = false;\n let bContiguous = true;\n let bNotEmbedded = true;\n let bEqualPop = true;\n\n // 3 - MORE ...\n\n // HACK - Because \"this\" gets ghosted inside the forEach loop below\n let outerThis = this;\n\n // Get the geoIDs assigned to the district\n // Guard against empty districts\n let geoIDs = this._session.plan.geoIDsForDistrictID(i);\n if (geoIDs && (geoIDs.size > 0)) {\n bNotEmpty = true;\n\n // ... loop over the geoIDs creating district-by-district statistics \n geoIDs.forEach(function (geoID: string): void {\n // Skip water-only features\n if (!(U.isWaterOnly(geoID))) {\n // Map from geoID to feature index\n let featureID = outerThis._session.features.featureID(geoID);\n let f: T.GeoFeature = outerThis._session.features.featureByIndex(featureID);\n\n if (f == undefined) {\n console.log(\"Skipping undefined feature in district statistics: GEOID =\", geoID, \"Feature ID =\", featureID);\n }\n else {\n // ACCUMULATE VALUES\n\n // Total population of each feature\n // NOTE - This result is used more than once\n featurePop = outerThis._session.features.fieldForFeature(f, Dataset.CENSUS, FeatureField.TotalPop);\n\n // Total district population\n totalPop += featurePop;\n\n // NOTE - SPLITTING\n // Total population by counties w/in a district,\n // except the dummy unassigned district 0\n if (i > 0) countySplits[outerThis.getCountyIndex(geoID)] += featurePop;\n\n // Democratic and Republican vote totals\n demVotes += outerThis._session.features.fieldForFeature(f, Dataset.ELECTION, FeatureField.DemVotes);\n repVotes += outerThis._session.features.fieldForFeature(f, Dataset.ELECTION, FeatureField.RepVotes);\n\n // Voting-age demographic breakdowns (or citizen voting-age)\n totalVAP += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.TotalPop);\n whitePop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.WhitePop);\n blackPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.BlackPop);\n hispanicPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.HispanicPop);\n pacificPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.PacificPop);\n asianPop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.AsianPop);\n nativePop += outerThis._session.features.fieldForFeature(f, Dataset.VAP, FeatureField.NativePop);\n\n // 4 - MORE ...\n }\n }\n else console.log(\"Skipping water-only feature in district statistics:\", geoID);\n });\n\n // COMPUTE DERIVED VALUES\n\n // Population deviation % and equal population (boolean) by district.\n // Default the value for the dummy unassigned district to 0%.\n let popDevPct = 0 / targetSize;\n if (i > 0) {\n popDevPct = (totalPop - targetSize) / targetSize;\n bEqualPop = (popDevPct <= deviationThreshold);\n }\n\n // Total two-party (not total total!) votes, Democratic and Republican vote\n // shares, and Democratic first-past-the-post win (= 1) or loss (= 0).\n let totVotes: number;\n let demPct: number = 0;\n let repPct: number = 0;\n let DemSeat: number = 0;\n\n totVotes = demVotes + repVotes;\n if (totVotes > 0) {\n demPct = demVotes / totVotes;\n repPct = repVotes / totVotes;\n DemSeat = fptpWin(demPct);\n }\n\n // Total minority VAP\n let minorityPop = totalVAP - whitePop;\n\n // Voting-age demographic proportions (or citizen voting-age)\n let whitePct: number = 0;\n let minorityPct: number = 0;\n let blackPct: number = 0;\n let hispanicPct: number = 0;\n let pacificPct: number = 0;\n let asianPct: number = 0;\n let nativePct: number = 0;\n\n if (totalVAP > 0) {\n whitePct = whitePop / totalVAP;\n minorityPct = minorityPop / totalVAP;\n blackPct = blackPop / totalVAP;\n hispanicPct = hispanicPop / totalVAP;\n pacificPct = pacificPop / totalVAP;\n asianPct = asianPop / totalVAP;\n nativePct = nativePop / totalVAP;\n }\n\n // 5 - MORE ...\n\n // COMPUTE DISTRICT-LEVEL VALUES\n\n // Validations\n\n // Leave the default values for the dummy unassigned district,\n // and districts that are empty.\n if ((i > 0) && bNotEmpty) {\n bContiguous = isConnected(geoIDs, graph);\n bNotEmbedded = (!isEmbedded(i, planByDistrict[i], plan, graph));\n }\n\n // 6 - MORE ...\n\n { // UPDATE THE DISTRICT STATISTICS\n\n // NOTE - These are set below for both non-empty & empty districts:\n // this.statistics[DistrictField.bNotEmpty][i] = bNotEmpty;\n // this.statistics[DistrictField.bContiguous][i] = bContiguous;\n // this.statistics[DistrictField.bNotEmbedded][i] = bNotEmbedded;\n // this.statistics[DistrictField.TotalPop][i] = totalPop;\n // this.statistics[DistrictField.bEqualPop][i] = bEqualPop;\n this.statistics[DistrictField.PopDevPct][i] = popDevPct;\n\n this.statistics[DistrictField.DemVotes][i] = demVotes;\n this.statistics[DistrictField.RepVotes][i] = repVotes;\n this.statistics[DistrictField.TwoPartyVote][i] = totVotes;\n this.statistics[DistrictField.DemPct][i] = demPct;\n this.statistics[DistrictField.RepPct][i] = repPct;\n this.statistics[DistrictField.DemSeat][i] = DemSeat;\n\n this.statistics[DistrictField.WhitePop][i] = whitePop;\n this.statistics[DistrictField.MinorityPop][i] = minorityPop;\n this.statistics[DistrictField.BlackPop][i] = blackPop;\n this.statistics[DistrictField.HispanicPop][i] = hispanicPop;\n this.statistics[DistrictField.PacificPop][i] = pacificPop;\n this.statistics[DistrictField.AsianPop][i] = asianPop;\n this.statistics[DistrictField.NativePop][i] = nativePop;\n\n this.statistics[DistrictField.TotalVAP][i] = totalVAP;\n this.statistics[DistrictField.WhitePct][i] = whitePct;\n this.statistics[DistrictField.MinorityPct][i] = minorityPct;\n this.statistics[DistrictField.BlackPct][i] = blackPct;\n this.statistics[DistrictField.HispanicPct][i] = hispanicPct;\n this.statistics[DistrictField.PacificPct][i] = pacificPct;\n this.statistics[DistrictField.AsianPct][i] = asianPct;\n this.statistics[DistrictField.NativePct][i] = nativePct;\n }\n\n // 7 - MORE ...\n\n { // ACCUMULATE STATE STATISTICS FROM DISTRICT TOTALS\n stateTPVote += totVotes;\n stateDemVote += demVotes;\n stateRepVote += repVotes;\n\n stateVAPPop += totalVAP;\n stateWhitePop += whitePop;\n stateMinorityPop += minorityPop\n stateBlackPop += blackPop;\n stateHispanicPop += hispanicPop;\n statePacificPop += pacificPop;\n stateAsianPop += asianPop;\n stateNativePop += nativePop;\n }\n }\n else { // If a district is empty, zero these results (vs. null)\n this.statistics[DistrictField.PopDevPct][i] = 0.0;\n\n this.statistics[DistrictField.DemVotes][i] = 0;\n this.statistics[DistrictField.RepVotes][i] = 0;\n this.statistics[DistrictField.TwoPartyVote][i] = 0;\n this.statistics[DistrictField.DemPct][i] = 0;\n this.statistics[DistrictField.RepPct][i] = 0;\n this.statistics[DistrictField.DemSeat][i] = 0;\n\n this.statistics[DistrictField.WhitePop][i] = 0;\n this.statistics[DistrictField.MinorityPop][i] = 0;\n this.statistics[DistrictField.BlackPop][i] = 0;\n this.statistics[DistrictField.HispanicPop][i] = 0;\n this.statistics[DistrictField.PacificPop][i] = 0;\n this.statistics[DistrictField.AsianPop][i] = 0;\n this.statistics[DistrictField.NativePop][i] = 0;\n\n this.statistics[DistrictField.TotalVAP][i] = 0;\n this.statistics[DistrictField.WhitePct][i] = 0;\n this.statistics[DistrictField.MinorityPct][i] = 0;\n this.statistics[DistrictField.BlackPct][i] = 0;\n this.statistics[DistrictField.HispanicPct][i] = 0;\n this.statistics[DistrictField.PacificPct][i] = 0;\n this.statistics[DistrictField.AsianPct][i] = 0;\n this.statistics[DistrictField.NativePct][i] = 0;\n }\n\n { // UPDATE THESE DISTRICT STATISTICS, EVEN WHEN THEY ARE EMPTY\n this.statistics[DistrictField.TotalPop][i] = totalPop;\n\n this.statistics[DistrictField.bNotEmpty][i] = bNotEmpty;\n this.statistics[DistrictField.bContiguous][i] = bContiguous;\n this.statistics[DistrictField.bNotEmbedded][i] = bNotEmbedded;\n this.statistics[DistrictField.bEqualPop][i] = bEqualPop;\n\n this.statistics[DistrictField.CountySplits][i] = countySplits;\n }\n }\n\n // UPDATE STATE STATISTICS\n let summaryRow = this.numberOfRows() - 1;\n\n if (stateTPVote > 0) {\n this.statistics[DistrictField.DemPct][summaryRow] = stateDemVote / stateTPVote;\n this.statistics[DistrictField.RepPct][summaryRow] = stateRepVote / stateTPVote;\n }\n\n if (stateVAPPop > 0) {\n this.statistics[DistrictField.WhitePct][summaryRow] = stateWhitePop / stateVAPPop;\n this.statistics[DistrictField.MinorityPct][summaryRow] = stateMinorityPop / stateVAPPop;\n this.statistics[DistrictField.BlackPct][summaryRow] = stateBlackPop / stateVAPPop;\n this.statistics[DistrictField.HispanicPct][summaryRow] = stateHispanicPop / stateVAPPop;\n this.statistics[DistrictField.PacificPct][summaryRow] = statePacificPop / stateVAPPop;\n this.statistics[DistrictField.AsianPct][summaryRow] = stateAsianPop / stateVAPPop;\n this.statistics[DistrictField.NativePct][summaryRow] = stateNativePop / stateVAPPop;\n }\n }\n // NOTE - I did not roll these into district statistics, because creating the\n // district shapes themselves is the big district-by-district activity, these\n // calc's already work, and I'm not going to expose these values. Wrapping\n // the underlying function and exposing it here to illustrate the parallelism\n // with recalcStatistics(). These are called in tandem by doAnalyzeDistricts().\n extractDistrictShapeProperties(bLog: boolean = false): void {\n extractDistrictProperties(this._session, bLog)\n }\n getCountyIndex(geoID: string): number {\n let countyGeoID = U.parseGeoID(geoID)['county'] as string;\n let countyFIPS = U.getFIPSFromCountyGeoID(countyGeoID);\n let countyIndex = this._session.counties.indexFromFIPS(countyFIPS);\n\n return countyIndex;\n }\n}\n\n\n// CLASSES, ETC. FOR FEATURE & COUNTY DATA\n\n// Types of datasets by feature\nexport const enum Dataset {\n SHAPES = \"SHAPES\",\n CENSUS = \"CENSUS\",\n VAP = \"VAP\",\n ELECTION = \"ELECTION\"\n}\n\nexport type DatasetKeys = {\n SHAPES: string; // A shapefile\n CENSUS: string; // A total population Census dataset\n VAP: string; // A voting age (or citizen voting age) dataset\n ELECTION: string; // An election dataset\n}\n\n// Identifiers of fields for each feature in the datasets\nexport const enum FeatureField {\n TotalPop = \"Tot\",\n WhitePop = \"Wh\",\n BlackPop = \"BlC\",\n HispanicPop = \"His\",\n AsianPop = \"AsnC\",\n PacificPop = \"PacC\",\n NativePop = \"NatC\",\n DemVotes = \"D\",\n RepVotes = \"R\",\n TotalVotes = \"Tot\"\n}\n\n// Wrap data by feature, to abstract the specifics of the internal structure\nexport class Features {\n _session: AnalyticsSession;\n\n _data: T.GeoFeatureCollection;\n _keys: DatasetKeys;\n\n _featureIDs = {} as T.FeaturesByGeoID;\n\n constructor(s: AnalyticsSession, data: T.GeoFeatureCollection, keys: DatasetKeys) {\n this._session = s;\n\n this._data = data;\n this._keys = keys;\n }\n nFeatures(): number { return this._data.features.length; }\n featureByIndex(i: number): T.GeoFeature { return this._data.features[i]; }\n geoIDForFeature(f: any): string {\n // GEOIDs will be one of these properties\n let value = f.properties['GEOID10'] || f.properties['GEOID20'] || f.properties['GEOID'];\n return value;\n }\n fieldForFeature(f: any, dt: Dataset, fk: string): any {\n let dk: string = this._keys[dt];\n\n return _getFeatures(f, dk, fk);\n }\n resetDataset(d: Dataset, k: string): void {\n this._keys[d] = k;\n // TODO - RECALC: Does anything need to be recalc'd now when a dataset is changed?\n }\n mapGeoIDsToFeatureIDs(): void {\n for (let i: number = 0; i < this._session.features.nFeatures(); i++) {\n let f: T.GeoFeature = this._session.features.featureByIndex(i);\n let geoID: string = this._session.features.geoIDForFeature(f);\n\n this._featureIDs[geoID] = i;\n }\n }\n featureID(i: string): number { return this._featureIDs[i]; }\n}\n\n// NOTE - This accessor is cloned from fGetW() in dra-client/restrict.ts\n// f is a direct GeoJSON feature\n// p is a geoID\nfunction _getFeatures(f: any, datasetKey: string, p: string): any {\n // Echo parameters for debugging\n // console.log(\"f =\", f, \"k = \", datasetKey, \"p =\", p);\n\n // Shim to load sample data2.json from disk for command-line scaffolding\n if (f.properties && f.properties['datasets']) {\n return f.properties['datasets'][datasetKey][p];\n }\n\n // NOTE - The fGetW() code from dra-client below here ...\n\n // Direct property?\n if (f.properties && f.properties[p] !== undefined)\n return f.properties[p];\n\n // Joined property?\n let a: any[] = _fGetJoined(f);\n if (a) {\n for (let i: number = 0; i < a.length; i++) {\n let o: any = a[i];\n if (!datasetKey) {\n if (o[p] !== undefined)\n return o[p];\n }\n else {\n if (o['datasets'] && o['datasets'][datasetKey]) {\n let v = (o['datasets'][datasetKey][p]);\n if ((!(v == null)) && (!(v == undefined)))\n return o['datasets'][datasetKey][p];\n }\n }\n }\n }\n console.log(`${p} value undefined for ${f.properties['GEOID10']}!`);\n\n return undefined;\n}\n\nfunction _fGetJoined(f: any): any[] {\n return (f.properties && f.properties.joined) ? f.properties.joined : undefined;\n}\n\n// Wrap data by county, to abstract the specifics of the internal structure\nexport class Counties {\n _session: AnalyticsSession;\n\n _data: T.GeoFeatureCollection;\n _countyNameLookup: T.FIPSCodeToCountyNameMap = {};\n\n nCounties: number;\n index = {} as T.FIPSToOrdinalMap;\n totalPopulation: number[] = [];\n\n constructor(s: AnalyticsSession, data: T.GeoFeatureCollection) {\n this._session = s;\n\n this._data = data;\n this.nCounties = this._data.features.length;\n }\n countyByIndex(i: number): T.GeoFeature { return this._data.features[i]; }\n propertyForCounty(f: any, pk: string): any { return f.properties[pk]; }\n mapFIPSToName(fips: string, name: string): void { this._countyNameLookup[fips] = name; }\n nameFromFIPS(fips: string): string { return this._countyNameLookup[fips]; }\n indexFromFIPS(fips: string): number { return this.index[fips]; }\n}\n\n// CLASSES TO ORGANIZE AND/OR ABSTRACT OTHER DATA\n\nexport class State {\n _session: AnalyticsSession;\n\n xx: string;\n nDistricts: number;\n totalPop = 0;\n tooBigFIPS = [] as string[];\n tooBigName = [] as string[];\n expectedSplits = 0;\n expectedAffected = 0;\n\n constructor(s: AnalyticsSession, xx: string, n: number) {\n this._session = s;\n\n this.xx = xx;\n this.nDistricts = n;\n }\n}\n\nexport class Plan {\n _session: AnalyticsSession;\n\n // TODO - RECALC: Do these need to be updated, when the plan changes?\n _planByGeoID: T.PlanByGeoID;\n _planByDistrictID: T.PlanByDistrictID;\n\n districtIDs: number[];\n\n constructor(s: AnalyticsSession, p: T.PlanByGeoID) {\n this._session = s;\n\n\n this._planByGeoID = p;\n this._planByDistrictID = {} as T.PlanByDistrictID;\n\n this.districtIDs = []; // Set when the plan in inverted\n }\n // NOTE - DON'T remove water-only features from the plan, as they may be required\n // for contiguity. Just skip them in aggregating district statistics.\n // removeWaterOnlyFeatures(plan: T.PlanByGeoID): T.PlanByGeoID {\n // let newPlan = {} as T.PlanByGeoID;\n\n // for (let geoID in plan) {\n // // Remove water-only features\n // if (!(U.isWaterOnly(geoID))) {\n // newPlan[geoID] = plan[geoID];\n // }\n // else {\n // console.log(\"Removing water-only feature\", geoID);\n // }\n // }\n\n // return newPlan;\n // }\n invertPlan(): void {\n // NOTE - UNASSIGNED\n this._planByDistrictID = invertPlan(this._planByGeoID, this._session);\n this.districtIDs = U.getNumericObjectKeys(this._planByDistrictID);\n }\n initializeDistrict(i: number): void { this._planByDistrictID[i] = new Set(); }\n\n byGeoID(): T.PlanByGeoID { return this._planByGeoID; }\n byDistrictID(): T.PlanByDistrictID { return this._planByDistrictID; }\n districtForGeoID(i: string): number { return this._planByGeoID[i]; }\n geoIDsForDistrictID(i: number): Set<string> { return this._planByDistrictID[i]; }\n}\n\n// Invert a feature assignment structure to sets of ids by district\nexport function invertPlan(plan: T.PlanByGeoID, s?: AnalyticsSession): T.PlanByDistrictID {\n let invertedPlan = {} as T.PlanByDistrictID;\n\n // Add a dummy 'unassigned' district\n invertedPlan[S.NOT_ASSIGNED] = new Set();\n\n // NOTE - UNASSIGNED\n // The feature assignments coming from DRA do not include unassigned ones.\n // - In the DRA-calling context, there's an analytics session with a reference\n // to the features. Loop over all the features to find the unassigned ones,\n // and add them to the dummy unassigned district explicitly.\n // - In the CLI-calling context, there's no session (yet) but the plan is complete.\n if (!(s == undefined)) {\n for (let i: number = 0; i < s.features.nFeatures(); i++) {\n let f: T.GeoFeature = s.features.featureByIndex(i);\n let geoID: string = s.features.geoIDForFeature(f);\n\n // If the feature is NOT explicitly assigned to a district, add the geoID\n // to the dummy unassigned district 0.\n if (!(U.keyExists(geoID, plan))) invertedPlan[S.NOT_ASSIGNED].add(geoID);\n\n // NOTE - NOT skipping WATER-ONLY features here, because we're\n // not skipping them below when they are explicitly assigned in plans. Should\n // we skip them in both places?\n }\n }\n\n for (let geoID in plan) {\n let districtID = plan[geoID];\n\n // Make sure the set for the districtID exists\n if (!(U.objectContains(invertedPlan, districtID))) {\n invertedPlan[districtID] = new Set();\n }\n\n // Add the geoID to the districtID's set\n invertedPlan[districtID].add(geoID);\n\n if (U.isWaterOnly(geoID)) console.log(\"Water-only feature still in plan!\", geoID);\n }\n\n return invertedPlan;\n}\n\nexport class Graph {\n _session: AnalyticsSession;\n\n _graph: T.ContiguityGraph;\n\n constructor(s: AnalyticsSession, graph: T.ContiguityGraph) {\n this._session = s;\n\n this._graph = graph;\n }\n peerNeighbors(node: string): string[] {\n // Get the neighboring geoIDs connected to a geoID\n // Ignore the lengths of the shared borders (the values), for now\n\n // Protect against getting a GEOID that's not in the graph\n if (U.keyExists(node, this._graph)) {\n // NOTE - CONTIGUITY GRAPHS\n // Handle both unweighted & weighted neighbors\n let n = this._graph[node];\n let l = (n instanceof Array) ? n : U.getObjectKeys(n);\n\n return l;\n\n // return U.getObjectKeys(this._graph[node]);\n }\n else return [];\n\n // return U.getObjectKeys(this._graph[node]);\n }\n}\n\n\n","//\n// ANALYZE A PLAN\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\n\nimport { doIsComplete, doIsContiguous, doIsFreeOfHoles } from './valid'\nimport { doPopulationDeviation, doHasEqualPopulations } from './equal';\nimport { doReock, doPolsbyPopper } from './compact';\nimport {\n doFindCountiesSplitUnexpectedly, doFindSplitVTDs,\n doCountySplitting, doDistrictSplitting\n} from './cohesive';\nimport {\n doSeatsBias, doVotesBias,\n doResponsiveness, doResponsiveDistricts, doEfficiencyGap\n} from './political';\nimport { doMajorityMinorityDistricts } from './minority'\n\n// Compile district-level info for plan/map-level analytics\nexport function doAnalyzeDistricts(s: AnalyticsSession, bLog: boolean = false): void {\n s.districts.recalcStatistics(bLog);\n s.districts.extractDistrictShapeProperties(bLog);\n}\n\n// Calculate the analytics & validations and cache the results\n// NOTE - doAnalyzePlan() depends on doAnalyzeDistricts() having run first.\n// NOTE - I could make this table-driven, but I'm thinking that the explicit\n// calls might make chunking for aync easier.\nexport function doAnalyzePlan(s: AnalyticsSession, bLog: boolean = false): void {\n // TODO - Remove this mechanism. Always run all tests\n // Get the requested suites, and only execute those tests\n let requestedSuites = s.config['suites'];\n\n // Tests in the \"Legal\" suite, i.e., pass/ fail constraints\n if (requestedSuites.includes(T.Suite.Legal)) {\n s.tests[T.Test.Complete] = doIsComplete(s, bLog);\n\n s.tests[T.Test.Contiguous] = doIsContiguous(s, bLog);\n\n s.tests[T.Test.FreeOfHoles] = doIsFreeOfHoles(s, bLog);\n\n s.tests[T.Test.PopulationDeviation] = doPopulationDeviation(s, bLog);\n\n // NOTE - I can't check whether a population deviation is legal or not, until\n // the raw % is normalized. A zero (0) would mean \"too much\" / \"not legal,\" for\n // the given type of district (CD vs. LD). The EqualPopulation test is derived\n // from PopulationDeviation, as part of scorecard or test log preparation.\n\n // Create an empty test entry here though ...\n s.tests[T.Test.EqualPopulation] = s.getTest(T.Test.EqualPopulation) as T.TestEntry;\n }\n\n // Tests in the \"Fair\" suite\n if (requestedSuites.includes(T.Suite.Fair)) {\n s.tests[T.Test.SeatsBias] = doSeatsBias(s, bLog);\n\n s.tests[T.Test.VotesBias] = doVotesBias(s, bLog);\n\n s.tests[T.Test.Responsiveness] = doResponsiveness(s, bLog);\n\n s.tests[T.Test.ResponsiveDistricts] = doResponsiveDistricts(s, bLog);\n\n s.tests[T.Test.EfficiencyGap] = doEfficiencyGap(s, bLog);\n\n s.tests[T.Test.MajorityMinorityDistricts] = doMajorityMinorityDistricts(s, bLog);\n }\n\n // Tests in the \"Best\" suite, i.e., criteria for better/worse\n if (requestedSuites.includes(T.Suite.Best)) {\n s.tests[T.Test.Reock] = doReock(s, bLog);\n s.tests[T.Test.PolsbyPopper] = doPolsbyPopper(s, bLog);\n\n s.tests[T.Test.UnexpectedCountySplits] = doFindCountiesSplitUnexpectedly(s, bLog);\n s.tests[T.Test.VTDSplits] = doFindSplitVTDs(s, bLog);\n s.tests[T.Test.CountySplitting] = doCountySplitting(s, bLog);\n s.tests[T.Test.DistrictSplitting] = doDistrictSplitting(s, bLog);\n }\n\n // Enable a Test Log and Scorecard to be generated\n s.bPlanAnalyzed = true;\n s.bPostProcessingDone = false;\n}\n\n// Derive secondary analytics that are based on primary tests.\n// This concept allows Population Deviation to be a primary numeric test and\n// Equal Population to be secondary pass/fail validation.\n//\n// NOTE - Should this be conditionalized on the test suites requested? \n// Those are encapsulated in reports.ts right now, so not doing that.\nexport function doDeriveSecondaryTests(s: AnalyticsSession, bLog: boolean = false): void {\n s.tests[T.Test.EqualPopulation] = doHasEqualPopulations(s, bLog);\n}\n","//\n// SPLITTING of counties & districts\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n\n// CALCULATE ENHANCED SQRT ENTROPY METRIC\n\nexport function doCountySplitting(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.CountySplitting) as T.TestEntry;\n\n let CxD = s.districts.statistics[D.DistrictField.CountySplits].slice(0, -1);\n let countyTotals = s.counties.totalPopulation;\n let districtTotals = s.districts.statistics[D.DistrictField.TotalPop].slice(0, -1);\n\n let f = calcCountyFractions(CxD, countyTotals);\n let w = calcCountyWeights(countyTotals);\n\n let SqEnt_DC = countySplitting(f, w, bLog);\n\n let CxDreducedC = U.deepCopy(CxD);\n reduceCSplits(CxDreducedC, districtTotals);\n\n let fReduced = calcCountyFractions(CxDreducedC, countyTotals);\n let wReduced = calcCountyWeights(countyTotals);\n\n let SqEnt_DCreduced = countySplitting(fReduced, wReduced, bLog);\n\n test['score'] = SqEnt_DCreduced;\n test['details']['SqEnt_DC'] = SqEnt_DC;\n\n return test;\n}\n\nexport function doDistrictSplitting(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.DistrictSplitting) as T.TestEntry;\n\n let CxD = s.districts.statistics[D.DistrictField.CountySplits].slice(0, -1);\n let countyTotals = s.counties.totalPopulation;\n let districtTotals = s.districts.statistics[D.DistrictField.TotalPop].slice(0, -1);\n\n let g = calcDistrictFractions(CxD, districtTotals);\n let x = calcDistrictWeights(districtTotals);\n\n let SqEnt_CD = districtSplitting(g, x, bLog);\n\n let CxDreducedD = U.deepCopy(CxD);\n reduceDSplits(CxDreducedD, countyTotals);\n\n let gReduced = calcDistrictFractions(CxDreducedD, districtTotals);\n let xReduced = calcDistrictWeights(districtTotals);\n\n let SqEnt_CDreduced = districtSplitting(gReduced, xReduced, bLog);\n\n test['score'] = SqEnt_CDreduced;\n test['details']['SqEnt_CD'] = SqEnt_CD;\n\n return test;\n}\n\n\n// HELPERS\n\n// Loop over all the county-district combos, skipping the virtual district 0 \n// and virtual county 0.\n//\n// NOTE - The county-district splits and the county & district totals may all,\n// in general, be fractional/decimal numbers as opposed to integers, due to\n// dissaggregation & re-aggregation. Hence, comparisons need to approximate\n// equality.\n\n// Consolidate districts (rows) consisting of just one county (column)\n// UP into the dummy district (0).\nfunction reduceCSplits(CxDreducedC: number[][], districtTotals: number[]): void {\n let nD = CxDreducedC.length;\n let nC = CxDreducedC[0].length;\n\n for (let j = 1; j < nC; j++) {\n for (let i = 1; i < nD; i++) {\n let split_total = CxDreducedC[i][j];\n\n if (split_total > 0) {\n if (areRoughlyEqual(split_total, districtTotals[i])) {\n CxDreducedC[0][j] += split_total;\n CxDreducedC[i][j] = 0;\n }\n }\n }\n }\n}\n\n// Consolidate whole counties (columns) in a district (row) LEFT into the\n// dummy county (0).\nfunction reduceDSplits(CxDreducedD: number[][], countyTotals: number[]): void {\n let nD = CxDreducedD.length;\n let nC = CxDreducedD[0].length;\n\n for (let i = 1; i < nD; i++) {\n for (let j = 1; j < nC; j++) {\n let split_total = CxDreducedD[i][j];\n\n if (split_total > 0) {\n if (areRoughlyEqual(split_total, countyTotals[j])) {\n CxDreducedD[i][0] += split_total;\n CxDreducedD[i][j] = 0;\n }\n }\n }\n }\n}\n\nfunction calcCountyWeights(countyTotals: number[]): number[] {\n let nC: number = countyTotals.length;\n let cTotal: number = U.sumArray(countyTotals);\n\n let w: number[] = U.initArray(nC, 0.0);\n\n for (let j = 0; j < nC; j++) {\n w[j] = countyTotals[j] / cTotal;\n }\n\n return w;\n}\n\nfunction calcDistrictWeights(districtTotals: number[]): number[] {\n let nD = districtTotals.length;\n let dTotal: number = U.sumArray(districtTotals);\n\n let x: number[] = U.initArray(nD, 0.0);\n\n for (let i = 0; i < nD; i++) {\n x[i] = districtTotals[i] / dTotal;\n }\n\n return x;\n}\n\nfunction calcCountyFractions(CxDreducedD: number[][], countyTotals: number[]): number[][] {\n let nD = CxDreducedD.length;\n let nC = CxDreducedD[0].length;\n\n let f: number[][] = new Array(nD).fill(0.0).map(() => new Array(nC).fill(0.0));\n\n for (let j = 0; j < nC; j++) {\n for (let i = 0; i < nD; i++) {\n if (countyTotals[j] > 0) {\n f[i][j] = CxDreducedD[i][j] / countyTotals[j];\n }\n else {\n f[i][j] = 0.0;\n }\n }\n }\n\n return f;\n}\n\nfunction calcDistrictFractions(CxDreducedC: number[][], districtTotals: number[]): number[][] {\n let nD = CxDreducedC.length;\n let nC = CxDreducedC[0].length;\n\n let g: number[][] = new Array(nD).fill(0.0).map(() => new Array(nC).fill(0.0));\n\n for (let j = 0; j < nC; j++) {\n for (let i = 0; i < nD; i++) {\n if (districtTotals[i] > 0) {\n g[i][j] = CxDreducedC[i][j] / districtTotals[i];\n }\n else {\n g[i][j] = 0.0;\n }\n }\n }\n\n return g;\n}\n\n// Deal with decimal census \"counts\" due to disagg/re-agg\nfunction areRoughlyEqual(x: number, y: number): boolean {\n let delta = Math.abs(x - y);\n let result = (delta < S.EQUAL_TOLERANCE) ? true : false;\n\n return result;\n}\n\n// For all districts in a county, sum the split score.\nfunction countySplitScore(j: number, f: number[][], numD: number, bLog: boolean = false): number {\n let e = 0.0;\n\n for (let i = 0; i < numD; i++) {\n e += Math.sqrt(f[i][j]);\n }\n\n return e;\n}\n\n// For all counties, sum the weighted county splits.\nfunction countySplitting(f: number[][], w: number[], bLog: boolean = false): number {\n let numC = f[0].length;\n let numD = f.length;\n\n let e = 0.0;\n\n for (let j = 0; j < numC; j++) {\n let splitScore = countySplitScore(j, f, numD, bLog);\n e += w[j] * splitScore;\n\n if (bLog) console.log(\"County splitting =\", j, w[j], splitScore, e);\n }\n\n return U.trim(e, 3);\n}\n\n// For all counties in a district, sum the split score.\nfunction districtSplitScore(i: number, g: number[][], numC: number, bLog: boolean = false): number {\n let e = 0.0;\n\n for (let j = 0; j < numC; j++) {\n e += Math.sqrt(g[i][j]);\n }\n\n return e;\n}\n\n// For all districts, sum the weighted district splits.\nfunction districtSplitting(g: number[][], x: number[], bLog: boolean = false): number {\n let numC = g[0].length;\n let numD = g.length;\n\n let e = 0.0;\n\n for (let i = 0; i < numD; i++) {\n let splitScore = districtSplitScore(i, g, numC, bLog);\n e += x[i] * splitScore;\n\n if (bLog) console.log(\"District split score =\", i, x[i], splitScore, e);\n }\n\n return U.trim(e, 3);\n}\n\n\n// ANALYZE SIMPLE COUNTY & VTD SPLITTING\n\n/*\n \nSample results for NC 2016 dongressional plan\n________________________________________________________________________________\n \nState: NC\nCensus: 2010\nTotal population: 9,535,483\nNumber of districts: 13\nTarget district size: 733,499\nNumber of counties: 100\n \nEqual Population: 11.24% deviation\nCompactness: None\nProportionality: 27.67% gap\nCohesiveness: 11 unexpected splits, affecting 27.14% of the total population\n \nThese counties are split unexpectedly:\n \n • Bladen\n • Buncombe\n • Catawba\n • Cumberland\n • Durham\n • Guilford\n • Iredell\n • Johnston\n • Pitt\n • Rowan\n • Wilson\n \n*/\n\nexport function doFindCountiesSplitUnexpectedly(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.UnexpectedCountySplits) as T.TestEntry;\n\n // THE THREE VALUES TO DETERMINE FOR A PLAN\n let unexpectedSplits: number = 0;\n let unexpectedAffected: number = 0;\n let countiesSplitUnexpectedly = [];\n\n // FIRST, ANALYZE THE COUNTY SPLITTING FOR THE PLAN\n\n // Get the county-district pivot (\"splits\")\n let countiesByDistrict = s.districts.statistics[D.DistrictField.CountySplits];\n // countiesByDistrict = countiesByDistrict.slice(1, -1);\n\n // Find the single-county districts, i.e., districts NOT split across counties.\n // Ignore the dummy unassigned 0 and N+1 summary \"districts.\"\n let singleCountyDistricts = [];\n for (let d = 1; d <= s.state.nDistricts; d++) {\n // See if there's only one county partition\n let nCountiesInDistrict = 0;\n for (let c = 0; c < s.counties.nCounties; c++) {\n // Guard against empty district\n if (countiesByDistrict[d]) {\n if (countiesByDistrict[d][c] > 0) {\n nCountiesInDistrict += 1;\n if (nCountiesInDistrict > 1) {\n break;\n }\n }\n }\n }\n // If so, save the district\n if (nCountiesInDistrict == 1) {\n singleCountyDistricts.push(d);\n }\n }\n\n // Process the splits/partitions in the plan:\n // - Count the total # of partitions,\n // - Find the counties split across districts, and\n // - Accumulate the number people affected (except when single-county districts)\n let nPartitionsOverall: number = 0;\n let splitCounties = new Set(); // The counties that are split across districts\n let totalAffected: number = 0; // The total population affected by those splits\n\n for (let c = 0; c < s.counties.nCounties; c++) {\n let nCountyParts = 0;\n let subtotal = 0;\n\n for (let d = 1; d <= s.state.nDistricts; d++) {\n // Guard against empty district\n if (countiesByDistrict[d]) {\n if (countiesByDistrict[d][c] > 0) {\n nPartitionsOverall += 1;\n nCountyParts += 1;\n if (!(U.arrayContains(singleCountyDistricts, d))) {\n subtotal += countiesByDistrict[d][c];\n }\n }\n }\n }\n if (nCountyParts > 1) {\n splitCounties.add(c);\n totalAffected += subtotal;\n }\n }\n\n // Convert county ordinals to FIPS codes\n let splitCountiesFIPS = U.getSelectObjectKeys(s.counties.index, [...splitCounties]);\n\n // THEN TAKE ACCOUNT OF THE COUNTY SPLITTING THAT IS EXPECTED (REQUIRED)\n\n // Compute the total number of splits this way, in case any counties are split\n // more than once. I.e., it's not just len(all_counties_split).\n let nSplits = nPartitionsOverall - s.counties.nCounties;\n\n // Determine the number of *unexpected* splits. NOTE: Prevent negative numbers,\n // in case you have a plan the *doesn't* split counties that would have to be\n // split due to their size.\n unexpectedSplits = Math.max(0, nSplits - s.state.expectedSplits);\n\n // Subtract off the total population that *has* to be affected by splits,\n // because their counties are too big. NOTE: Again, prevent negative numbers, \n // in case you have a plan the *doesn't* split counties that would have to be\n // split due to their size.\n unexpectedAffected = U.trim(Math.max(0, totalAffected - s.state.expectedAffected) / s.state.totalPop);\n\n // Find the counties that are split *unexpectedly*. From all the counties that\n // are split, remove those that *have* to be split, because they are bigger than\n // a district.\n let countiesSplitUnexpectedlyFIPS = [];\n for (let fips of splitCountiesFIPS) {\n if (!(U.arrayContains(s.state.tooBigFIPS, fips))) {\n countiesSplitUnexpectedlyFIPS.push(fips);\n }\n }\n\n // ... and convert the FIPS codes to county names.\n for (let fips of countiesSplitUnexpectedlyFIPS) {\n countiesSplitUnexpectedly.push(s.counties.nameFromFIPS(fips));\n }\n countiesSplitUnexpectedly = countiesSplitUnexpectedly.sort();\n\n test['score'] = U.trim(unexpectedAffected);\n test['details']['unexpectedSplits'] = unexpectedSplits;\n test['details']['countiesSplitUnexpectedly'] = countiesSplitUnexpectedly;\n\n return test;\n}\n\nexport function doFindSplitVTDs(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.VTDSplits) as T.TestEntry;\n\n let splitVTDs: string[] = [];\n\n // TODO - SPLITTING: Flesh this out, using Terry's virtual VTD's ...\n\n test['score'] = splitVTDs.length;\n test['details']['splitVTDs'] = splitVTDs;\n\n return test;\n}\n\n","//\n// COMPACT\n//\n\nimport * as Poly from '@dra2020/poly';\n\nimport { gfArea, gfPerimeter, gfDiameter } from './geofeature';\n\nimport * as T from './types';\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\n\n// Measures of compactness compare district shapes to various ideally compact\n// benchmarks, such as circles. All else equal, more compact districts are better.\n// \n// There are four popular measures of compactness. They either focus on how\n// dispersed or how indented a shapes are.\n//\n// These first two measures are the most important:\n// \n// Reock is the primary measure of the dispersion of district shapes, calculated\n// as “the area of the district to the area of the minimum spanning circle that\n// can enclose the district.”\n//\n// R = A / A(Minimum Bounding Circle)\n// R = A / (π * (D / 2)^2)\n//\n// R = 4A / πD^2\n//\n// where A is the area of the district and D is the diameter of the minimum\n// bounding circle.\n//\n// Polsby-Popper is the primary measure of the indendentation of district shapes,\n// calculated as the “the ratio of the area of the district to the area of a circle\n// whose circumference is equal to the perimeter of the district.”\n//\n// PP = A / A(C)\n//\n// where C is that circle. In other words:\n//\n// P = 2πRc and A(C) = π(P / 2π)^2\n//\n// where P is the perimeter of the district and Rc is the radius of the circle.\n//\n// Hence, the measure simplifies to:\n//\n// PP = 4π * (A / P^2)\n// \n// I propose that we use these two, normalize them, and weight equally to determine\n// our compactness value.\n// \n// These second two measures may be used to complement the primary ones above:\n// \n// Convex Hull is a secondary measure of the dispersion of district shapes, calculated\n// as “the ratio of the district area to the area of the minimum convex bounding\n// polygon (also known as a convex hull) enclosing the district.”\n//\n// CH = A / A(Convex Hull)\n// \n// where a convex hull is the minimum perimeter that encloses all points in a shape,\n// basically the shortest unstretched rubber band that fits around the shape.\n//\n// Schwartzberg is a secondary measure of the degree of indentation of district\n// shapes, calculated as “the ratio of the perimeter of the district to the circumference\n// of a circle whose area is equal to the area of the district.”\n//\n// S = 1 / (P / C)\n//\n// where P is the perimeter of the district and C is the circumference of the circle.\n// The radius of the circle is:\n//\n// Rc = SQRT(A / π)\n//\n// So, the circumference of the circle is:\n//\n// C = 2πRc or C = 2π * SQRT(A / π)\n//\n// Hence:\n//\n// S = 1 (P / 2π * SQRT(A / π))\n//\n// S = (2π * SQRT(A / π)) / P\n//\n// All these measures produce values between 0 and 1, with 0 being the least compact\n// and 1 being the most compact. Sometimes these values are multiplied by 100 to\n// give values between 0 and 100.\n// \n// For each measure, the compactness of a set of Congressional districts is the\n// average of that measure for all the districts.\n//\n\n// Calculate Reock compactness:\n// reock = (4 * a) / (math.pi * d**2)\n// NOTE - Depends on extractDistrictProperties running first\nexport function doReock(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Reock) as T.TestEntry;\n\n // Calculate Reock scores by district\n let scores: number[] = [];\n\n for (let districtID = 1; districtID <= s.state.nDistricts; districtID++) {\n let districtProps = s.districts.getGeoProperties(districtID);\n // Guard against no shape and no properties\n if (districtProps) {\n let a = districtProps[T.DistrictShapeProperty.Area];\n let d = districtProps[T.DistrictShapeProperty.Diameter];\n\n let reock = (4 * a) / (Math.PI * d ** 2);\n\n // Save each district score\n scores.push(reock);\n\n // Echo the results by district\n if (bLog) console.log(\"Reock for district\", districtID, \"=\", reock);\n }\n }\n\n // Populate the test entry ... for the shapes that exist!\n let averageReock = U.avgArray(scores);\n\n test['score'] = U.trim(averageReock);\n test['details'] = {}; // TODO - Any details?\n\n return test;\n}\n\n// Calculate Polsby-Popper compactness measures:\n// polsby_popper = (4 * math.pi) * (a / p**2)\n// NOTE - Depends on extractDistrictProperties running first\nexport function doPolsbyPopper(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.PolsbyPopper) as T.TestEntry;\n\n // Calculate Polsby-Popper scores by district\n let scores: number[] = [];\n\n for (let districtID = 1; districtID <= s.state.nDistricts; districtID++) {\n let districtProps = s.districts.getGeoProperties(districtID);\n // Guard against no shape and no properties\n if (districtProps) {\n let a = districtProps[T.DistrictShapeProperty.Area];\n let p = districtProps[T.DistrictShapeProperty.Perimeter];\n\n let polsbyPopper = (4 * Math.PI) * (a / p ** 2);\n\n // Save each district score\n scores.push(polsbyPopper);\n\n // Echo the results by district\n if (bLog) console.log(\"Polsby-Popper for district\", districtID, \"=\", polsbyPopper);\n }\n }\n\n // Populate the test entry ... for the shapes that exist!\n let averagePolsbyPopper = U.avgArray(scores);\n\n test['score'] = U.trim(averagePolsbyPopper);\n test['details'] = {}; // TODO - Any details?\n\n return test;\n}\n\n\n// HELPER TO EXTRACT PROPERTIES OF DISTRICT SHAPES\n\nexport function extractDistrictProperties(s: AnalyticsSession, bLog: boolean = false): void {\n // NOTE - I am assuming that district IDs are integers 1–N\n for (let i = 1; i <= s.state.nDistricts; i++) {\n let poly = s.districts.getDistrictShapeByID(i);\n\n // Guard against no shape for empty districts AND null shapes\n let polyOptions = { noLatitudeCorrection: true }\n let bNull = (!Poly.polyNormalize(poly, polyOptions));\n\n if (poly && (!bNull)) {\n // TODO - OPTIMIZE: Bundle these calls?\n let area: number = gfArea(poly);\n let perimeter: number = gfPerimeter(poly);\n let diameter: number = gfDiameter(poly);\n\n let props: T.DistrictShapeProperties = [0, 0, 0]; // TODO - TERRY?!?\n props[T.DistrictShapeProperty.Area] = area;\n props[T.DistrictShapeProperty.Diameter] = diameter;\n props[T.DistrictShapeProperty.Perimeter] = perimeter;\n\n s.districts.setGeoProperties(i, props);\n\n if (bLog) console.log(\"District\", i, \"A =\", area, \"P =\", perimeter, \"D =\", diameter);\n }\n }\n}\n\n\n// SAVE THESE NOTES, IN CASE WE NEED TO REWORK HOW WE PERFORM THESE CALCS.\n// THEY REFLECT HOW I DID THEM IN PYTHON.\n//\n// THE COMPACTNESS ANALYTICS NEED THE FOLLOWING DATA,\n// IN ADDITION TO THE MAP (IDEALLY, GEO_IDS INDEXED BY DISTRICT_ID)\n//\n// Shapes by geo_id\n//\n// If we need/want to speed compactness calculations up, we'll need\n// to calculate the perimeters and diameters (and areas) of districts implicitly,\n// which will require identifying district boundaries initially and updating\n// them incrementally as districts are (re)assigned.\n//\n// A district's boundary info is the set/list of features that constitute the\n// district's border along with each boundary feature's neighbors. Hence, this\n// requires a contiguity graph with the lengths of shared edges between features\n// precomputed.\n//\n// NOTE - I can write up (if not implement) the logic for determining what shapes\n// constitute a district's boundary. There are a few nuances.\n//\n// If we have to optimize like this when we generalize to mixed maps, the\n// determination of \"neighbors in the map\" and the length of shared borders\n// (for determining a district perimeters) becomes more complicated and dynamic.\n//\n// NOTE - Again, I can write up (if not implement) the logic for both of these.\n// They are a bit tricky and require special preprocessing of the summary level\n// hierarchy (which I also have a script for that we can repurpose).\n","//\n// EQUAL POPULATION\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n\nexport function doPopulationDeviation(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.PopulationDeviation) as T.TestEntry;\n\n // Compute the min, max, and average district populations,\n // excluding the dummy 'unassigned' 0 and N+1 summary \"districts.\"\n let totPopByDistrict = s.districts.statistics[D.DistrictField.TotalPop];\n totPopByDistrict = totPopByDistrict.slice(1, -1);\n\n let min = U.minArray(totPopByDistrict);\n let max = U.maxArray(totPopByDistrict);\n let total = U.sumArray(totPopByDistrict);\n\n // Calculate the raw population deviation.\n // The target size is the average population.\n let avg = total / s.state.nDistricts;\n let popDev = (max - min) / avg;\n\n // Round the raw value to the desired level of precision\n popDev = U.trim(popDev);\n\n // Populate the test entry\n test['score'] = popDev;\n test['details'] = { 'maxDeviation': max - min };\n\n // Populate the N+1 summary \"district\" in district.statistics\n let totalPop = s.districts.statistics[D.DistrictField.TotalPop];\n let popDevPct = s.districts.statistics[D.DistrictField.PopDevPct];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n totalPop[summaryRow] = avg; // aka \"target size\"\n popDevPct[summaryRow] = popDev;\n\n return test;\n}\n\n// NOTE - This validity check is *derived* and depends on population deviation %\n// being computed (above) and normalized in test log & scorecard generation.\nexport function doHasEqualPopulations(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.EqualPopulation) as T.TestEntry;\n\n // Get the normalized population deviation %\n let popDevTest = s.getTest(T.Test.PopulationDeviation);\n let popDevPct = popDevTest['score'] as number;\n let popDevNormalized: number = popDevTest['normalizedScore'] as number;\n\n // Populate the test entry\n if (popDevNormalized > 0) {\n test['score'] = true;\n }\n else {\n test['score'] = false;\n }\n test['details']['deviation'] = popDevPct;\n test['details']['thresholds'] = popDevTest['details']['scale'];\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bEqualPop = s.districts.statistics[D.DistrictField.bEqualPop];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bEqualPop[summaryRow] = test['score'];\n\n return test;\n}\n","//\n// GEO-FEATURES UTILITIES\n//\n\nimport * as Poly from '@dra2020/poly';\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\n\n// CARTESIAN SHIMS OVER 'POLY' FUNCTIONS\n\n// TODO - POLY: Confirm Cartesian calculations\nexport function gfArea(poly: any): number {\n let area: number = _polygonArea(poly);\n\n return area;\n}\n\n// Algorithm for the area of a simple/single planar polygon:\n// https://algorithmtutor.com/Computational-Geometry/Area-of-a-polygon-given-a-set-of-points/\n// https://mathopenref.com/coordpolygonarea2.html\n//\n// function polygonArea(X, Y, numPoints) \n// { \n// area = 0; // Accumulates area in the loop\n// j = numPoints-1; // The last vertex is the 'previous' one to the first\n\n// for (i=0; i<numPoints; i++)\n// { area = area + (X[j]+X[i]) * (Y[j]-Y[i]); \n// j = i; //j is previous vertex to i\n// }\n// return area/2;\n// }\n\n// Reimplemented to use polygons vs. X & Y vectors\nfunction _polygonSimpleArea(p: any): number {\n let area = 0; // Accumulates area in the loop\n let n = p.length;\n let j = n - 1; // The last vertex is the 'previous' one to the first\n\n for (let i = 0; i < n; i++) {\n area = area + (p[j][0] + p[i][0]) * (p[j][1] - p[i][1]);\n // area = area + (X[j] + X[i]) * (Y[j] - Y[i]);\n j = i; // j is previous vertex to i\n }\n return Math.abs(area / 2);\n}\n\n// Generalizes the above for MultiPolygons -- cloned from polyArea() in 'poly'\nfunction _polygonArea(poly: any): number {\n let polyOptions = { noLatitudeCorrection: true } // NO-OP?\n poly = Poly.polyNormalize(poly, polyOptions); // TODO - POLY: Discuss w/ Terry\n\n let a: number = 0;\n\n // A MultiPolygon is a set of polygons\n for (let i: number = 0; poly && i < poly.length; i++) {\n // A single polygon is an exterior ring with interior holes. Holes are subtracted.\n let p = poly[i];\n for (let j: number = 0; j < p.length; j++) {\n let sp = p[j];\n a += _polygonSimpleArea(sp) * (j == 0 ? 1 : -1);\n }\n }\n\n return a;\n}\n\n// TODO - POLY: Confirm Cartesian calculations w/ Terry\n// The perimeter calculation already just computes cartesian distance if you\n// pass in the noLatitudeCorrection flag. You would need to divide by \n// Poly.EARTH_RADIUS to go from the returned units of meters to Lat/Lon “units”.\n\nexport function gfPerimeter(poly: any): number {\n let perimeter: number = _polygonPerimeter(poly);\n\n return perimeter;\n}\n\n// TODO - POLY: Confirm Cartesian calculations w/ Terry\n// Cloned from polyPerimeter() in 'poly' and revised to use Cartesian distance\n// NOTE: No conversion of degrees to radians!\nfunction _polygonPerimeter(poly: any): number {\n let polyOptions = { noLatitudeCorrection: true } // Cartesian distance\n poly = Poly.polyNormalize(poly, polyOptions);\n\n let perimeter: number = 0;\n for (let i: number = 0; poly && i < poly.length; i++) {\n // Ignore holes so only look at first polyline\n let p: any = poly[i][0];\n for (let j: number = 0; j < p.length - 1; j++)\n perimeter += _distance(p[j][0], p[j][1], p[j + 1][0], p[j + 1][1]);\n\n if (p.length > 2 && (p[0][0] != p[p.length - 1][0] || p[0][1] != p[p.length - 1][1]))\n perimeter += _distance(p[0][0], p[0][1], p[p.length - 1][0], p[p.length - 1][1]);\n }\n\n return perimeter;\n}\n\nfunction _distance(x1: number, y1: number, x2: number, y2: number): number {\n let dLat = y2 - y1;\n let dLon = x2 - x1;\n let d: number;\n\n d = Math.sqrt((dLat * dLat) + (dLon * dLon));\n\n return d;\n}\n\n// TODO - POLY: Confirm Cartesian calculations w/ Terry\n// As I mentioned, the polyCircle code was already just treating the coordinate\n// system as Cartesian. I then did polyFromCircle to convert it to a polygon that\n// then could be passed to polyArea in order to take into account the projection.\n// If instead, you compute area directly from the circle as PI R squared, then\n// you should have your cartesian circular area.\n\nexport function gfDiameter(poly: any): number {\n let polyOptions = { noLatitudeCorrection: true } // NO-OP\n\n let circle = Poly.polyToCircle(poly, polyOptions) as Poly.Circle;\n let diameter: number = circle.r * 2;\n\n return diameter;\n}\n","//\n// PROTECTS MINORITIES\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport { AnalyticsSession } from './_api';\n\nimport demographicDefs from '../static/demographic-defns.json';\nimport majorityMinority from '../static/majority-minority.json';\nimport stateContacts from '../static/state-contacts.json';\nimport vraSection5 from '../static/vra5-preclearance.json';\n\nexport function doMajorityMinorityDistricts(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.MajorityMinorityDistricts) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating # of majority-minority districts ...\");\n\n return test;\n}\n\n\n// Sources for majority-minority info:\n// - https://en.wikipedia.org/wiki/List_of_majority-minority_United_States_congressional_districts\n// TODO - 2020: Update/revise this, when the update comes out in September:\n// - http://www.ncsl.org/Portals/1/Documents/Redistricting/Redistricting_2010.pdf\n","//\n// FAIR/PROPORTIONAL\n//\n\nimport { strict as assert } from 'assert';\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n// Partisan analytics need the following data:\n//\n// An \"election model\" by geo_id, where each item has 4 pieces of data:\n//\n// { geo_id, Democratic votes, Republican votes, Total votes }\n//\n// NOTE: D + R <= Total, because there could be third-party or write-in votes.\n//\n// An election model can simply represent one election, e.g., President 2012,\n// or combine multiple elections in some fashion. An election model is used to\n// computer a single index of the likely partisan weight / lean / preference\n// for the districts in a plan. An election model and the associated index go\n// hand in hand. So much so that the index frequently stands in as the name for\n// both, e.g., Cook's PVI is one example, Nagle's 7s, Hofeller's Formula, NDRC's\n// DPI.\n//\n// I'm labelling this general concept a \"Voter Preference Index (VPI),\" a\n// conscious +1 letter play on Cook's \"PVI\" acronymn.\n\n\n// MEASURING BIAS & RESPONSIVENESS (NAGLE'S METHOD)\n\nexport function doSeatsBias(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.SeatsBias) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating seats bias ...\");\n\n return test;\n}\n\nexport function doVotesBias(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.VotesBias) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating votes bias ...\");\n\n return test;\n}\n\nexport function doResponsiveness(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Responsiveness) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating responsiveness ...\");\n\n return test;\n}\n\nexport function doResponsiveDistricts(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.ResponsiveDistricts) as T.TestEntry;\n\n if (bLog) console.log(\"TODO - Calculating # of responsive districts ...\");\n\n return test;\n}\n\n\n// OTHER MEASURES OF PARTISAN BIAS\n\n// TODO - PARTISAN: This formula might need to be inverted for D vs. R +/-\n// TODO - Normalize the results.\nexport function doEfficiencyGap(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n if (bLog) console.log(\"TODO - Calculating the efficiency gap ...\");\n\n let test = s.getTest(T.Test.EfficiencyGap) as T.TestEntry;\n\n // Get partisan statistics by districts.\n // Use Democratic votes, seats, and shares by convention.\n let DVotes = s.districts.statistics[D.DistrictField.DemVotes];\n let DSeats = s.districts.statistics[D.DistrictField.DemSeat];\n let TPVotes = s.districts.statistics[D.DistrictField.TwoPartyVote];\n\n // Exclude the dummy unassigned '0' and N+1 summary \"districts\"\n DVotes = DVotes.slice(1, -1);\n DSeats = DSeats.slice(1, -1);\n TPVotes = TPVotes.slice(1, -1);\n\n // Calculate D vote share & D seat share\n let DVoteShare = U.sumArray(DVotes) / U.sumArray(TPVotes);\n let DSeatShare = U.sumArray(DSeats) / s.state.nDistricts;\n\n // Finally, calculate the Efficiency Gap\n let efficiencyGap = (DSeatShare - 0.5) - (2.0 * (DVoteShare - 0.5));\n\n // Round the raw value to the desired level of precision\n efficiencyGap = U.trim(efficiencyGap);\n\n // Populate the test entry\n test['score'] = efficiencyGap;\n // test['normalizedScore'] = 0; /* TODO - Normalize the raw score */\n test['details'] = {}; /* TODO - Add details, if any */\n\n return test;\n}\n\n\n// HELPERS\n\nexport function fptpWin(demPct: number): number {\n // Vote shares should be fractions in the range [0.0 – 1.0]\n assert((demPct <= 1.0) && (demPct >= 0.));\n\n return ((demPct > 0.5) ? 1 : 0);\n}\n","//\n// PREPROCESS DATA\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n\n// NOTE - Do preprocessing separately, so the constructor returns quickly.\nexport function doPreprocessData(s: AnalyticsSession, bLog: boolean = false): void {\n // If necessary, do one-time preprocessing\n if (!s.bOneTimeProcessingDone) {\n doPreprocessCountyFeatures(s, bLog);\n doPreprocessCensus(s, bLog);\n doPreprocessElection(s, bLog);\n s.bOneTimeProcessingDone = true;\n }\n\n // NOTE - UNASSIGNED: Made both the planByGeoID & DistrictID are right\n // Invert the plan by district ID\n s.plan.invertPlan();\n\n // Create a map of geoIDs to feature IDs\n s.features.mapGeoIDsToFeatureIDs();\n}\n\n// CREATE A FIPS CODE TO COUNTY NAME LOOKUP\n\nfunction doPreprocessCountyFeatures(s: AnalyticsSession, bLog: boolean = false): void {\n for (let i: number = 0; i < s.counties.nCounties; i++) {\n\n let county = s.counties.countyByIndex(i);\n\n let fips = s.counties.propertyForCounty(county, 'COUNTYFP');\n let name = s.counties.propertyForCounty(county, 'NAME');\n\n s.counties.mapFIPSToName(fips, name);\n }\n}\n\n\n// ANALYZE THE CENSUS BY COUNTY\n\nfunction doPreprocessCensus(s: AnalyticsSession, bLog: boolean = false): void {\n // The county-splitting analytic needs the following info, using NC as an example:\n // '_stateTotal' = The total state population, e.g., 9,535,483 for NC's 2010 Census\n // 'totalByCounty' = The total population by county FIPS code\n\n // SUM TOTAL POPULATION BY COUNTY\n\n let totalByCounty: T.GeoIDTotal = {};\n\n // NOTE - This works w/o GEOIDs, because you're looping over all features.\n for (let i: number = 0; i < s.features.nFeatures(); i++) {\n let f: T.GeoFeature = s.features.featureByIndex(i);\n let geoID: string = s.features.geoIDForFeature(f);\n // Skip water-only features\n if (!(U.isWaterOnly(geoID))) {\n let value: number = s.features.fieldForFeature(f, D.Dataset.CENSUS, D.FeatureField.TotalPop);\n\n // Sum total population across the state\n s.state.totalPop += value;\n\n // Get the county FIPS code for the feature\n let county = U.parseGeoID(geoID)['county'] as string;\n let countyFIPS = U.getFIPSFromCountyGeoID(county);\n // If a subtotal for the county doesn't exist, initialize one\n if (!(U.keyExists(countyFIPS, totalByCounty))) {\n totalByCounty[countyFIPS] = 0;\n }\n // Sum total population by county\n totalByCounty[countyFIPS] += value;\n }\n // else {\n // console.log(\"Skipping water-only feature in Census preprocessing:\", geoID);\n // }\n }\n // NOTE - The above could be replaced, if I got totals on county.geojson.\n\n\n // CREATE A FIPS CODE-ORDINAL MAP\n\n // Get the county FIPS codes\n let fipsCodes = U.getObjectKeys(totalByCounty);\n // Sort the results\n fipsCodes = fipsCodes.sort();\n\n // NOTE - SPLITTING\n // Add a dummy county, for county-district splitting analysis\n fipsCodes.unshift('000');\n\n // Create the ID-ordinal map\n for (let i in fipsCodes) {\n s.counties.index[fipsCodes[i]] = Number(i);\n }\n\n\n // MAKE AN ARRAY OF TOTAL POPULATIONS BY COUNTY INDEX\n\n // Add an extra 0th virtual county bucket for county-district splitting analysis \n let nCountyBuckets = s.counties.nCounties + 1;\n let countyTotals: number[] = U.initArray(nCountyBuckets, 0);\n\n for (let fipsCode in totalByCounty) {\n let i = s.counties.indexFromFIPS(fipsCode);\n\n countyTotals[i] = totalByCounty[fipsCode];\n }\n\n s.counties.totalPopulation = countyTotals;\n\n\n // ANALYZE THE COUNTIES\n\n // 'target_size': 733499, # calc as total / districts\n let targetSize = Math.round(s.state.totalPop / s.state.nDistricts);\n\n // Find counties that are bigger than the target district size.\n // 'too_big' = The counties that are bigger than a district, e.g., ['Mecklenburg', 'Wake']\n // 'too_big_fips' = Their FIPS codes, e.g., ['119', '183']\n // 'expected_splits' = The # of counties that are bigger than a single district, e.g., 2\n // 'expected_affected' = The # of people whose district must be split, e.g., 353,623\n\n let tooBigFIPS = [];\n let tooBigName = [];\n let expectedSplits = 0;\n let expectedAffected = 0;\n\n // Loop over the counties\n for (let county in fipsCodes) {\n let fipsCode = fipsCodes[county];\n\n // NOTE - SPLITTING\n // Skip the dummy county\n if (fipsCode == '000') continue;\n\n let countyAffected = 0;\n\n // Find the number of required splits, assuming target district size.\n let rawQuotient = totalByCounty[fipsCode] / (targetSize + 1);\n let remainder = rawQuotient % 1;\n let quotient = rawQuotient - remainder;\n let countySplits = quotient;\n\n if (countySplits > 0) {\n countyAffected = totalByCounty[fipsCode] % targetSize;\n tooBigFIPS.push(fipsCode);\n tooBigName.push(s.counties.nameFromFIPS(fipsCode));\n }\n\n expectedSplits += countySplits;\n expectedAffected += countyAffected;\n }\n\n s.state.tooBigFIPS = tooBigFIPS;\n s.state.tooBigName = tooBigName;\n s.state.expectedSplits = expectedSplits;\n s.state.expectedAffected = expectedAffected;\n}\n\n\n// PREPROCESS ELECTION RESULTS\n\nfunction doPreprocessElection(s: AnalyticsSession, bLog: boolean = false): void {\n if (bLog) console.log(\"TODO - Preprocessing election data ...\");\n}\n\n","//\n// TEMPLATES FOR UNFORMATTED ANALYTICS RESULTS\n// \n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\nimport { doDeriveSecondaryTests } from './analyze';\n\nimport allStateReqs from '../static/state-reqs.json';\nimport stateNames from '../static/state-names.json';\n\n// PLAN ANALYTICS\n\nexport type RequirementsCategory = {\n score: T.TriState;\n metrics: {\n complete: T.TriState;\n contiguous: T.TriState;\n freeOfHoles: T.TriState;\n equalPopulation: T.TriState;\n };\n details: {\n unassignedFeatures: string[]; // A possibly empty list of GEOIDs\n emptyDistricts: number[]; // A possibly empty list of district IDs\n discontiguousDistricts: number[]; // Ditto\n embeddedDistricts: number[]; // Ditto\n populationDeviation: number; // A fraction [0.0 – 1.0] to represent as a %\n deviationThreshold: number; // A fraction [0.0 – 1.0] to represent as a % \n };\n datasets: T.Datasets;\n resources: {\n stateReqs: string;\n };\n};\n\nexport type CompactnessCategory = {\n score: number; // An integer score [0–100]\n metrics: {\n reock: number; // A decimal number [0.0–1.0]\n polsby: number; // A decimal number [0.0–1.0]\n };\n details: {\n // None at this time\n };\n datasets: T.Datasets;\n resources: {\n // None at this time\n };\n};\n\nexport type SplittingCategory = {\n score: number; // An integer score [0–100]\n metrics: {\n sqEnt_DCreduced: number, // A decimal number [1.0 – < 2.0]\n sqEnt_CDreduced: number // A decimal number [1.0 – < 2.0]\n };\n details: {\n countiesSplitUnexpectedly: string[], // A possibly empty list of county names\n unexpectedAffected: number, // A fraction [0.0 – 1.0] to represent as a %\n nSplitVTDs: number, // An integer, possibly 0\n splitVTDs: string[] // A possibly empty list of GEOIDs\n };\n datasets: T.Datasets;\n resources: {\n // None at this time\n };\n};\n\n// TODO - PARTISAN: This category is still under development.\n// We haven't settled on metrics yet. This is just an example.\nexport type PartisanCategory = {\n score: number; // An integer score [0–100]\n metrics: {\n partisanBias: 0.15, // TBD\n responsiveness: 2.0 // TBD\n };\n details: {\n // TODO - Need to flesh this out\n };\n datasets: T.Datasets;\n resources: {\n planScore?: string;\n };\n};\n\n// TODO - MINORITY: This category is still under development.\n// We haven't settled on metrics yet. This is just a (likely) example.\nexport type MinorityCategory = {\n score: null; // Explicitly NOT scored\n metrics: {\n nBlack37to50: number, // Integer >= 0; two-digit maximum\n nBlackMajority: number, // Ditto\n nHispanic37to50: number, // Ditto\n nHispanicMajority: number, // Ditto\n nPacific37to50: number, // Ditto\n nPacificMajority: number, // Ditto\n nAsian37to50: number, // Ditto\n nAsianMajority: number, // Ditto\n nNative37to50: number, // Ditto\n nNativeMajority: number, // Ditto\n nMinority37to50: number, // Ditto\n nMinorityMajority: number, // Ditto\n\n averageDVoteShare: number // A fraction [0.0 – 1.0] to represent as a %\n };\n details: {\n vap: true, // true = using VAP data; false = CVAP data\n comboCategories: true // true = using combo fields; false = mutually exclusive\n };\n datasets: T.Datasets;\n resources: {\n // TODO - Add these ...\n };\n};\n\nexport type PlanAnalytics = {\n requirements: RequirementsCategory;\n compactness: CompactnessCategory;\n // TODO - Don't show these categories yet\n splitting: SplittingCategory;\n partisan: PartisanCategory;\n minority: MinorityCategory;\n}\n\n\n// Example\n\nlet sampleRequirements: RequirementsCategory = {\n score: T.TriState.Red,\n metrics: {\n complete: T.TriState.Green,\n contiguous: T.TriState.Red,\n freeOfHoles: T.TriState.Yellow,\n equalPopulation: T.TriState.Red\n },\n details: {\n unassignedFeatures: [],\n emptyDistricts: [],\n discontiguousDistricts: [2],\n embeddedDistricts: [],\n populationDeviation: 0.6748,\n deviationThreshold: 0.75 / 100\n },\n datasets: {\n census: \"2010 Census Total Population\"\n },\n resources: {\n stateReqs: \"https://www.brennancenter.org/sites/default/files/publications/2019_06_50States_FINALsinglepages_20.pdf\"\n }\n}\n\nlet sampleCompactness: CompactnessCategory = {\n score: 60,\n metrics: {\n reock: 0.3773,\n polsby: 0.3815\n },\n details: {},\n datasets: {\n shapes: \"2010 VTD shapes\"\n },\n resources: {}\n}\n\nlet sampleSplitting: SplittingCategory = {\n score: 73,\n metrics: {\n sqEnt_DCreduced: 1.531,\n sqEnt_CDreduced: 1.760\n },\n details: {\n countiesSplitUnexpectedly: [\n \"Bladen\", \"Buncombe\", \"Catawba\", \"Cumberland\", \"Durham\", \"Guilford\", \"Iredell\", \"Johnston\", \"Pitt\", \"Rowan\", \"Wilson\"\n ],\n unexpectedAffected: 0.3096,\n nSplitVTDs: 12,\n splitVTDs: [\"VTD-01\", \"VTD-02\", \"VTD-03\", \"VTD-04\", \"VTD-05\", \"VTD-06\", \"VTD-07\", \"VTD-08\", \"VTD-09\", \"VTD-10\", \"VTD-11\", \"VTD-12\"]\n },\n datasets: {},\n resources: {}\n}\n\n// TODO - PARTISAN: This category is still being fleshed out.\nlet samplePartisan: PartisanCategory = {\n score: 100,\n metrics: {\n partisanBias: 0.15,\n responsiveness: 2.0\n },\n details: {},\n datasets: {\n election: \"2016 Presidential, US Senate, Governor, and AG election results\"\n },\n resources: {\n planScore: \"https://planscore.org/plan.html?20180219T202039.596761160Z\"\n }\n}\n\n// TODO - MINORITY: This category is still being fleshed out.\nlet sampleMinority: MinorityCategory = {\n score: null,\n metrics: {\n nBlack37to50: 1,\n nBlackMajority: 12,\n nHispanic37to50: 0,\n nHispanicMajority: 0,\n nPacific37to50: 0,\n nPacificMajority: 0,\n nAsian37to50: 0,\n nAsianMajority: 0,\n nNative37to50: 0,\n nNativeMajority: 0,\n nMinority37to50: 0,\n nMinorityMajority: 0,\n\n averageDVoteShare: 0.90\n },\n details: {\n vap: true,\n comboCategories: true\n },\n datasets: {\n vap: \"2010 Voting Age Population\"\n },\n resources: {}\n}\n\nexport const samplePlanAnalytics: PlanAnalytics = {\n requirements: sampleRequirements,\n compactness: sampleCompactness,\n // TODO - Don't show these categories yet\n splitting: sampleSplitting,\n partisan: samplePartisan,\n minority: sampleMinority\n}\n\nexport function preparePlanAnalytics(s: AnalyticsSession, bLog: boolean = false): PlanAnalytics {\n if (!(s.bPostProcessingDone)) {\n doAnalyzePostProcessing(s);\n }\n\n // REQUIREMENTS CATEGORY\n let paRequirements: RequirementsCategory;\n\n {\n let completeTest = s.getTest(T.Test.Complete) as T.TestEntry;\n let contiguousTest = s.getTest(T.Test.Contiguous) as T.TestEntry;\n let freeOfHolesTest = s.getTest(T.Test.FreeOfHoles) as T.TestEntry;\n let equalPopulationTest = s.getTest(T.Test.EqualPopulation) as T.TestEntry;\n\n // Combine individual checks into an overall score\n\n // TODO - DASHBOARD: Until we add three-state support top to bottom in\n // requirements/validations, map booleans to tri-states here.\n let completeMetric = U.mapBooleanToTriState(completeTest['score'] as boolean);\n let contiguousMetric = U.mapBooleanToTriState(contiguousTest['score'] as boolean);\n let freeOfHolesMetric = U.mapBooleanToTriState(freeOfHolesTest['score'] as boolean);\n let equalPopulationMetric = U.mapBooleanToTriState(equalPopulationTest['score'] as boolean);\n\n let reqScore: T.TriState = T.TriState.Green;\n let checks = [completeMetric, contiguousMetric, freeOfHolesMetric, equalPopulationMetric];\n if (checks.includes(T.TriState.Yellow)) reqScore = T.TriState.Yellow;\n if (checks.includes(T.TriState.Red)) reqScore = T.TriState.Red;\n\n // Get values to support details entries\n let unassignedFeaturesDetail = U.deepCopy(completeTest['details']['unassignedFeatures']) || [];\n let emptyDistrictsDetail = U.deepCopy(completeTest['details']['emptyDistricts']) || [];\n let discontiguousDistrictsDetail = U.deepCopy(contiguousTest['details']['discontiguousDistricts']) || [];\n let embeddedDistrictsDetail = U.deepCopy(freeOfHolesTest['details']['embeddedDistricts']) || [];\n\n let populationDeviationDetail = U.deepCopy(equalPopulationTest['details']['deviation']);\n let deviationThresholdDetail = U.trim(s.populationDeviationThreshold());\n\n let xx: string = s.state.xx;\n // TODO - JSON: Is there a better / easier way to work with the variable?\n let stateReqsDict: T.Dict = allStateReqs;\n let reqLinkToStateReqs: string = stateReqsDict[xx];\n\n // Populate the category\n paRequirements = {\n score: reqScore,\n metrics: {\n complete: completeMetric,\n contiguous: contiguousMetric,\n freeOfHoles: freeOfHolesMetric,\n equalPopulation: equalPopulationMetric\n },\n details: {\n unassignedFeatures: unassignedFeaturesDetail,\n emptyDistricts: emptyDistrictsDetail,\n discontiguousDistricts: discontiguousDistrictsDetail,\n embeddedDistricts: embeddedDistrictsDetail,\n populationDeviation: populationDeviationDetail,\n deviationThreshold: deviationThresholdDetail\n },\n datasets: {\n census: U.deepCopy(s.config['descriptions']['CENSUS']),\n },\n resources: {\n stateReqs: reqLinkToStateReqs\n }\n }\n }\n\n // COMPACTNESS CATEGORY\n let paCompactness: CompactnessCategory;\n {\n let reockWeight = 0.5;\n let polsbyWeight = 1.0 - reockWeight;\n\n let reockTest = s.getTest(T.Test.Reock) as T.TestEntry;\n let polsbyTest = s.getTest(T.Test.PolsbyPopper) as T.TestEntry;\n\n let normalizedReock = reockTest['normalizedScore'] as number;\n let normalizedPolsby = reockTest['normalizedScore'] as number;\n let compactnessScore = U.trim((reockWeight * normalizedReock) + (polsbyWeight * normalizedPolsby), 0);\n\n let reockMetric = U.deepCopy(reockTest['score'] as number);\n let polsbyMetric = U.deepCopy(polsbyTest['score'] as number);\n\n // Populate the category\n paCompactness = {\n score: compactnessScore,\n metrics: {\n reock: reockMetric,\n polsby: polsbyMetric\n },\n details: {\n // None at this time\n },\n datasets: {\n // NOTE - DATASETS\n shapes: U.deepCopy(s.config['descriptions']['SHAPES'])\n // shapes: \"2010 VTD shapes\"\n },\n resources: {\n // None at this time\n }\n }\n }\n\n // SPLITTING CATEGORY\n\n let paSplitting: SplittingCategory\n\n {\n let unexpectedCountySplittingTest = s.getTest(T.Test.UnexpectedCountySplits) as T.TestEntry;\n let VTDSplitsTest = s.getTest(T.Test.VTDSplits) as T.TestEntry;\n let countySplittingTest = s.getTest(T.Test.CountySplitting) as T.TestEntry;\n let districtSplittingTest = s.getTest(T.Test.DistrictSplitting) as T.TestEntry;\n\n let unexpectedAffectedMetric = U.deepCopy(unexpectedCountySplittingTest['score']);\n let countiesSplitUnexpectedlyDetail = U.deepCopy(unexpectedCountySplittingTest['details']['countiesSplitUnexpectedly']);\n\n let nVTDSplitsMetric = U.deepCopy(VTDSplitsTest['score']);\n let splitVTDsDetail = U.deepCopy(VTDSplitsTest['details']['splitVTDs']);\n\n let SqEnt_DCreducedMetric = U.deepCopy(countySplittingTest['score']);\n let SqEnt_CDreducedMetric = U.deepCopy(districtSplittingTest['score']);\n\n let countySplittingNormalized = countySplittingTest['normalizedScore'] as number;\n let districtSplittingNormalized = districtSplittingTest['normalizedScore'] as number;\n let splittingScore = U.trim((S.COUNTY_SPLITTING_WEIGHT * countySplittingNormalized) +\n + (S.DISTRICT_SPLITTING_WEIGHT * districtSplittingNormalized), 0);\n\n paSplitting = {\n score: splittingScore,\n metrics: {\n sqEnt_DCreduced: SqEnt_DCreducedMetric,\n sqEnt_CDreduced: SqEnt_CDreducedMetric\n // NOTE - The un-reduced raw values\n // sqEnt_DC : SqEnt_DCMetric,\n // sqEnt_CD : SqEnt_CDMetric\n },\n details: {\n countiesSplitUnexpectedly: countiesSplitUnexpectedlyDetail,\n unexpectedAffected: unexpectedAffectedMetric,\n nSplitVTDs: nVTDSplitsMetric,\n splitVTDs: splitVTDsDetail\n },\n datasets: {\n // None at this time\n },\n resources: {\n // None at this time\n }\n }\n }\n\n // PARTISAN CATEGORY\n //\n // TODO - PARTISAN: This category is still being fleshed out. Just an example below.\n let paPartisan: PartisanCategory;\n\n {\n paPartisan = {\n score: 100,\n metrics: {\n partisanBias: 0.15,\n responsiveness: 2.0\n },\n details: {},\n datasets: {\n election: \"2016 Presidential, US Senate, Governor, and AG election results\"\n },\n resources: {\n planScore: \"https://planscore.org/plan.html?20180219T202039.596761160Z\"\n }\n }\n }\n\n // MINORITY CATEGORY\n //\n // TODO - MINORITY: This category is still being fleshed out. Just an example below.\n let paMinority: MinorityCategory;\n\n {\n paMinority = {\n score: null,\n metrics: {\n nBlack37to50: 1,\n nBlackMajority: 12,\n nHispanic37to50: 0,\n nHispanicMajority: 0,\n nPacific37to50: 0,\n nPacificMajority: 0,\n nAsian37to50: 0,\n nAsianMajority: 0,\n nNative37to50: 0,\n nNativeMajority: 0,\n nMinority37to50: 0,\n nMinorityMajority: 0,\n\n averageDVoteShare: 0.90\n },\n details: {\n vap: true,\n comboCategories: true\n },\n datasets: {\n vap: \"2010 Voting Age Population\"\n },\n resources: {}\n }\n }\n\n // PLAN ANALYTICS\n let pa: PlanAnalytics = {\n requirements: paRequirements,\n compactness: paCompactness,\n // TODO - Not implemented yet\n splitting: paSplitting,\n partisan: paPartisan,\n minority: paMinority\n }\n\n return pa;\n}\n\n\n// DISTRICT STATISTICS\n\n// Indexes for the fields in the rows of the DistrictStatistics table\nexport const enum DistrictColumn { // Column headers:\n DistrictID, // 'ID'\n TotalPop, // 'Total'\n PopDevPct, // 'Δ%'\n bEqualPop, // Don't display. Use this to conditionally color PopDevPct.\n bNotEmpty, // Don't display. TotalPop = 0 shows empty districts.\n bContiguous, // Some TBD glyph suggesting contiguity\n bNotEmbedded, // Some TBD glyph suggesting embedded\n DemPct, // 'Dem'\n RepPct, // 'Rep'\n WhitePct, // 'White'\n MinorityPct, // 'Minority'\n BlackPct, // 'Black'\n HispanicPct, // 'Hispanic'\n PacificPct, // 'Pacific'\n AsianPct, // 'Asian'\n NativePct // 'Native\n}\n\nexport type DistrictRow = [\n number, // DistrictID\n number, // TotalPop\n number, // PopDevPct\n T.TriState | null, // bEqualPop\n T.TriState | null, // bNotEmpty\n T.TriState | null, // bContiguous\n T.TriState | null, // bNotEmbedded\n number, // DemPct\n number, // RepPct\n number, // WhitePct\n number, // MinorityPct\n number, // BlackPct\n number, // HispanicPct\n number, // PacificPct\n number, // AsianPct\n number // NativePct\n];\n\nexport type DistrictStatistics = {\n table: DistrictRow[];\n details: {}; // None at this time\n datasets: T.Datasets;\n resources: {}; // None at this time\n}\n\n// Example\n\nexport const sampleDistrictStatistics: DistrictStatistics = {\n table: [\n // District 0 is the dummy unassigned district\n [0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n [1, 653133, -0.0950, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Green, 0.4177, 0.5823, 0.8631, 0.1369, 0.0734, 0.0360, 0.0009, 0.0235, 0.0064],\n [2, 620961, -0.1396, T.TriState.Green, T.TriState.Red, T.TriState.Red, T.TriState.Green, 0.8820, 0.1180, 0.3129, 0.6871, 0.6169, 0.0391, 0.0013, 0.0310, 0.0099],\n [3, 971777, 0.3465, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Green, 0.7261, 0.2739, 0.5174, 0.4826, 0.1745, 0.1572, 0.0020, 0.1531, 0.0090],\n [4, 863420, 0.1964, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Green, 0.8957, 0.1043, 0.1734, 0.8266, 0.6489, 0.1348, 0.0020, 0.0496, 0.0127],\n [5, 805029, 0.1155, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Yellow, 0.5743, 0.4257, 0.6587, 0.3413, 0.2494, 0.0363, 0.0012, 0.0536, 0.0081],\n [6, 824741, 0.1428, T.TriState.Green, T.TriState.Red, T.TriState.Green, T.TriState.Red, 0.5341, 0.4659, 0.7045, 0.2955, 0.1619, 0.0526, 0.0018, 0.0782, 0.0090],\n [7, 549714, -0.2383, T.TriState.Green, T.TriState.Green, T.TriState.Green, T.TriState.Green, 0.5025, 0.4975, 0.6906, 0.3094, 0.2468, 0.0319, 0.0013, 0.0258, 0.0111],\n [8, 484777, -0.3283, T.TriState.Green, T.TriState.Green, T.TriState.Green, T.TriState.Green, 0.4105, 0.5895, 0.8370, 0.1630, 0.1074, 0.0316, 0.0013, 0.0197, 0.0077],\n // District N+1 is the dummy state-summary district\n [9, 721694, 0.6748, T.TriState.Green, T.TriState.Red, T.TriState.Red, T.TriState.Red, 0.6293, 0.3707, 0.5722, 0.4278, 0.2925, 0.0729, 0.0015, 0.0618, 0.0093]\n ],\n details: {},\n datasets: {\n shapes: \"2010 VTD shapes\",\n census: \"2010 Census Total Population\",\n vap: \"2010 Voting Age Population\",\n election: \"2016 Presidential, US Senate, Governor, and AG election results\"\n },\n resources: {}\n}\n\n// Create a DistrictStatistics instance, deep copying the underlying values.\nexport function prepareDistrictStatistics(s: AnalyticsSession, bLog: boolean = false): DistrictStatistics {\n if (!(s.bPostProcessingDone)) {\n doAnalyzePostProcessing(s);\n }\n\n let dsTable: DistrictRow[] = [];\n for (let i = 0; i < s.districts.numberOfRows(); i++) {\n let rawRow = [\n i,\n s.districts.statistics[D.DistrictField.TotalPop][i],\n s.districts.statistics[D.DistrictField.PopDevPct][i],\n s.districts.statistics[D.DistrictField.bEqualPop][i],\n s.districts.statistics[D.DistrictField.bNotEmpty][i],\n s.districts.statistics[D.DistrictField.bContiguous][i],\n s.districts.statistics[D.DistrictField.bNotEmbedded][i],\n s.districts.statistics[D.DistrictField.DemPct][i],\n s.districts.statistics[D.DistrictField.RepPct][i],\n s.districts.statistics[D.DistrictField.WhitePct][i],\n s.districts.statistics[D.DistrictField.MinorityPct][i],\n s.districts.statistics[D.DistrictField.BlackPct][i],\n s.districts.statistics[D.DistrictField.HispanicPct][i],\n s.districts.statistics[D.DistrictField.PacificPct][i],\n s.districts.statistics[D.DistrictField.AsianPct][i],\n s.districts.statistics[D.DistrictField.NativePct][i]\n ];\n\n // TODO - DASHBOARD: Until we add three-state support top to bottom in\n // requirements/validations, map booleans to tri-states here.\n rawRow[DistrictColumn.bEqualPop] = U.mapBooleanToTriState(rawRow[DistrictColumn.bEqualPop]);\n rawRow[DistrictColumn.bNotEmpty] = U.mapBooleanToTriState(rawRow[DistrictColumn.bNotEmpty]);\n rawRow[DistrictColumn.bContiguous] = U.mapBooleanToTriState(rawRow[DistrictColumn.bContiguous]);\n rawRow[DistrictColumn.bNotEmbedded] = U.mapBooleanToTriState(rawRow[DistrictColumn.bNotEmbedded]);\n\n let readyRow: DistrictRow = U.deepCopy(rawRow);\n dsTable.push(readyRow);\n }\n\n let dsDetails = {\n // None at this time\n };\n\n let dsDatasets: T.Datasets = {\n shapes: \"2010 VTD shapes\",\n census: U.deepCopy(s.config['descriptions']['CENSUS']),\n vap: U.deepCopy(s.config['descriptions']['VAP']),\n election: U.deepCopy(s.config['descriptions']['ELECTION'])\n }\n\n let dsResources = {\n // None at this time\n };\n\n let ds: DistrictStatistics = {\n table: dsTable,\n details: dsDetails,\n datasets: dsDatasets,\n resources: dsResources\n };\n\n return ds;\n}\n\n\n// META-DATA FOR TESTS/ANALYTICS\n// \n// NOTE - This structure is a vestige of having created a metadata-driven\n// scorecard w/in district-analytics at first. It works for creating the\n// unstyled results structures, so it isn't a high priority to rationalize.\n\nenum TestType {\n PassFail,\n Percentage,\n Number\n}\n\nconst completeDefn: T.Dict = {\n ID: T.Test.Complete,\n name: \"Complete\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst contiguousDefn: T.Dict = {\n ID: T.Test.Contiguous,\n name: \"Contiguous\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst freeOfHolesDefn: T.Dict = {\n ID: T.Test.FreeOfHoles,\n name: \"Free of Holes\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst equalPopulationDefn: T.Dict = {\n ID: T.Test.EqualPopulation,\n name: \"Equal Population\",\n normalize: false,\n externalType: TestType.PassFail,\n suites: [T.Suite.Legal]\n};\n\nconst populationDeviationDefn: T.Dict = {\n ID: T.Test.PopulationDeviation,\n name: \"Population Deviation\",\n normalize: true,\n externalType: TestType.Percentage,\n suites: [T.Suite.Legal, T.Suite.Best] // Both so EqualPopulation can be assessed\n};\n\nconst reockDefn: T.Dict = {\n ID: T.Test.Reock,\n name: \"Reock\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\nconst polsbyPopperDefn: T.Dict = {\n ID: T.Test.PolsbyPopper,\n name: \"Polsby-Popper\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst unexpectedCountySplitsDefn: T.Dict = {\n ID: T.Test.UnexpectedCountySplits,\n name: \"Unexpected County Splits\",\n normalize: false,\n externalType: TestType.Percentage,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst VTDSplitsDefn: T.Dict = {\n ID: T.Test.VTDSplits,\n name: \"VTD Splits\",\n normalize: false,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst countySplittingDefn: T.Dict = {\n ID: T.Test.CountySplitting,\n name: \"County Splitting\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\n// NOTE - SPLITTING\nconst districtSplittingDefn: T.Dict = {\n ID: T.Test.DistrictSplitting,\n name: \"District Splitting\",\n normalize: true,\n externalType: TestType.Number,\n suites: [T.Suite.Best]\n};\n\nconst efficiencyGapDefn: T.Dict = {\n ID: T.Test.EfficiencyGap,\n name: \"Efficiency Gap\",\n normalize: false, // TODO - Normalize this!\n externalType: TestType.Percentage,\n suites: [T.Suite.Fair]\n};\n\n// A structure to hold test definitions\ntype TestDefns = {\n [category: number]: any;\n}\n\n// All the tests that have been defined (can be reported on)\nconst testDefns = {\n [T.Test.Complete]: completeDefn,\n [T.Test.Contiguous]: contiguousDefn,\n [T.Test.FreeOfHoles]: freeOfHolesDefn,\n [T.Test.EqualPopulation]: equalPopulationDefn,\n [T.Test.PopulationDeviation]: populationDeviationDefn,\n [T.Test.Reock]: reockDefn,\n [T.Test.PolsbyPopper]: polsbyPopperDefn,\n // NOTE - SPLITTING\n [T.Test.UnexpectedCountySplits]: unexpectedCountySplitsDefn,\n [T.Test.VTDSplits]: VTDSplitsDefn,\n [T.Test.CountySplitting]: countySplittingDefn,\n [T.Test.DistrictSplitting]: districtSplittingDefn,\n\n // TODO - More tests ...\n\n [T.Test.EfficiencyGap]: efficiencyGapDefn\n} as TestDefns;\n\n\n// NORMALIZE RAW ANALYTICS\n// Raw numeric analytics, such as population deviation, compactness, etc. are\n// normalized as part of creating a scorecard, so the code to normalize results\n// is encapsulated here.\n\n// Configure scale parameters for normalizing each raw test result.\n// Scales consist of a minimum & a maximum *raw* value. If the values get\n// inverted (to make bigger better), these will switch.\n// This process needs to be separate from the test configuration info above,\n// because some scales need access to the analytics session object.\nexport function doConfigureScales(s: AnalyticsSession): void {\n // Scale defn for PopulationDeviation\n const CDLimit = 0.75 / 100; // Deviation threshold for CD's\n const LDLimit = 10.00 / 100; // Deviation threshold for LD's\n\n const CDGoodEnough = 0.20 / 100;\n const LDGoodEnough = (CDGoodEnough / CDLimit) * LDLimit;\n const popDevScale = (s.legislativeDistricts) ? [1.0 - LDLimit, 1.0 - LDGoodEnough] : [1.0 - CDLimit, 1.0 - CDGoodEnough];\n // const scale = [1.0 - CDLimit, 1.0 - CDGoodEnough];\n\n s.testScales[T.Test.PopulationDeviation] = { scale: popDevScale, bInvertRaw: true };\n\n s.testScales[T.Test.Reock] = { scale: [0.25, 0.50] };\n s.testScales[T.Test.PolsbyPopper] = { scale: [0.10, 0.50] };\n\n const nDistricts = s.state.nDistricts;\n const nCounties = s.counties.nCounties;\n\n // NOTE - SPLITTING: Experiment w/ this multiplier. Only allowing the expected\n // number of county splits seems too stringent, empirically. \n const allowableCountySplitsMultiplier = 1.5;\n const nAllowableSplits = Math.min(allowableCountySplitsMultiplier * (nDistricts - 1));\n const countySplittingThreshold = ((nAllowableSplits * 1.71) + ((nCounties - nAllowableSplits) * 1.0)) / nCounties;\n const countySplittingScale = [1.0, countySplittingThreshold];\n s.testScales[T.Test.CountySplitting] = { scale: countySplittingScale, bInvertScaled: true };\n\n const districtSplittingThreshold = 1.5;\n const districtSplittingScale = [1.0, districtSplittingThreshold];\n s.testScales[T.Test.DistrictSplitting] = { scale: districtSplittingScale, bInvertScaled: true };\n\n // TODO - More analytics ...\n}\n\n// Postprocess analytics - Normalize numeric results and derive secondary tests.\n// Do this after analytics have been run and before preparing a test log or scorecard. \nexport function doAnalyzePostProcessing(s: AnalyticsSession, bLog: boolean = false): void {\n // Normalize the raw scores for all the numerics tests\n let testResults = U.getNumericObjectKeys(testDefns);\n\n for (let testID of testResults) {\n if (testDefns[testID]['normalize']) {\n let testResult = s.getTest(testID) as T.TestEntry;\n\n let rawScore = testResult['score'] as number;\n let normalizedScore: number;\n\n normalizedScore = U.normalize(rawScore, s.testScales[testID]);\n testResult['normalizedScore'] = normalizedScore;\n\n // Add the scale used to normalize the raw score to the details\n testResult['details']['scale'] = s.testScales[testID].scale;\n }\n }\n\n // Derive secondary tests\n doDeriveSecondaryTests(s, bLog);\n\n // Toggle the semaphore, so postprocessing isn't for both the testlog & scorecard\n s.bPostProcessingDone = true;\n}\n\n","//\n// GLOBAL CONSTANTS\n//\n\n// Keep four decimal places for fractions [0–1], i.e.,\n// keep two decimal places for %'s [0–100].\nexport const PRECISION: number = 4;\n\n// Normalized scores [0-100]\nexport const NORMALIZED_RANGE: number = 100;\n\n// The dummy district ID for features not assigned districts yet\nexport const NOT_ASSIGNED: number = 0;\n\n// TODO - DASHBOARD: Discuss w/ Dave\n// # of items to report as problematic (e.g., features, districts, etc.)\nexport const NUMBER_OF_ITEMS_TO_REPORT: number = 10;\n\n// The virtual geoID for \"neighbors\" in other states\nexport const OUT_OF_STATE: string = \"OUT_OF_STATE\";\n\n// \"Roughly equal\" = average census block size / 2\nconst AVERAGE_BLOCK_SIZE = 30;\nexport const EQUAL_TOLERANCE: number = AVERAGE_BLOCK_SIZE / 2;\n\n// County & district splitting weights\nexport const COUNTY_SPLITTING_WEIGHT = 0.8;\nexport const DISTRICT_SPLITTING_WEIGHT = 1.0 - COUNTY_SPLITTING_WEIGHT;\n","//\n// UTILITIES\n//\n\nimport * as T from './types'\nimport * as S from './settings';\n\n// PLAN HELPERS\n\n// Is a \"neighbor\" in state?\nexport function isInState(geoID: string): boolean {\n return geoID != S.OUT_OF_STATE;\n}\n\n// Is a \"neighbor\" out of state?\nexport function isOutOfState(geoID: string): boolean {\n return geoID == S.OUT_OF_STATE;\n}\n\n// NOTE - UNASSIGNED\n// Get the districtID to which a geoID is assigned\nexport function getDistrict(plan: T.PlanByGeoID, geoID: string): number | undefined {\n // All geoIDs in a state *should be* assigned to a district (including the\n // dummy \"unassigned\" district), but \"water-only\" features are sometimes missing\n // from a map. This is also a guard against a bug in which a geoID has no district.\n if (keyExists(geoID, plan)) {\n return plan[geoID];\n }\n else {\n return undefined;\n }\n}\n\n\n// WORKING WITH GEOIDS\n\nexport function parseGeoID(geoID: string): T.GeoIDParts {\n let parts: T.GeoIDParts = {};\n\n parts['state'] = geoID.substring(0, 2);\n parts['county'] = geoID.substring(0, 5);\n\n let l: number = geoID.length;\n\n if (l >= 11) {\n parts['tract'] = geoID.substring(0, 11);\n }\n\n if (l >= 12) {\n parts['bg'] = geoID.substring(0, 12);\n }\n\n if (l == 15) {\n parts['block'] = geoID;\n }\n\n return parts;\n}\n\nexport function getFIPSFromCountyGeoID(geoID: string): string {\n return geoID.substring(2, 5);\n}\n\nexport function isWaterOnly(geoID: string): boolean {\n let waterOnlySignature = 'ZZZZZZ';\n\n if (geoID.indexOf(waterOnlySignature) >= 0) return true;\n else return false;\n}\n\n// NORMALIZING RESULTS\n\nexport function normalize(rawScore: number, testScale: T.TestScale): number {\n let rangeMin: number = testScale.scale[0];\n let rangeMax: number = testScale.scale[1];\n\n // Invert the raw value if necessary to make bigger = better\n // TODO - This works for Population Deviation, because the max is 1.0.\n // Generalize this???\n if (testScale.bInvertRaw) {\n rawScore = 1.0 - rawScore;\n }\n\n // Coerce the value to be w/in the given range\n let coercedValue = Math.min(Math.max(rawScore, rangeMin), rangeMax);\n\n // Scale the bounded value w/in the range [0 - (rangeMax - rangeMin)]\n let scaledValue = (coercedValue - rangeMin) / (rangeMax - rangeMin);\n\n // NOTE - SPLITTING\n // Invert the scaled value if necessary to make bigger = better\n if (testScale.bInvertScaled) {\n scaledValue = 1.0 - scaledValue;\n }\n\n // Finally, make the range [0-100]\n return Math.round(scaledValue * S.NORMALIZED_RANGE);\n}\n\n// Round a fractional number [0-1] to the desired level of PRECISION.\nexport function trim(fullFraction: number, digits: number | undefined = undefined): number {\n if (digits == 0) {\n return Math.round(fullFraction);\n }\n else {\n let shiftPlaces = 10 ** (digits || S.PRECISION);\n\n return Math.round(fullFraction * shiftPlaces) / shiftPlaces;\n }\n}\n\n// ARRAY HELPERS\n\nexport function sumArray(arr: number[]): number {\n return arr.reduce((a, b) => a + b, 0);\n}\n\nexport function avgArray(arr: number[]): number {\n return (arr.reduce((a, b) => a + b, 0)) / arr.length;\n}\n\nexport function minArray(arr: number[]): number {\n return Math.min(...arr);\n}\n\nexport function maxArray(arr: number[]): number {\n return Math.max(...arr);\n}\n\nexport function initArray(n: number, value: any): any[] {\n return Array.from(Array(n), () => value);\n}\n\nexport function andArray(arr: boolean[]): boolean {\n return arr.reduce(function (a, b) { return a && b; }, true);\n}\n\n// WORKING WITH OBJECT KEYS/PROPERTIES\n\n// TODO - TERRY, is this copesetic?\n// TODO - Handle integer keys?\n// Does an object have a key/property?\nexport function keyExists(k: string, o: object): boolean {\n return k in o;\n}\n\n// TODO - TERRY, can these three be combined into a generic isEmpty() check?\n// Does an object (dict) have any keys/properties?\nexport function isObjectEmpty(o: object): boolean {\n return Object.keys(o).length === 0\n}\n// Does a Set have any members?\nexport function isSetEmpty(s: any): boolean {\n return s.size === 0\n}\n// Does an array hold any items?\nexport function isArrayEmpty(a: any[]): boolean {\n if (a === undefined || a.length == 0) {\n // array empty or does not exist\n return true;\n }\n else {\n return false;\n }\n}\n\n// Get the keys for an object\nexport function getObjectKeys(o: object): string[] {\n return Object.keys(o);\n}\n\n// TODO - Convert getNumericObjectKeys() idiom to for..of where possible\nexport function getNumericObjectKeys(o: object): number[] {\n return Object.keys(o).map(Number);\n}\n\nexport function getSelectObjectKeys(o: T.Dict, v: any[]): string[] {\n let selectKeys: string[] = [];\n\n Object.keys(o).forEach(key => {\n if (arrayContains(v, o[key])) {\n selectKeys.push(key);\n }\n });\n\n return selectKeys;\n}\n\nexport function arrayContains(a: any[], item: any): boolean {\n return a.some(x => x === item);\n}\n\nexport function objectContains(o: object, key: any): boolean {\n return (key in o);\n}\n\n\n// ENUM HELPERS\n\n// Source: https://stackoverflow.com/questions/38034673/determine-the-number-of-enum-elements-typescript\nexport function countEnumValues(enumName: any): number {\n let count = 0\n for (let item in enumName) {\n if (isNaN(Number(item))) count++\n }\n return count\n}\n\n// COPYING - Copied from dra-client/util.ts\n\nexport function shallowCopy(src: any): any {\n if (Array.isArray(src))\n return src.slice();\n else if (typeof src === 'object') {\n let dst: any = {};\n for (var p in src) if (src.hasOwnProperty(p))\n dst[p] = src[p];\n return dst;\n }\n else\n return src;\n}\n\nexport function deepCopy(src: any): any {\n if (Array.isArray(src)) {\n let dst: any[] = [];\n\n for (let i: number = 0; i < src.length; i++)\n dst.push(deepCopy(src[i]));\n return dst;\n }\n else if (typeof src === 'object') {\n let dst: any = {};\n for (var p in src) if (src.hasOwnProperty(p))\n dst[p] = deepCopy(src[p]);\n return dst;\n }\n else\n return src;\n}\n\n\n// TODO - TRI-STATES: Map booleans to tri-states.\nexport function mapBooleanToTriState(bool: boolean): T.TriState {\n return (bool) ? T.TriState.Green : T.TriState.Red;\n}\n\n// TODO - TERRY: What is this the simple explanation of what this thing is doing?\nexport { depthof } from '@dra2020/util';\n","//\n// MAP/PLAN VALIDATIONS\n//\n\nimport * as T from './types'\nimport * as U from './utils';\nimport * as S from './settings';\n\nimport * as D from './_data'\nimport { AnalyticsSession } from './_api';\n\n//\n// COMPLETE - Are all geo's assigned to a district, and do all districts have\n// at least one geo assigned to them?\n//\n\nexport function doIsComplete(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Complete) as T.TestEntry;\n\n // Get the by-district results, including the dummy unassigned district,\n // but ignoring the N+1 summary district\n let bNotEmptyByDistrict = s.districts.statistics[D.DistrictField.bNotEmpty];\n bNotEmptyByDistrict = bNotEmptyByDistrict.slice(0, -1);\n\n // Are all features assigned to districts?\n // Check the dummy district that holds any unassigned features.\n let unassignedFeatures: string[] = [];\n let bAllAssigned = (!bNotEmptyByDistrict[S.NOT_ASSIGNED]);\n\n if (!bAllAssigned) {\n let unassignedDistrict = s.plan.geoIDsForDistrictID(S.NOT_ASSIGNED);\n unassignedFeatures = Array.from(unassignedDistrict);\n unassignedFeatures = unassignedFeatures.slice(0, S.NUMBER_OF_ITEMS_TO_REPORT);\n }\n\n // Do all real districts have at least one feature assigned to them?\n let emptyDistricts: number[] = [];\n let bNoneEmpty = true;\n bNotEmptyByDistrict = bNotEmptyByDistrict.slice(1);\n\n let districtID = 1;\n bNotEmptyByDistrict.forEach(function (bNotEmpty: boolean): void {\n if (!bNotEmpty) {\n bNoneEmpty = false;\n emptyDistricts.push(districtID);\n }\n districtID += 1;\n });\n\n // Case 1 - One or more districts are missing:\n // The # of enumerated districts minus the dummy NOT_ASSIGNED one should\n // equal the number apportioned districts. This guards against a district\n // not being included in a map that is imported.\n //\n // NOTE - I'm no longer checking for this, but DRA should!\n\n // Case 2 - Or a district is explicitly named but empty:\n // Note, this can happen if a district is created, and then all features\n // are removed from it (in DRA).\n\n // Populate the test entry\n test['score'] = bAllAssigned && bNoneEmpty;\n if (!bAllAssigned) {\n test['details']['unassignedFeatures'] = unassignedFeatures;\n }\n\n if (!bNoneEmpty) {\n test['details']['emptyDistricts'] = emptyDistricts;\n }\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bNotEmpty = s.districts.statistics[D.DistrictField.bNotEmpty];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bNotEmpty[summaryRow] = test['score'];\n\n return test;\n}\n\n//\n// CONTIGUOUS - Is each district in a plan fully connected?\n//\n// NOTE - To check \"operational contiguity,\" we need to use a graph, i.e.,\n// we can't rely on just the geometric contiguity of shapes in a shapefile.\n//\n// To test this, load the NC 2010 map 'SAMPLE-BG-map-discontiguous.csv'.\n//\n\nexport function doIsContiguous(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.Contiguous) as T.TestEntry;\n\n // Get the contiguity of each district. Ignore dummy unassigned district\n // and the N+1 summary district.\n let bContiguousByDistrict = s.districts.statistics[D.DistrictField.bContiguous];\n bContiguousByDistrict = bContiguousByDistrict.slice(1, -1);\n\n // If any real districts aren't contiguous, mark the plan as not contiguous\n let bMapContiguous = U.andArray(bContiguousByDistrict);\n\n // If the map is not contiguous, log the offending districts.\n let discontiguousDistricts: number[] = [];\n let districtID = 1;\n bContiguousByDistrict.forEach(function (bDistrictContiguous: boolean): void {\n if (!bDistrictContiguous) discontiguousDistricts.push(districtID);\n districtID += 1;\n });\n\n // Populate the test entry\n test['score'] = bMapContiguous;\n if (!bMapContiguous) {\n test['details'] = { 'discontiguousDistricts': discontiguousDistricts };\n }\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bContiguous = s.districts.statistics[D.DistrictField.bContiguous];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bContiguous[summaryRow] = test['score'];\n\n return test;\n}\n\n// Are the features in a district fully connected?\nexport function isConnected(districtGeos: Set<string>, graph: D.Graph): boolean {\n // TODO - TERRY, why does this constructor need a <T> type specification?\n let visited = new Set<string>();\n let toProcess: string[] = [];\n\n // Start processing with the first geoID in the district\n let iter = districtGeos.values();\n toProcess.push(iter.next().value);\n\n // While there are geoIDs in the district that haven't been processed\n while (toProcess.length > 0) {\n // Grab a geoID and process it\n let node = toProcess.pop() as string;\n visited.add(node);\n\n // Get its actual, in-state neighbors\n let actualNeighbors = graph.peerNeighbors(node).filter(x => U.isInState(x));\n\n // Add neighbors to visit, if they're in the same district Y haven't already been visited\n let neighborsToVisit = actualNeighbors.filter(x => districtGeos.has(x) && (!visited.has(x)));\n // TODO - TERRY, is this the quickest/best way to do this?\n toProcess.push(...neighborsToVisit);\n }\n\n // Stop when you've visited all the geoIDs in the district\n return visited.size == districtGeos.size;\n}\n\n\n//\n// FREE OF HOLES - Are any districts fully embedded w/in another district?\n//\n// A district is NOT a \"donut hole\" district:\n// - If any neighbor is 'OUT_OF_STATE'; or\n// - If there are 2 or more neighboring districts.\n//\n// To test this, load the NC 2010 map 'SAMPLE-BG-map-hole.csv'. District 1,\n// Buncombe County (37021), is a donut hole w/in District 3.\n//\n// TODO - OPTIMIZE: This to take advantage of district boundary info, if/when\n// we cache one to optimize compactness.\n//\n\nexport function doIsFreeOfHoles(s: AnalyticsSession, bLog: boolean = false): T.TestEntry {\n let test = s.getTest(T.Test.FreeOfHoles) as T.TestEntry;\n\n // Initialize values\n let bFreeOfHoles = true;\n let embeddedDistricts: number[] = [];\n\n // Get the embeddedness of each district. Ignore dummy unassigned district\n // and the N+1 summary district.\n let bNotEmbeddedByDistrict = s.districts.statistics[D.DistrictField.bNotEmbedded];\n bNotEmbeddedByDistrict = bNotEmbeddedByDistrict.slice(1, -1);\n\n let districtID = 1;\n bNotEmbeddedByDistrict.forEach(function (bDistrictNotEmbedded: boolean): void {\n if (!bDistrictNotEmbedded) {\n embeddedDistricts.push(districtID);\n bFreeOfHoles = false;\n }\n districtID += 1;\n });\n\n // Populate the test entry\n test['score'] = bFreeOfHoles;\n if (!bFreeOfHoles) {\n test['details'] = { 'embeddedDistricts': embeddedDistricts };\n }\n\n // Populate the N+1 summary \"district\" in district.statistics\n let bNotEmbedded = s.districts.statistics[D.DistrictField.bNotEmbedded];\n let summaryRow = s.districts.numberOfRows() - 1;\n\n bNotEmbedded[summaryRow] = test['score'];\n\n return test;\n}\n\n// Test whether one district is embedded w/in any other.\nexport function isEmbedded(districtID: number, geoIDs: Set<string>, plan: D.Plan, graph: D.Graph): boolean {\n // NOTE - \"features\" here = \"geoIDs.\" These aren't \"features\" proper, just\n // identifier strings.\n let features = geoIDs;\n let planByGeo = plan.byGeoID();\n\n // Assume the district is embedded\n let bEmbedded = true;\n // Keep track of the neighoring districts\n let neighboringDistricts = new Set();\n\n // TODO - OPTIMIZE: Use just the boundary features, when available\n // Get the features for the real district\n let featuresToCheck = Array.from(features);\n\n // If the district has features, check whether it is embedded\n if (!(U.isArrayEmpty(featuresToCheck))) {\n // For each feature that needs to be checked (see above)\n for (let feature of featuresToCheck) {\n // Get its neighbors (including the virtual \"out of state\" ones)\n let neighbors = graph.peerNeighbors(feature);\n\n for (let neighbor of neighbors) {\n if (U.isOutOfState(neighbor)) {\n bEmbedded = false;\n // No need to check any more neighbors\n break;\n }\n else {\n let neighboringDistrict = U.getDistrict(planByGeo, neighbor);\n\n // Assume that a missing district assignment (= None) means that the\n // feature is \"water-only\" AND part of the state border (vs. internal)\n // and, therefore, not in the plan/map.\n\n if (neighboringDistrict == undefined) {\n bEmbedded = false;\n // No need to check any more neighbors\n break;\n }\n else {\n // TODO - OPTIMIZE: Since we're checking *all* features in a district right\n // now, not just boundary features and neighbors in other districts,\n // prune out the current district. If/when we optimize compactness\n // to cache district boundaries (as before in my Python implementation),\n // we won't have to guard adding \"neighboring\" districts in this way.\n if (neighboringDistrict != districtID) {\n neighboringDistricts.add(neighboringDistrict);\n }\n\n if (neighboringDistricts.size > 1) {\n bEmbedded = false;\n // No need to check any more neighbors\n break;\n }\n }\n }\n }\n // If a district is not embedded, there's no need to check anymore\n // border geos.\n if (!bEmbedded) {\n break;\n }\n }\n\n }\n\n return bEmbedded;\n}\n\n","//\n// A SIMPLE COMMAND-LINE INTERFACE FOR EXERCISING THE ANALYTICS & VALIDATIONS\n//\n\n/* \n\nCONFIGURATIONS\n\nThese configurations implement various CLI tests (using the commands in parens)\nw/in VS Code:\n\n* api-analyze (analyze) - Analyzes a plan and logs the results.\n\n* unit-valid (valid) - Exercises the validations.\n* unit-equal (equal) - Exercises the population deviation analytic.\n* unit-compact (compact) - Exercises the compactness analytics.\n* unit-cohesive (cohesive) - Exercises the splitting analytics.\n* unit-political (political) - Exercises the partisan analytics.\n* unit-minority (minority) - Exercises the minority analytics.\n\n* invalid-unassigned (valid) - Tests a plan w/ unassigned features.\n* invalid-missing (valid) - Tests a plan w/ a missing district.\n* invalid-empty (valid) - Tests a plan w/ an empty district.\n* invalid-discontiguous (valid) - Tests a plan w/ a discontiguous district.\n* invalid-hole (valid) - Tests a plan w/ an embedded district.\n\n\nCOMMANDS\n\nTests can also be exercised from the commmand line from the project directory.\nThis is a sample. Use \"node --inspect --inspect-brk main.js ...\" to attach a debugger.\n\n1 - Plain vanilla run:\n./main.js analyze -x NC -n 13 -p data/SAMPLE-BG-map.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n2 - Missing district:\n./main.js analyze -x NC -n 13 -p data/SAMPLE-BG-map-missing.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n3 - Empty district:\n./main.js valid -x NC -n 13 -p data/SAMPLE-BG-map.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson --empty\n\n4 - Unassigned features:\n./main.js analyze -x NC -n 13 -p data/SAMPLE-BG-map-unassigned.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n5 - Discontiguous districts:\n./main.js analyze -n 13 -p data/SAMPLE-BG-map-discontiguous.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n6 - Embedded district:\n./main.js analyze -n 13 -p data/SAMPLE-BG-map-hole.csv -d data/SAMPLE-BG-data2.json -s data/SAMPLE-BG-shapes.geojson -g data/SAMPLE-BG-graph.json -c data/SAMPLE-COUNTY.geojson\n\n7 - Test using NC block-level data <<< TODO - Need BLOCK-data2.json & COUNTY.geojson to run this again.\n\ncd ~/Documents/Professional/Projects/Redistricting/DRA2020/Analytics/compact/classic/ts_sample\n./main.js analyze -v -n 13 -p SAMPLE-BLOCK-map.csv -d SAMPLE-BLOCK-data2.json -s SAMPLE-BLOCK-shapes.geojson -g SAMPLE-BLOCK-graph.json -c SAMPLE-COUNTY.geojson\n\n*/\n\n\nimport yargs from 'yargs';\n// TODO - Fix this import, so I don't have to do the 'union' workaround below.\nimport * as PC from 'polygon-clipping';\nimport * as Poly from '@dra2020/poly';\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport parse from 'csv-parse/lib/sync';\n\nimport { AnalyticsSession } from '../src/_api'\nimport { doPreprocessData } from '../src/preprocess'\nimport { doAnalyzeDistricts } from '../src/analyze'\nimport { doAnalyzePostProcessing, PlanAnalytics, DistrictStatistics, DistrictColumn } from '../src/results'\nimport { doIsComplete, doIsContiguous, doIsFreeOfHoles } from '../src/valid'\nimport { doPopulationDeviation, doHasEqualPopulations } from '../src/equal';\nimport { doReock, doPolsbyPopper } from '../src/compact';\nimport {\n doFindCountiesSplitUnexpectedly, doFindSplitVTDs,\n doCountySplitting, doDistrictSplitting\n} from '../src/cohesive';\nimport {\n doSeatsBias, doVotesBias,\n doResponsiveness, doResponsiveDistricts,\n doEfficiencyGap\n} from '../src/political';\nimport { doMajorityMinorityDistricts } from '../src/minority';\n// import { gfArea, gfPerimeter, gfDiameter } from '../src/geofeature';\n\nimport * as T from '../src/types'\nimport * as U from '../src/utils';\nimport * as S from '../src/settings';\n\nimport * as D from '../src/_data';\nimport { DistrictRow } from '../src/results';\n\n// Simulate DRA unioning district shapes in the background\nfunction addToPoly(poly: any, polys: any[]): any {\n // TODO - POLY: Fix 'poly' import, so I don't have to do this workaround.\n // return PC.union(poly, ...polys);\n let union: any = PC.union;\n if (union === undefined)\n union = PC.default.union;\n\n return union(poly, ...polys);\n}\n\n\nconsole.log(\"Starting command @ \", new Date());\n\n// COMMAND LINE\n\nlet argv = yargs\n .usage('Usage: $0 command [options]')\n .example('$0 equal -f foo.geojson', 'Calculate population deviation')\n .demandCommand(1, 'You must specify a command to execute.')\n .command('valid', 'Perform validations.')\n .command('equal', 'Calculate population deviation.')\n .command('compact', 'Calculate compactness.')\n .command('cohesive', 'Calculate cohesiveness.')\n .command('political', 'Assess fairness.')\n .command('minority', 'Count majority-minority districts.')\n .command('analyze', 'API call to analyze a plan.')\n .command('scorecard', 'Analyze plan & generate a scorecard.')\n .command('testlog', 'Analyze plan & generate a testlog.')\n .command('report', 'API call to generate a scorecard.')\n .option('state', {\n alias: 'x',\n describe: 'Specify the state.',\n type: 'string'\n })\n .option('number', {\n alias: 'n',\n describe: 'Specify the number of districts.',\n type: 'number'\n })\n .option('legislative', {\n alias: 'l',\n describe: 'Specify that districts are legislative.',\n type: 'boolean',\n default: false\n })\n .option('plan', {\n alias: 'p',\n describe: 'Specify the plan to evaluate.',\n type: 'string'\n })\n .option('data', {\n alias: 'd',\n describe: 'Specify the census & election data to use.',\n type: 'string'\n })\n .option('shapes', {\n alias: 's',\n describe: 'Specify the shapes to use.',\n type: 'string'\n })\n .option('graph', {\n alias: 'g',\n describe: 'Specify the contiguity graph to use.',\n type: 'string'\n })\n .option('counties', {\n alias: 'c',\n describe: 'Specify the FIPS-to-county-name map to use.',\n type: 'string'\n })\n .option('empty', {\n describe: 'Specify whether a district should be empty.',\n type: 'boolean',\n default: false\n })\n .option('suites', {\n describe: 'Specify the test suites to run.',\n type: 'array',\n default: []\n })\n .option('verbose', {\n alias: 'v',\n describe: 'Specify whether code should log to STDOUT.',\n type: 'boolean',\n default: false\n })\n .demandOption(['number', 'plan', 'data', 'shapes', 'counties'],\n 'Please specify all the args.')\n .help()\n .argv;\n\n\n// PROCESS COMMAND LINE ARGS\n\nlet command = argv._[0]\n\nlet xx = argv.state as string;\nlet bLegislativeDistricts = argv.legislative as boolean;\nlet nDistricts = argv.n as number;\nlet planByGeoID = readPlanCSV(argv.plan as string);\nlet graph = readJSON(argv.graph as string);\nlet data = readJSON(argv.data as string) as T.GeoFeatureCollection;\nlet counties = readJSON(argv.counties as string) as T.GeoFeatureCollection;\n\nlet shapes = readJSON(argv.shapes as string) as T.GeoFeatureCollection;\nlet bEmpty = argv.empty as boolean;\n\nlet suites = argv.suites as [];\n\n// Some default dataset keys\nlet datasetKeys = {\n SHAPES: \"2010_VD\",\n CENSUS: \"D16F\",\n VAP: \"D16T\",\n ELECTION: \"E16GPR\"\n} as D.DatasetKeys;\n\nlet datasetDescriptions = {\n SHAPES: \"2010 Voting Districts\",\n CENSUS: \"2016 ACS Total Population\",\n VAP: \"2016 ACS Voting Age Population\",\n ELECTION: \"2016 Presidential Election\",\n}\n\n// Session settings are required:\n// - Analytics suites can be defaulted to all with [], but\n// - Datasets must be explicitly specified\nlet sessionSettings = {\n 'suites': suites,\n 'datasets': datasetKeys,\n 'descriptions': datasetDescriptions\n} as T.Dict;\n\nlet bLog = argv.verbose as boolean;\n\n// Invert the plan, so you can create the district shapes for the SessionRequest.\n// NOTE - The plan here is complete (all features assigned).\nlet planByDistrictID = D.invertPlan(planByGeoID);\n\n\n// SIMULATE THE HOST\n\n// 1 - Create district shapes & extract properties (area, diameter, perimeter)\n\nconst polyOptions = {\n noLatitudeCorrection: false\n}\n\n// Index the shapes by geoID\nlet shapesByGeoID: T.GeoFeatureMap = {};\nlet idStr = \"GEOID\";\n\n// TODO - Terry: But sometimes \"GEOID10\" hasn't been set to \"GEOID\"\nlet firstFeature = shapes.features[0];\nif (!(firstFeature.properties == null)) {\n if (U.keyExists(\"GEOID10\", firstFeature.properties)) idStr = \"GEOID10\";\n}\n\nfor (let f of shapes.features) {\n if (!(f.properties == null)) {\n // let idStr = \"GEOID\";\n // TODO - Terry: Sometimes \"GEOID10\" hasn't been => to \"GEOID!\"\n // if (U.keyExists(\"GEOID10\", f.properties)) idStr = \"GEOID10\";\n let geoID = f.properties[idStr];\n shapesByGeoID[geoID] = f;\n }\n}\n\n// Find the smallest Feature\n// COPIED from dra-client/geodistrict.ts, and lightly modified\nlet geo = shapes;\nlet minFeatureArea = Poly.polyArea(geo.features[0], polyOptions);\nfor (let i = 1; i < geo.features.length; i++) {\n let a = Poly.polyArea(geo.features[i], polyOptions);\n if (a < minFeatureArea) minFeatureArea = a;\n}\n\n// Eliminate anomalous holes\n// COPIED from dra-client/geodistrict.ts, and lightly modified\n// This is a bit of a hack in the sense that it is still an open question as to whether this is a problem\n// with either the underlying shape data or a problem in our simplification of that shape data.\n// But in any case, what this does is eliminate any holes that are smaller than the smallest feature. Such\n// a hole must be an anomaly. CA/2010_VT in particular seems to have many such issues.\n\nfunction eliminateAnomalousHoles(mp: any): void {\n // Normalize to multipolygon\n if (U.depthof(mp) == 4) mp = [mp];\n\n for (let i: number = 0; i < mp.length; i++) {\n let p: any = mp[i];\n let cleanp: any[] = [p[0]];\n for (let j: number = 1; j < p.length; j++) {\n let a = Poly.polyArea(p[j], polyOptions);\n if (a >= minFeatureArea)\n cleanp.push(p[j]);\n }\n if (cleanp.length < p.length)\n mp[i] = cleanp;\n }\n}\n\n// Create district shapes\nlet districtShapes = {} as T.GeoFeatureCollection;\ndistrictShapes['type'] = \"FeatureCollection\";\ndistrictShapes['features'] = [] as T.GeoFeatureArray;\n\nfor (let districtID = 1; districtID <= nDistricts; districtID++) {\n let districtFeatures: T.GeoFeatureArray = [];\n\n // If the district is not empty, collect its Features\n // TODO - Should we generate degenerate shape, if a district is empty?\n if (planByDistrictID[districtID]) {\n planByDistrictID[districtID].forEach(function (geoID: string): void {\n districtFeatures.push(shapesByGeoID[geoID]);\n });\n\n // Union them together\n let poly1Coordinates: any = Poly.polyNormalize(districtFeatures[0], polyOptions);\n let polyNCoordinates = districtFeatures.slice(1).map((i) => Poly.polyNormalize(i, polyOptions));\n let poly = addToPoly(poly1Coordinates, polyNCoordinates);\n\n // Convert the result to a Feature\n let bPolygon: boolean = U.depthof(poly) == 4;\n if (!bPolygon && poly.length == 1) {\n bPolygon = true;\n poly = poly[0];\n }\n\n eliminateAnomalousHoles(poly);\n\n let f: any = {\n type: 'Feature',\n properties: { districtID: `${districtID}` },\n geometry: {\n type: bPolygon ? 'Polygon' : 'MultiPolygon',\n coordinates: poly\n }\n };\n districtShapes.features.push(f);\n } // End non-empty districts\n}\n\n// CONSTRUCT A SESSION REQUEST\n\nlet SessionRequest = {} as T.SessionRequest;\n\nSessionRequest['title'] = \"CLI Test\";\nSessionRequest['stateXX'] = xx;\nSessionRequest['nDistricts'] = nDistricts;\nSessionRequest['legislativeDistricts'] = bLegislativeDistricts;\nSessionRequest['data'] = data;\nSessionRequest['counties'] = counties;\nSessionRequest['graph'] = graph;\nSessionRequest['plan'] = planByGeoID;\nSessionRequest['districtShapes'] = districtShapes;\nSessionRequest['config'] = sessionSettings;\n\n// CREATE AND INITIALIZE AN ANALYTICS SESSION\n\nlet s = new AnalyticsSession(SessionRequest);\n\n\n// DISPATCH TO REQUESTED COMMAND W/ NEEDED SCAFFOLDING\nlet t: T.TestEntry;\n// let text: any;\n\nswitch (command) {\n case 'valid': {\n doPreprocessData(s);\n if (bEmpty) {\n // Make one random district empty\n let randomDistrict = Math.floor(Math.random() * s.state.nDistricts) + 1;\n let reassignFeatures = s.plan._planByDistrictID[randomDistrict];\n s.plan._planByDistrictID[S.NOT_ASSIGNED] = reassignFeatures;\n s.plan.initializeDistrict(randomDistrict);\n }\n doAnalyzeDistricts(s);\n\n let t1 = doIsComplete(s);\n let t2 = doIsContiguous(s);\n let t3 = doIsFreeOfHoles(s);\n let t4 = doPopulationDeviation(s);\n let t5 = doHasEqualPopulations(s);\n\n doAnalyzePostProcessing(s);\n\n echoTestResult(\"Complete:\", t1);\n echoTestResult(\"Contiguous:\", t2);\n echoTestResult(\"Free of holes:\", t3);\n echoTestResult(\"Population deviation (%):\", t4);\n echoTestResult(\"Equal populations:\", t5);\n\n break;\n }\n case 'equal': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n t = doPopulationDeviation(s);\n echoTestResult(\"Population deviation (%):\", t);\n\n doAnalyzePostProcessing(s);\n break;\n }\n case 'compact': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n let t1 = doReock(s, bLog);\n let t2 = doPolsbyPopper(s, bLog);\n\n doAnalyzePostProcessing(s);\n\n echoTestResult(\"Reock:\", t1);\n echoTestResult(\"Polsby-Popper:\", t2);\n\n break;\n }\n case 'cohesive': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n // NOTE - SPLITTING\n let t1 = doFindCountiesSplitUnexpectedly(s);\n let t2 = doFindSplitVTDs(s);\n let t3 = doCountySplitting(s);\n let t4 = doDistrictSplitting(s);\n\n doAnalyzePostProcessing(s);\n\n echoTestResult(\"Counties split unexpectedly:\", t1);\n echoTestResult(\"Split VTDs:\", t2);\n echoTestResult(\"County splitting:\", t3);\n echoTestResult(\"District splitting:\", t4);\n\n break;\n }\n case 'political': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n let t1 = doSeatsBias(s);\n let t2 = doVotesBias(s);\n let t3 = doResponsiveness(s);\n let t4 = doResponsiveDistricts(s);\n let t5 = doEfficiencyGap(s);\n\n doAnalyzePostProcessing(s);\n\n // echoTestResult(\"Seats Bias:\", t1); TODO\n // echoTestResult(\"Votes Bias:\", t2); TODO\n // echoTestResult(\"Responsiveness:\", t3); TODO\n // echoTestResult(\"Responsive Districts:\", t4); TODO\n echoTestResult(\"Efficiency gap (%):\", t5);\n\n break;\n }\n case 'minority': {\n doPreprocessData(s);\n doAnalyzeDistricts(s);\n\n let t1 = doMajorityMinorityDistricts(s);\n\n doAnalyzePostProcessing(s);\n\n // echoTestResult(\"Majority-Minority Districts:\", t1); TODO\n\n break;\n }\n\n // TODO - DASHBOARD: Print the structures out\n case 'analyze': {\n s.analyzePlan(bLog);\n let planAnalytics = s.getPlanAnalytics(bLog);\n let districtStatistics = s.getDistrictStatistics(bLog);\n\n echoPlanAnalytics(planAnalytics);\n echoDistrictStatistics(districtStatistics);\n\n break;\n }\n}\n\nconsole.log(\"Ending command @ \", new Date());\n\n\n// HELPER FUNCTIONS FOR ECHOING RESULTS\n\nfunction echoTestResult(test: string, t: T.TestEntry): void {\n console.log(\"\");\n console.log(\"Test:\", test);\n console.log(\"Score:\", t['score']);\n\n let keys = U.getObjectKeys(t['details']);\n\n if (keys.length > 0) {\n console.log(\"Details:\");\n for (let i in keys) {\n let key = keys[i];\n console.log(\"-\", key, \"=\", t['details'][key]);\n }\n }\n\n console.log(\"___\");\n}\n\n// Prepare the items in a list for rendering\nfunction prepareListItems(list: any[]): string {\n if (U.isArrayEmpty(list)) {\n return \"\";\n }\n else {\n let nItems = list.length;\n let listStr: string;\n\n switch (nItems) {\n case 1: {\n listStr = list[0];\n break;\n }\n case 2: {\n listStr = list[0] + \" and \" + list[1];\n break;\n }\n default: {\n let listWithCommas = list.join(', ');\n let lastCommaIndex = listWithCommas.length - ((list[list.length - 1].length) + 1);\n let beforeAnd = listWithCommas.substr(0, lastCommaIndex);\n let afterAnd = listWithCommas.substr(lastCommaIndex + 1);\n listStr = beforeAnd + \" and \" + afterAnd;\n break;\n }\n }\n return listStr;\n }\n}\n\nfunction formatNumber(n: number): string {\n let p = S.PRECISION;\n\n return n.toLocaleString('en-US', { minimumFractionDigits: p, maximumFractionDigits: p });\n}\n\nfunction echoPlanAnalytics(pa: PlanAnalytics): void {\n console.log(\"Plan Analytics:\");\n console.log(\"\");\n\n console.log(\"Requirements:\");\n console.log(\"* Score:\", pa.requirements.score);\n console.log(\"* Metrics:\");\n console.log(\" - Complete:\", pa.requirements.metrics.complete);\n console.log(\" - Contiguous:\", pa.requirements.metrics.contiguous);\n console.log(\" - Free of holes:\", pa.requirements.metrics.freeOfHoles);\n console.log(\" - Equal population:\", pa.requirements.metrics.equalPopulation);\n console.log(\"* Details:\");\n console.log(\" - Empty districts:\", prepareListItems(pa.requirements.details.emptyDistricts));\n console.log(\" - Unassigned features:\", prepareListItems(pa.requirements.details.unassignedFeatures));\n console.log(\" - Population deviation:\", pa.requirements.details.populationDeviation);\n console.log(\" - Deviation threshold:\", pa.requirements.details.deviationThreshold);\n console.log(\" - Discontiguous districts:\", prepareListItems(pa.requirements.details.discontiguousDistricts));\n console.log(\" - Embedded districts:\", prepareListItems(pa.requirements.details.embeddedDistricts));\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.requirements.datasets.shapes);\n console.log(\"- Census:\", pa.requirements.datasets.census);\n console.log(\"- VAP:\", pa.requirements.datasets.vap);\n console.log(\"- Election:\", pa.requirements.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- State requirements:\", pa.requirements.resources.stateReqs);\n console.log(\"\");\n\n console.log(\"Compactness:\");\n console.log(\"* Score:\", pa.compactness.score);\n console.log(\"* Metrics:\");\n console.log(\" - Reock:\", pa.compactness.metrics.reock);\n console.log(\" - Polsby-Popper:\", pa.compactness.metrics.polsby);\n console.log(\"* Details:\");\n console.log(\" - N/A\");\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.compactness.datasets.shapes);\n console.log(\"- Census:\", pa.compactness.datasets.census);\n console.log(\"- VAP:\", pa.compactness.datasets.vap);\n console.log(\"- Election:\", pa.compactness.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n\n console.log(\"Splitting:\");\n console.log(\"* Score:\", pa.splitting.score);\n console.log(\"* Metrics:\");\n console.log(\" - sqEnt_DCreduced:\", pa.splitting.metrics.sqEnt_DCreduced);\n console.log(\" - sqEnt_CDreduced:\", pa.splitting.metrics.sqEnt_CDreduced);\n console.log(\"* Details:\");\n console.log(\" - countiesSplitUnexpectedly:\", prepareListItems(pa.splitting.details.countiesSplitUnexpectedly));\n console.log(\" - unexpectedAffected:\", pa.splitting.details.unexpectedAffected);\n console.log(\" - splitVTDs:\", pa.splitting.details.splitVTDs);\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.splitting.datasets.shapes);\n console.log(\"- Census:\", pa.splitting.datasets.census);\n console.log(\"- VAP:\", pa.splitting.datasets.vap);\n console.log(\"- Election:\", pa.splitting.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n\n console.log(\"Partisan:\");\n console.log(\"* Score:\", pa.partisan.score);\n console.log(\"* Metrics:\");\n console.log(\" - sqEnt_DCreduced:\", pa.partisan.metrics.partisanBias);\n console.log(\" - sqEnt_CDreduced:\", pa.partisan.metrics.responsiveness);\n console.log(\"* Details:\");\n console.log(\" - N/A\");\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.partisan.datasets.shapes);\n console.log(\"- Census:\", pa.partisan.datasets.census);\n console.log(\"- VAP:\", pa.partisan.datasets.vap);\n console.log(\"- Election:\", pa.partisan.datasets.election);\n console.log(\"* Resources:\");\n console.log(\" - Plan Score:\", pa.partisan.resources.planScore);\n console.log(\"\");\n\n console.log(\"Minority:\");\n console.log(\"* Score:\", pa.minority.score);\n console.log(\"* Metrics:\");\n console.log(\" - nBlack37to50:\", pa.minority.metrics.nBlack37to50);\n console.log(\" - nBlackMajority:\", pa.minority.metrics.nBlackMajority);\n console.log(\" - nHispanic37to50:\", pa.minority.metrics.nHispanic37to50);\n console.log(\" - nHispanicMajority:\", pa.minority.metrics.nHispanicMajority);\n console.log(\" - nPacific37to50:\", pa.minority.metrics.nPacific37to50);\n console.log(\" - nPacificMajority:\", pa.minority.metrics.nPacificMajority);\n console.log(\" - nAsian37to50:\", pa.minority.metrics.nAsian37to50);\n console.log(\" - nAsianMajority:\", pa.minority.metrics.nAsianMajority);\n console.log(\" - nNative37to50:\", pa.minority.metrics.nNative37to50);\n console.log(\" - nNativeMajority:\", pa.minority.metrics.nNativeMajority);\n console.log(\" - nMinority37to50:\", pa.minority.metrics.nMinority37to50);\n console.log(\" - nMinorityMajority:\", pa.minority.metrics.nMinorityMajority);\n console.log(\"* Details:\");\n console.log(\" - VAP:\", pa.minority.details.vap);\n console.log(\" - comboCategoroes:\", pa.minority.details.comboCategories);\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", pa.minority.datasets.shapes);\n console.log(\"- Census:\", pa.minority.datasets.census);\n console.log(\"- VAP:\", pa.minority.datasets.vap);\n console.log(\"- Election:\", pa.minority.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n}\n\nexport function echoDistrictStatistics(ds: DistrictStatistics): void {\n console.log(\"District Statistics:\");\n for (let row of ds.table) {\n let DistrictID = row[DistrictColumn.DistrictID];\n let TotalPop = row[DistrictColumn.TotalPop];\n let PopDevPct = row[DistrictColumn.PopDevPct];\n let bEqualPop = row[DistrictColumn.bEqualPop];\n let bNotEmpty = row[DistrictColumn.bNotEmpty];\n let bContiguous = row[DistrictColumn.bContiguous];\n let bNotEmbedded = row[DistrictColumn.bNotEmbedded];\n let DemPct = row[DistrictColumn.DemPct];\n let RepPct = row[DistrictColumn.RepPct];\n let WhitePct = row[DistrictColumn.WhitePct];\n let MinorityPct = row[DistrictColumn.MinorityPct];\n let BlackPct = row[DistrictColumn.BlackPct];\n let HispanicPct = row[DistrictColumn.HispanicPct];\n let PacificPct = row[DistrictColumn.PacificPct];\n let AsianPct = row[DistrictColumn.AsianPct];\n let NativePct = row[DistrictColumn.NativePct];\n console.log(\n DistrictID,\n formatNumber(TotalPop),\n formatNumber(PopDevPct),\n bEqualPop,\n bNotEmpty,\n bContiguous,\n bNotEmbedded,\n formatNumber(DemPct),\n formatNumber(RepPct),\n formatNumber(WhitePct),\n formatNumber(MinorityPct),\n formatNumber(BlackPct),\n formatNumber(HispanicPct),\n formatNumber(PacificPct),\n formatNumber(AsianPct),\n formatNumber(NativePct)\n );\n }\n console.log(\"\");\n console.log(\"* Details:\");\n console.log(\" - N/A\");\n console.log(\"* Datasets:\");\n console.log(\"- Shapes:\", ds.datasets.shapes);\n console.log(\"- Census:\", ds.datasets.census);\n console.log(\"- VAP:\", ds.datasets.vap);\n console.log(\"- Election:\", ds.datasets.election);\n console.log(\"* Resources:\");\n console.log(\"- N/A\");\n console.log(\"\");\n\n}\n\n\n// HELPERS TO LOAD SAMPLE DATA FROM DISK\n\n// A clone of 'carefulRead' in DRA-CLI\nexport function readJSONcareful(file: string): any {\n try {\n let s: string = fs.readFileSync(file, 'utf8');\n let o: any = JSON.parse(s);\n return o;\n }\n catch (err) {\n console.log(\"Error reading JSON file ...\");\n return null;\n }\n}\n\nexport function readJSON(file: string): any {\n let fullPath: string;\n if (path.isAbsolute(file)) {\n fullPath = file;\n }\n else {\n fullPath = path.resolve(file);\n }\n\n return readJSONcareful(fullPath);\n}\n\n// Following the clone above, except for CSV, using the csv-parse/sync API\nexport function readCSV(file: string): any {\n try {\n let input: string = fs.readFileSync(file, 'utf8');\n let dictRows: any = parse(input, {\n columns: true,\n skip_empty_lines: true\n });\n return dictRows;\n }\n catch (err) {\n console.log(\"Error reading CSV file ...\");\n return null;\n }\n}\n\n// Read a plan from a .csv file\nexport function readPlanCSV(file: string): T.PlanByGeoID {\n var plan = {} as T.PlanByGeoID;\n\n let fullPath: string;\n if (path.isAbsolute(file)) {\n fullPath = file;\n }\n else {\n fullPath = path.resolve(file);\n }\n\n var csvArray: any = readCSV(fullPath);\n\n for (let dictRow of csvArray) {\n let geoID: string = dictRow['GEOID'];\n let districtID: number = Number(dictRow['DISTRICT']);\n\n plan[geoID] = districtID;\n }\n\n return plan;\n}\n\n\n// END\n","module.exports = require(\"assert\");","module.exports = require(\"fs\");","module.exports = require(\"path\");","module.exports = require(\"stream\");","module.exports = require(\"yargs\");"],"sourceRoot":""}