| 'use strict' | 
|   | 
| /* const FIGURE = { | 
|   INTERIOR_RING: 0x00, | 
|   STROKE: 0x01, | 
|   EXTERIOR_RING: 0x02 | 
| }; | 
|   | 
| const FIGURE_V2 = { | 
|   POINT: 0x00, | 
|   LINE: 0x01, | 
|   ARC: 0x02, | 
|   COMPOSITE_CURVE: 0x03 | 
| }; | 
|   | 
| const SHAPE = { | 
|   POINT: 0x01, | 
|   LINESTRING: 0x02, | 
|   POLYGON: 0x03, | 
|   MULTIPOINT: 0x04, | 
|   MULTILINESTRING: 0x05, | 
|   MULTIPOLYGON: 0x06, | 
|   GEOMETRY_COLLECTION: 0x07 | 
| }; | 
|   | 
| const SHAPE_V2 = { | 
|   POINT: 0x01, | 
|   LINESTRING: 0x02, | 
|   POLYGON: 0x03, | 
|   MULTIPOINT: 0x04, | 
|   MULTILINESTRING: 0x05, | 
|   MULTIPOLYGON: 0x06, | 
|   GEOMETRY_COLLECTION: 0x07, | 
|   CIRCULAR_STRING: 0x08, | 
|   COMPOUND_CURVE: 0x09, | 
|   CURVE_POLYGON: 0x0A, | 
|   FULL_GLOBE: 0x0B | 
| }; | 
|   | 
| const SEGMENT = { | 
|   LINE: 0x00, | 
|   ARC: 0x01, | 
|   FIRST_LINE: 0x02, | 
|   FIRST_ARC: 0x03 | 
| }; */ | 
|   | 
| class Point { | 
|   constructor () { | 
|     this.x = 0 | 
|     this.y = 0 | 
|     this.z = null | 
|     this.m = null | 
|   } | 
| } | 
|   | 
| const parsePoints = (buffer, count) => { | 
|   // s2.1.5 + s2.1.6 | 
|   | 
|   const points = [] | 
|   if (count < 1) { | 
|     return points | 
|   } | 
|   | 
|   for (let i = 1; i <= count; i++) { | 
|     const point = new Point() | 
|     points.push(point) | 
|     point.x = buffer.readDoubleLE(buffer.position) | 
|     point.y = buffer.readDoubleLE(buffer.position + 8) | 
|     buffer.position += 16 | 
|   } | 
|   | 
|   return points | 
| } | 
|   | 
| const parseZ = (buffer, points) => { | 
|   // s2.1.1 + s.2.1.2 | 
|   | 
|   if (points < 1) { | 
|     return | 
|   } | 
|   | 
|   points.forEach(point => { | 
|     point.z = buffer.readDoubleLE(buffer.position) | 
|     buffer.position += 8 | 
|   }) | 
| } | 
|   | 
| const parseM = (buffer, points) => { | 
|   // s2.1.1 + s.2.1.2 | 
|   | 
|   if (points < 1) { | 
|     return | 
|   } | 
|   | 
|   points.forEach(point => { | 
|     point.m = buffer.readDoubleLE(buffer.position) | 
|     buffer.position += 8 | 
|   }) | 
| } | 
|   | 
| const parseFigures = (buffer, count, properties) => { | 
|   // s2.1.3 | 
|   | 
|   const figures = [] | 
|   if (count < 1) { | 
|     return figures | 
|   } | 
|   | 
|   if (properties.P) { | 
|     figures.push({ | 
|       attribute: 0x01, | 
|       pointOffset: 0 | 
|     }) | 
|   } else if (properties.L) { | 
|     figures.push({ | 
|       attribute: 0x01, | 
|       pointOffset: 0 | 
|     }) | 
|   } else { | 
|     for (let i = 1; i <= count; i++) { | 
|       figures.push({ | 
|         attribute: buffer.readUInt8(buffer.position), | 
|         pointOffset: buffer.readInt32LE(buffer.position + 1) | 
|       }) | 
|   | 
|       buffer.position += 5 | 
|     } | 
|   } | 
|   | 
|   return figures | 
| } | 
|   | 
| const parseShapes = (buffer, count, properties) => { | 
|   // s2.1.4 | 
|   | 
|   const shapes = [] | 
|   if (count < 1) { | 
|     return shapes | 
|   } | 
|   | 
|   if (properties.P) { | 
|     shapes.push({ | 
|       parentOffset: -1, | 
|       figureOffset: 0, | 
|       type: 0x01 | 
|     }) | 
|   } else if (properties.L) { | 
|     shapes.push({ | 
|       parentOffset: -1, | 
|       figureOffset: 0, | 
|       type: 0x02 | 
|     }) | 
|   } else { | 
|     for (let i = 1; i <= count; i++) { | 
|       shapes.push({ | 
|         parentOffset: buffer.readInt32LE(buffer.position), | 
|         figureOffset: buffer.readInt32LE(buffer.position + 4), | 
|         type: buffer.readUInt8(buffer.position + 8) | 
|       }) | 
|   | 
|       buffer.position += 9 | 
|     } | 
|   } | 
|   | 
|   return shapes | 
| } | 
|   | 
| const parseSegments = (buffer, count) => { | 
|   // s2.1.7 | 
|   | 
|   const segments = [] | 
|   if (count < 1) { | 
|     return segments | 
|   } | 
|   | 
|   for (let i = 1; i <= count; i++) { | 
|     segments.push({ | 
|       type: buffer.readUInt8(buffer.position)}) | 
|   | 
|     buffer.position++ | 
|   } | 
|   | 
|   return segments | 
| } | 
|   | 
| const parseGeography = buffer => { | 
|   // s2.1.1 + s.2.1.2 | 
|   | 
|   const srid = buffer.readInt32LE(0) | 
|   if (srid === -1) { | 
|     return null | 
|   } | 
|   | 
|   const value = { | 
|     srid, | 
|     version: buffer.readUInt8(4) | 
|   } | 
|   | 
|   const flags = buffer.readUInt8(5) | 
|   buffer.position = 6 | 
|   | 
|   // console.log("srid", srid) | 
|   // console.log("version", version) | 
|   | 
|   const properties = { | 
|     Z: (flags & (1 << 0)) > 0, | 
|     M: (flags & (1 << 1)) > 0, | 
|     V: (flags & (1 << 2)) > 0, | 
|     P: (flags & (1 << 3)) > 0, | 
|     L: (flags & (1 << 4)) > 0 | 
|   } | 
|   | 
|   if (value.version === 2) { | 
|     properties.H = (flags & (1 << 3)) > 0 | 
|   } | 
|   | 
|   // console.log("properties", properties); | 
|   | 
|   let numberOfPoints | 
|   if (properties.P) { | 
|     numberOfPoints = 1 | 
|   } else if (properties.L) { | 
|     numberOfPoints = 2 | 
|   } else { | 
|     numberOfPoints = buffer.readUInt32LE(buffer.position) | 
|     buffer.position += 4 | 
|   } | 
|   | 
|   // console.log("numberOfPoints", numberOfPoints) | 
|   | 
|   value.points = parsePoints(buffer, numberOfPoints) | 
|   | 
|   if (properties.Z) { | 
|     parseZ(buffer, value.points) | 
|   } | 
|   | 
|   if (properties.M) { | 
|     parseM(buffer, value.points) | 
|   } | 
|   | 
|   // console.log("points", points) | 
|   | 
|   let numberOfFigures | 
|   if (properties.P) { | 
|     numberOfFigures = 1 | 
|   } else if (properties.L) { | 
|     numberOfFigures = 1 | 
|   } else { | 
|     numberOfFigures = buffer.readUInt32LE(buffer.position) | 
|     buffer.position += 4 | 
|   } | 
|   | 
|   // console.log("numberOfFigures", numberOfFigures) | 
|   | 
|   value.figures = parseFigures(buffer, numberOfFigures, properties) | 
|   | 
|   // console.log("figures", figures) | 
|   | 
|   let numberOfShapes | 
|   if (properties.P) { | 
|     numberOfShapes = 1 | 
|   } else if (properties.L) { | 
|     numberOfShapes = 1 | 
|   } else { | 
|     numberOfShapes = buffer.readUInt32LE(buffer.position) | 
|     buffer.position += 4 | 
|   } | 
|   | 
|   // console.log("numberOfShapes", numberOfShapes) | 
|   | 
|   value.shapes = parseShapes(buffer, numberOfShapes, properties) | 
|   | 
|   // console.log( "shapes", shapes) | 
|   | 
|   if (value.version === 2) { | 
|     const numberOfSegments = buffer.readUInt32LE(buffer.position) | 
|     buffer.position += 4 | 
|   | 
|     // console.log("numberOfSegments", numberOfSegments) | 
|   | 
|     value.segments = parseSegments(buffer, numberOfSegments) | 
|   | 
|     // console.log("segments", segments) | 
|   } else { | 
|     value.segments = [] | 
|   } | 
|   | 
|   return value | 
| } | 
|   | 
| module.exports.PARSERS = { | 
|   geography (buffer) { | 
|     return parseGeography(buffer) | 
|   }, | 
|   | 
|   geometry (buffer) { | 
|     return parseGeography(buffer) | 
|   } | 
| } |